MySQL 通過索引優(yōu)化含ORDER BY的語句
關(guān)于建立索引的幾個準則:
1、合理的建立索引能夠加速數(shù)據(jù)讀取效率,不合理的建立索引反而會拖慢數(shù)據(jù)庫的響應(yīng)速度。
2、索引越多,更新數(shù)據(jù)的速度越慢。
3、盡量在采用MyIsam作為引擎的時候使用索引(因為MySQL以BTree存儲索引),而不是InnoDB。但MyISAM不支持Transcation。
4、當你的程序和數(shù)據(jù)庫結(jié)構(gòu)/SQL語句已經(jīng)優(yōu)化到無法優(yōu)化的程度,而程序瓶頸并不能順利解決,那就是應(yīng)該考慮使用諸如memcached這樣的分布式緩存系統(tǒng)的時候了。
5、習慣和強迫自己用EXPLAIN來分析你SQL語句的性能。
一個很容易犯的錯誤:
不要在選擇的欄位上放置索引,這是無意義的。應(yīng)該在條件選擇的語句上合理的放置索引,比如where,order by。
例子:
SELECT id,title,content,cat_id FROM article WHERE cat_id = 1;
上面這個語句,你在id/title/content上放置索引是毫無意義的,對這個語句沒有任何優(yōu)化作用。但是如果你在外鍵cat_id上放置一個索引,那作用就相當大了。
幾個常用ORDER BY語句的MySQL優(yōu)化:
1、ORDER BY + LIMIT組合的索引優(yōu)化。如果一個SQL語句形如:
SELECT [column1],[column2],.... FROM [TABLE] ORDER BY [sort] LIMIT [offset],[LIMIT]; |
這個SQL語句優(yōu)化比較簡單,在[sort]這個欄位上建立索引即可。
2、WHERE + ORDER BY + LIMIT組合的索引優(yōu)化,形如:
SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort] LIMIT[offset],[LIMIT]; |
這個語句,如果你仍然采用第一個例子中建立索引的方法,雖然可以用到索引,但是效率不高。更高效的方法是建立一個聯(lián)合索引(columnX,sort)
3、WHERE + IN + ORDER BY + LIMIT組合的索引優(yōu)化,形如:
SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX] IN ([value1],[value2],...) ORDER BY[sort] LIMIT [offset],[LIMIT]; |
這個語句如果你采用第二個例子中建立索引的方法,會得不到預期的效果(僅在[sort]上是using index,WHERE那里是using where;using filesort),理由是這里對應(yīng)columnX的值對應(yīng)多個。
這個語句怎么優(yōu)化呢?我暫時沒有想到什么好的辦法,看到網(wǎng)上有便宜提供的辦法,那就是將這個語句用UNION分拆,然后建立第二個例子中的索引:
SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX]=[value1] ORDER BY [sort] LIMIT[offset],[LIMIT] UNION SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX]=[value2] ORDER BY [sort] LIMIT[offset],[LIMIT] UNION …… |
但經(jīng)驗證,這個方法根本行不通,效率反而更低,測試時對于大部分應(yīng)用強制指定使用排序索引效果更好點
4、不要再WHERE和ORDER BY的欄位上應(yīng)用表達式(函數(shù)),比如:
SELECT * FROM [table] ORDER BY YEAR(date) LIMIT 0,30; |
5、WHERE+ORDER BY多個欄位+LIMIT,比如
SELECT * FROM [table] WHERE uid=1 ORDER x,y LIMIT 0,10; |
對于這個語句,大家可能是加一個這樣的索引(x,y,uid)。但實際上更好的效果是(uid,x,y)。這是由MySQL處理排序的機制造成的。
以上例子你在實際項目中應(yīng)用的時候,不要忘記在添加索引后,用EXPLAIN看看效果。
相關(guān)文章
解析MySQL8.0新特性——事務(wù)性數(shù)據(jù)字典與原子DDL
這篇文章主要介紹了MySQL8.0新特性——事務(wù)性數(shù)據(jù)字典與原子DDL的相關(guān)資料,幫助大家更好的理解和學習MySQL8.0感興趣的朋友可以了解下2020-08-08MySQL專用服務(wù)器自動配置參數(shù)的實現(xiàn)
本文主要介紹了MySQL專用服務(wù)器自動配置參數(shù)的實現(xiàn),MySQL8.0推出了專用數(shù)據(jù)庫服務(wù)器自動配置參數(shù),通過打開innodb_dedicated_server,下面就來詳細的介紹一下,感興趣的可以了解一下2024-09-09Mysql中DATEDIFF函數(shù)的基礎(chǔ)語法及練習案例
Datediff函數(shù),最大的作用就是計算日期差,能計算兩個格式相同的日期之間的差值,下面這篇文章主要給大家介紹了關(guān)于Mysql中DATEDIFF函數(shù)的基礎(chǔ)語法及練習案例?的相關(guān)資料,需要的朋友可以參考下2022-09-09