個人部落格
歡迎通路個人部落格: https://www.crystalblog.xyz/
備用位址: https://wang-qz.gitee.io/crystal-blog/
1. MySQL底層采用什麼資料結構
2. 為什麼MySQL的Innodb存儲引擎必須要有主鍵
3. 一條SQL語句查詢慢, 如何優化?
4. explain工具使用
5. Sql語句查詢如何避免回表查詢
6. 索引為何需要遵循最佳左側法則?
7. like不走索引如何優化?
8. 千萬級資料, 如何查詢優化?
9. 如何分表分庫? 分表分庫後如何查詢?
将一張大表的資料拆分成n張多子表資料存放. 那麼一張表最多存放多少條資料呢?
阿裡巴巴開發手冊規範:
單表行數超過500萬行或者單表容量超過2GB, 才推薦進行分表分庫.
如果預計三年後的資料量根本達不到這個級别, 請不要在建立表時就分表分庫.
分表分庫存在缺陷, 資料如何分攤存放?
方案1: 全局且唯一, 連續的ID, ID%分表總數, 這種方式存在後期難以擴容的問題.
優點: 保證資料分攤均勻存放. 分片的字段必須保證連續性.
缺點: 後期無法擴容
方案2: 業務ID按照日期字首生成, 按日期分表.(年,月,日)
按年分表, 會存在資料分布不均勻的問題. 可能2020年表隻有100萬, 2021年表有1000萬資料.
可以按月分表會合理一些.
方案3: 分段形式(ID分段存儲.), 支援無限擴容, 查詢效率非常高. 下面以User表為例, 以500萬資料進行分段:
查詢語句如果沒有帶上
分片字段
, 就會去查詢所有結構表的資料, 查詢語句需要帶上
分片字段
. 最好查詢條件帶上索引字段.
10. 分表分庫後如何分頁查詢?
每張表分頁查詢資料, 交給資料庫中間件(sharding-jdbc/mycat)整合後傳回Limit資料給用戶端.
sharding-jdbc
mycat