1. 程式人生 > >MySQL優化(二) 優化訣竅

MySQL優化(二) 優化訣竅

效率比較 join nbsp 開頭 ble 使用 show tro 多列

索引的使用

(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優化(二) 優化訣竅