下面的SQL索引失效【使用*或多了字段】:mysql
小表驅動大表:小的數據集驅動大的數據集sql
1.當B表的數據集必須小於A表的數據集時,用in優於exists select * from A where id in (select id from B) 等價 for select id from B for select *from A where A.id=B.id 2.當A表的數據集小於B表的數據集時,用exists優於in select *from A where exists (select 1 from B where B.id=A.id); 等價 for select *from A for select *from B where B.id=A.id
創建索引:key abc(a,b,c) order by使用索引最左前綴原則:(有序索引排序,using index) --order by a --order by a,b --order by a,b,c --order by a desc,b desc,c desc(升降序一致) 若是where使用索引的最左前綴定義爲常量,則使用索引且是有序索引排序(using index): --where a=const order by b,c --where a=const and b=const order by c --where a=const and b>const order by b,c 產生文件排序(using filesort): --order by b(非最左前綴) --order by b,a(順序顛倒) --order by a asc,b desc,c desc (排序不一致) --where d=const order by b,c (a丟失) --where a=const order by c(b丟失) --where a=const order by a,d(d不是索引的一部分) --where a in(..) order by b,c(範圍查詢)
在my.cnf文件中[mysqld]增長或修改參數: slow_query_log=1 slow_query_log_file=/文件存儲路徑/fileName.log【若沒有指定,系統默認給一個指定的文件host_name-slow.log】查看達到寫入慢查詢日誌的閥值:SHOW VARIABLES LIKE 'long_query_time%';【默認狀況下爲10秒,即查詢時間大於10秒的sql會記錄到日誌中】設置閥值:set global long_query_time=數值;【設置結束後須要新開一個會話或從新鏈接纔看見修改信息,或使用show global variables like 'long_query_time'查看】查看當前系統的慢查詢SQL總條數:show global status like '%Slow_queries%';