常見的索引失效情況及SQL優化

1.使用組合索引時使用全值索引

2.使用組合索引時執行最左前綴法則

3.使用組合索引時範圍查詢後的查詢索引失效

4.不要在索引列上做運算操作,否則索引將失效

5.字符串不加單引號,造成索引失效

6.儘量使用覆蓋索引,避免select *

7.用or分割開的條件,如果or前的條件中的列有索引,而後邊的列沒有索引,那麼涉及的索引都不會被用到

8.以%開頭的模糊查詢索引將失效,可用覆蓋索引解決此問題

9.如果mysql評估使用索引比全表更慢,則不適用索引

10.is null ,is not null   有時會導致索引失效

11.in走索引,not in 索引失效

12.儘量使用複合索引代替單列索引;同時使用多個單列索引時,會使用最優單列索引

 

二、SQL優化

1.批量插入數據(1.建議用有序數據,主鍵順序插入  2.關閉唯一性校驗   3.手動提交事物)

load data local infile '/root/sql1.log' into table 'tb_user_1' fields terminated by ',' lines terminated by '\n';

2.插入數據時的優化(1.添加可以用一條SQL執行  2.事物手動提交  3.按主鍵順序添加)

3.order by 優化(使用覆蓋索引,升序降序儘量統一)

4.group by  優化(1. 分組後加 order by null  2.  創建索引)

5.多表連接查詢代替子查詢

6.用or關鍵字時前後的字段必須都是單列索引字段(用union代替or)

7.limit 優化(1.根據主鍵關聯回原表查詢  2.主鍵自增且不能出現斷層纔可以用  id>2000000 limit 10)

 

8.使用SQL提示

1.use index 在表名後使用use index (name)

2.ignore index 忽略某個所用,用法同上

3.force index 強制使用某一索引

 

二、mysql鎖問題

myisam表鎖(適合讀表居多的存儲引擎)

加讀鎖:lock table table_name read;  unlock tables

加寫鎖:lock table table_name write;

1.加了讀鎖以後當前線程只能讀鎖定的表的數據,不能做其他操作; 其他鏈接讀取數據不受影響,其他操作頁不能做。

2.加了寫鎖後當前線程是可以讀取的,可更新可插入;其他線程處於等待狀態

總結:讀鎖會阻塞寫,但不會阻塞讀。寫鎖既會阻塞讀又會阻塞寫

3.show open tables 查看鎖的徵用情況

4.show status like 'table_locks%'

 

三、InnoDB的行鎖模式

  2.行鎖升級爲表鎖(使用索引時字符串沒加單引號,索引失效,行鎖變表鎖)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章