目錄
5、複合索引最左前綴,並不是指SQL語句的where條件順序要和複合索引一致
6、如果明確知道只有一條結果返回,limit 1能夠提高效率
1、前置模糊查詢不能使用索引
select * from order where desc like '%XX',這樣是不會使用索引的
而非前置模糊查詢則可以使用索引,比如:
select * from order where desc like 'XX%'
2、數據區分度不大的字段不宜使用索引
例如:select * from user where sex=1
性別只有男、女,每次過濾掉的數據很少,不宜使用索引。經驗上,能過濾80%數據時就可以使用索引。對於訂單狀態,如 果狀態值很少,不宜使用索引,如果狀態值很多,能夠過濾大量數據,則可以建立索引。
3、在屬性上進行計算不能命中索引
例如:select * from order where YEAR(date) < = '2020'
即使date上建立了索引,也會全表掃描,
可優化爲值計算:select * from order where date < = CURDATE()
或者:select * from order where date < = '2020-01-01'
4、如果業務大部分是單條查詢,使用Hash索引性能更好
例如用戶表:select * from user where uid=?
select * from user where login_name=?
原因:B-Tree索引的時間複雜度是O(log(n))
Hash索引的時間複雜度是O(1)
5、複合索引最左前綴,並不是指SQL語句的where條件順序要和複合索引一致
用戶中心建立了(login_name, passwd)的複合索引
例如:select * from user where login_name=? and passwd=?
select * from user where passwd=? and login_name=?
都能夠命中索引。
select * from user where login_name=?
也能命中索引,滿足複合索引最左前綴。
select * from user where passwd=?
不能命中索引,不滿足複合索引最左前綴
6、如果明確知道只有一條結果返回,limit 1能夠提高效率
例如:select * from user where login_name=?
可以優化爲:select * from user where login_name=? limit 1
原因:你知道只有一條結果,但數據庫並不知道,明確告訴它,讓它主動停止遊標移動
7、不要使用select *
select *和select 列名,查詢效率沒有太大區別,主要是能夠大大的節省數據傳輸量,與數據庫的內存使用量。
8、儘量不要使用not in和<>操作
select * from order where status <> 0 and stauts <> 1
not in/not exists都不是好習慣。
可以優化爲in查詢:select * from order where status in(2,3)
9、列默認值最好不好設置爲NULL
只要列中含有NULL值,就最好不要在此例設置索引,單列索引不存null值,複合索引不存全爲null的值
參考文章:https://mp.weixin.qq.com/s/AwAEJVWtYfiy79jXGC7olA
https://youzhixueyuan.com/MySQL-slow-query-optimization-index-optimization.html