MySQL優化(二) 優化訣竅
索引的使用
(1)查詢要使用索引最重要的條件是查詢條件中的字段建立了索引;
(2)下列幾種情況可能使用到索引:
<1> 對於創建的多列索引,只要查詢條件使用了最坐邊的列,索引一般就會被使用;
<2> 對於使用 like 的查詢,查詢如果是 “%aaa” 則不會使用到索引;如果是“aaa%”,則會使用到索引;
(3)下列的表將不會使用索引:
<1> 如果條件中有 OR,即使其中有條件的列建立了索引,也不會被使用;換而言之,就是所有使用的字段都要建立索引;盡量避免使用OR,效率比較低;
<2> 對於多列索引,不是使用的第一部分,則不會使用索引;
<3> like 查詢以 “%” 開頭;
<4> 如果列類型是字符串,那一定要在條件中將數據使用引號引起來,否則不使用索引;也就是列是字符串類型,就一定要
<5> 如果 MySql 估計使用全表掃描要比使用索引快,則不使用索引;
(4)查看索引的使用情況
Show status like ‘Handler_read%‘
Handler_read_key:這個值越高越好,表示使用索引查詢使用的次數;
Handler_read_rnd_next:這個值越高,說明查詢越低效;
(5)大批量插入數據(了解)
<1> 對於MyISAM:
alter table table_name disable keys; 關閉表的索引;如果在導入數據的時候不關閉就會一直在建立索引文件,使導入時間過長;導入完成之後再開啟表的索引就好了;
alter table table_name enable keys; 開啟表的索引
<2> 對於 Innodb:
將導入的數據按照主鍵排序;
set unique_checks = 0,關閉唯一性校驗,否則每條數據都會檢查;
set autocommit = 0,關閉自動提交;
(6)SQL語句優化的技巧
<1> 優化 Group by 語句
MySql 對所有的 group by col1, col2 進行分組查詢時,默認分組之後,然後進行排序,可能會降低查詢速度;
如果在查詢中使用 group by ,但是用戶想要避免排序造成的消耗,可以使用 order by null 來禁止排序;
即:select * from user group by age order by null;
<2> 有些情況下,可以使用連接來代替子查詢。因為使用 join ,MySql不需要再內存中創建臨時表。
select * from dept,employ where dept.deptno = employ.deptno; [簡單方式]
select * from dept left join employ on dept.deptno = employ.deptno; [左連外接,更好]
MySQL優化(二) 優化訣竅