Mysql索引不生效場景總結

key(name,age,pos)

1.  跳過列,where a = 1 and c = 3,最多用到索引列a;where b = 2 and c = 3,一個也用不到,必須從最左列開始
2.  前面是範圍查詢,where a = 1 and b > 2 and c = 3,最多用到 a, b兩個索引列;
3. 順序顛倒,where c = 3 and b = 2 and a = 1,一個也用不到;
4. 索引列上使用了表達式,如where substr(a, 1, 3) = 'hhh',where a = a + 1,表達式是一大忌諱,再簡單mysql也不認。有時數據量不是大到嚴重影響速度時,一般可以先查出來,比如先查所有有訂單記錄的數據,再在程序中去篩選以'cp1001'開頭的訂單,而不是寫sql過濾它;
5. 模糊匹配時,like '%a'
6. 如果 MySQL 估計使用索引比全表掃描更慢,則不使用索引。例如如果列key_part1 均勻分佈在 1 和 100 之間,下列查詢中使用索引就不是很好:SELECT * FROM table_name where key_part1 > 1 and key_part1 < 90;
7. 用 or 分割開的條件,如果 or 前的條件中的列有索引,而後面的列中沒有索引,那麼涉及到的索引都不會被用到 
8. 如果列類型是字符串,那麼一定記得在 where 條件中把字符常量值用引號引起來,否則的話即便這個列上有索引,MySQL 也不會用到的,因爲,MySQL 默認把輸入的常量值進行轉換以後才進行檢索。如下面的例子中 company2 表中的 name字段是字符型的,但是 SQL 語句中的條件值 294 是一個數值型值,因此即便在 name 上有索引,MySQL 也不能正確地用上索引,而是繼續進行全表掃描;explain select * from company2 where name = 294\G; explain select * from company2 where name = '294'
9. 查看索引使用情況 show status like 'Handler_read%'; 
10. show status like 'Com_%'; Com_select:執行 select 操作的次數,一次查詢只累加 1。Com_insert:執行 INSERT 操作的次數,對於批量插入的 INSERT 操作,只累加一次。Com_update:執行 UPDATE 操作的次數。Com_delete:執行 DELETE 操作的次數。 
11. Innodb_rows_read:select 查詢返回的行數。Innodb_rows_inserted:執行 INSERT 操作插入的行數。Innodb_rows_updated:執行 UPDATE 操作更新的行數。Innodb_rows_deleted:執行 DELETE 操作刪除的行數。 
12. Connections:試圖連接 MySQL 服務器的次數。Uptime:服務器工作時間。Slow_queries:慢查詢的次數 
13. show processlist 命令查看當前 MySQL 在進行的線程,包括線程的狀態、是否鎖表等,可以實時地查看 SQL 的執行情況,同時對一些鎖表操作進行優化。
14. 查看索引使用情況:show status like 'Handler_read%';
15. 定期分析和檢查表,如果感覺分析表:本語句用於分析和存儲表的關鍵字分佈,分析的結果將可以使得系統得到準確的統計信息,使得 SQL 能夠生成正確的執行計劃。如果用戶感覺實際執行計劃並不是預期的執行計劃,執行一次分析表可能會解決問題。 檢查表:可以檢查表或視圖是否由錯誤(表刪除之後,視圖可能仍然存在);優化表:如果已經刪除了表的一大部分,或者如果已經對含有可變長度行的表(含有 VARCHAR、BLOB 或 TEXT 列的表)進行了很多更改,則應使用 OPTIMIZE TABLE 命令來進行表優化。 ANALYZE、CHECK、OPTIMIZE 執行期間將對錶進行鎖定,因此一定注意要在數據庫不繁忙的時候執行相關的操作。 
16. show status like 'Handler_read%';  查看'Handler_read_key ' 和 'Handler_read_rnd_next' 兩個值的大小來評判索引效果是否明顯;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章