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.行鎖升級爲表鎖(使用索引時字符串沒加單引號,索引失效,行鎖變表鎖)