SQL優化之九不要

目錄

 

1、前置模糊查詢不能使用索引

2、數據區分度不大的字段不宜使用索引

3、在屬性上進行計算不能命中索引

4、如果業務大部分是單條查詢,使用Hash索引性能更好

5、複合索引最左前綴,並不是指SQL語句的where條件順序要和複合索引一致

6、如果明確知道只有一條結果返回,limit 1能夠提高效率

7、不要使用select *

8、儘量不要使用not in和<>操作

9、列默認值最好不好設置爲NULL


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

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