mysql索引淺談
索引的作用:
提高數據檢索效率
提高聚合函數效率
提高排序效率
個別時候可以避免回表
減少多表關聯時掃描行數
主鍵、唯一索引可以作為約束
列定義為DEFAULT NULL時,NULL值也會有索引,存放在索引樹的最前端部分
mysql 支持的索引:
普通索引:create index idx_xxx on tb(xxx) alter table tb add index idx_xxx(xxx)
包括前綴索引 alter table yw add indx idx_c6_6(c6(6)) 減少一下索引的長度,讓掃起來更省點IO
在普通索引的列是可以NULL 索引不會包含有NULL值的列找
唯一索引:是一種約束,要求字段是唯一的。 唯一索引列可以允許有NULL,但只能有一個
主鍵索引:Innodb里聚集key,所有的數據以主建排序存儲
組合索引:
全文索引:
什么情況不適用索引:
通過索引掃描的記錄數超過30%,變成全表掃描
聯合索引中,第一個索引列使用范圍查詢
聯合索引中,第一個查詢條件不是最左索引列
模糊查詢條件列最左以通配符 % 開始
內存表(HEAP 表)使用HASH索引時,使用范圍檢索或者ORDER BY
兩個獨立索引,其中一個用于檢索,一個用于排序
使用了不同的 ORDER BY 和 GROUP BY 表達式
兩個表關聯字段類型不一樣(也包括長度不一樣),5.1開始的版本已經不復存在了
復雜關聯SQL的優化原則
查詢所返回的結果集,通常查詢返回的結果集很少的,就比較容易優化;驅動表的選擇至關重要,通過查看執行計劃,可以看到優化器選擇的驅動表,從執行計劃中的rows可以大致反映出問題的所在;
理清各表之間的關聯關系,注意關聯字段上是否有合適的索引;
使用straight_join關鍵詞來強制表之間的關聯順序,可以方便我們驗證某些猜想;
DISABLE/ENABLE KEYS的作用
只對MyISAM表有效
導入大量數據之前,禁用索引
加速數據導入效率
導入完成后,再啟用索引
MySQL不支持函數索引、運算
索引列上使用函數后,無法使用索引,可能導致全表掃描
索引列上不能附加運算表達式,否則也無法使用索引
RAND()優化
指導思想:從MySQL數據庫中隨機取一條或者N條記錄時,最好把RAND()生成隨機數放在JOIN子查詢中以提高效率。
SELECT id FROM table ORDER BY RAND() LIMIT n;
=>優化
SELECT id FROM table t1 JOIN (SELECT RAND() * (SELECT MAX(id) FROM table) AS nid) t2 ON t1.id > t2.nid LIMIT n;
范圍查詢:>、<、>=、<=、BETWEEN
等值查詢:= in
由于時間有限,亂七八糟的說了這么多也沒有一個實例木有說服力。但是請大家記住:
MySQL優化的核心秘訣:核心概念: 減少IO(能不能用順序IO)
實際行動: 控制結果集大小,爭取1秒完成
個人建議就不要用myisam:
1.myisqm : CPU利用,只能用到一核
2.內存: 只能緩存索引,最多只有用到4個G
3.表級鎖, 容易出現表crash