一張一億的訂單表,能夠分紅五張表,這樣每張表就只有兩千萬數據,分擔了原來一張表的壓力,分表須要根據某個條件進行分,這裏能夠根據地區來分表,須要一箇中間件來控制究竟是去哪張表去找到本身想要的數據。mysql
中間件:根據主表的自增 id 做爲中間件(什麼樣的字段適合作中間件?要具有惟一性)linux
怎麼分發?主表插入以後返回一個 id,根據這個 id 和表的數量進行取模,餘數是幾就往哪張表中插入數據。面試
注意:子表中的 id 要與主表的 id 保持一致redis
之後只有插入操做會用到主表,修改,刪除,讀取,均不須要用到主表sql
消息隊列的特色: 先進先出數據庫
把要執行的 sql 語句先保存在消息隊列中,而後依次按照順利異步插入的數據庫中緩存
應用: 新浪,把瞬間的評論先放入消息隊列,而後經過定時任務把消息隊列裏面的 sql 語句依次插入到數據庫中服務器
操做子表進行修改架構
這樣修改有一個問題,主表和子表的數據會出現不一致,如何讓主表和字表數據一致?併發
修改完成後將要修改主表的數據,存入 redis 隊列中
而後 linux 定時任務(contble)循環執行 redis 隊列中的 sql 語句,同步更新主表的內容
查詢只須要查詢子表,不要查詢總表
刪除,先根據 id 找到要刪除的子表,而後刪除,而後往消息隊列中壓入一條刪除總表數據的 sql 語句
而後執行定時任務刪除總表數據
定時任務:
分庫原理圖:
注意:操做完一個數據庫必定要把數據庫鏈接關閉,否則 mysql 會覺得一直鏈接的同一個數據庫
仍是取模肯定加載哪一個配置文件鏈接哪一個數據庫
原理同新增
原理相似
刪除
將數據放入緩存中,節省數據庫開銷,先去緩存中查,若是有直接取出,若是沒有,去數據庫查,而後存入緩存中
在編輯信息以後須要刪除緩存,否則一直讀取的是緩存的數據而不是修改過的數據
還有更多進階學習資料在這噢進階PHP月薪30k>>>架構師成長路線【視頻、面試文檔免費獲取】