MySQL 優化
- 表關聯查詢時務必遵循 小表驅動大表 原則;
- 使用查詢語句 where 條件時,不允許出現 函數,否則索引會失效;
- 使用單表查詢時,相同字段盡量不要用 OR,因為可能導致索引失效,可以使用 UNION 替代;
- LIKE 語句不允許使用 % 開頭,否則索引會失效;
- 組合索引一定要遵循 從左到右 原則,否則索引會失效;
- 索引不宜過多,根據實際情況決定,盡量不要超過 10 個;
- 每張表都必須有 主鍵,達到加快查詢效率的目的;
- 分表,可根據業務字段尾數中的個位或十位或百位(以此類推)做表名達到分表的目的;
- 分庫,可根據業務字段尾數中的個位或十位或百位(以此類推)做庫名達到分庫的目的;
- 表分區,類似於硬盤分區,可以將某個時間段的數據放在分區里,加快查詢速度,可以配合 分表 + 表分區 結合使用;
#神器 EXPLAIN 語句
EXPLAIN 顯示了 MySQL 如何使用索引來處理 SELECT 語句以及連接表。可以幫助選擇更好的索引和寫出更優化的查詢語句。
使用方法,在 SELECT 語句前加上 EXPLAIN 即可,如:
EXPLAIN SELECT * FROM tb_item WHERE cid IN (SELECT id FROM tb_item_cat)
- id: SELECT 識別符。這是 SELECT 的查詢序列號
- select_type: SELECT類型,可以為以下任何一種
- table: 輸出的行所引用的表
- partitions: 表分區
- type: 聯接類型。下面給出各種聯接類型,按照 從最佳類型到最壞類型 進行排序 system: 表僅有一行(=系統表)。這是 const 聯接類型的一個特例。
possible_keys:
- key: 顯示 MySQL 實際決定使用的鍵(索引)。如果沒有選擇索引, 鍵是 NULL。
- key_len: 顯示 MySQL 決定使用的鍵長度。如果鍵是 NULL, 則長度為 NULL。
- ref: 顯示使用哪個列或常數與 key 一起從表中選擇行。
- rows: 顯示 MySQL 認為它執行查詢時必須檢查的行數。多行之間的數據相乘可以估算要處理的行數。
- filtered: 顯示了通過條件過濾出的行數的百分比估計值。
- Extra: 該列包含 MySQL 解決查詢的詳細信息
-
指出 MySQL 能使用哪個索引在該表中找到行