MySQL 經由過程索引優化含ORDER BY的語句。本站提示廣大學習愛好者:(MySQL 經由過程索引優化含ORDER BY的語句)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL 經由過程索引優化含ORDER BY的語句正文
關於樹立索引的幾個原則:
1、公道的樹立索引可以或許加快數據讀取效力,不公道的樹立索引反而會拖慢數據庫的呼應速度。
2、索引越多,更新數據的速度越慢。
3、盡可能在采取MyIsam作為引擎的時刻應用索引(由於MySQL以BTree存儲索引),而不是InnoDB。但MyISAM不支撐Transcation。
4、當你的法式和數據庫構造/SQL語句曾經優化到沒法優化的水平,而法式瓶頸其實不能順遂處理,那就是應當斟酌應用諸如memcached如許的散布式緩存體系的時刻了。
5、習氣和強制本身用EXPLAIN來剖析你SQL語句的機能。
一個很輕易犯的毛病:
不要在選擇的欄位上放置索引,這是有意義的。應當在前提選擇的語句上公道的放置索引,好比where,order by。
例子:
SELECT id,title,content,cat_id FROM article WHERE cat_id = 1;
下面這個語句,你在id/title/content上放置索引是毫有意義的,對這個語句沒有任何優化感化。然則假如你在外鍵cat_id上放置一個索引,那感化就相當年夜了。
幾個經常使用ORDER BY語句的MySQL優化:
1、ORDER BY + LIMIT組合的索引優化。假如一個SQL語句形如:
SELECT [column1],[column2],.... FROM [TABLE] ORDER BY [sort] LIMIT [offset],[LIMIT];
這個SQL語句優化比擬簡略,在[sort]這個欄位上樹立索引便可。
2、WHERE + ORDER BY + LIMIT組合的索引優化,形如:
SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort] LIMIT[offset],[LIMIT];
這個語句,假如你依然采取第一個例子中樹立索引的辦法,固然可以用到索引,然則效力不高。更高效的辦法是樹立一個結合索引(columnX,sort)
3、WHERE + IN + ORDER BY + LIMIT組合的索引優化,形如:
SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX] IN ([value1],[value2],...) ORDER BY[sort] LIMIT [offset],[LIMIT];
這個語句假如你采取第二個例子中樹立索引的辦法,會得不到預期的後果(僅在[sort]上是using index,WHERE那邊是using where;using filesort),來由是這裡對應columnX的值對應多個。
這個語句怎樣優化呢?我臨時沒有想到甚麼好的方法,看到網上有廉價供給的方法,那就是將這個語句用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
……
但經歷證,這個辦法基本行欠亨,效力反而更低,測試時關於年夜部門運用強迫指定應用排序索引後果更好點
4、不要再WHERE和ORDER BY的欄位上運用表達式(函數),好比:
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處置排序的機制作成的。
以上例子你在現實項目中運用的時刻,不要忘卻在添加索引後,用EXPLAIN看看後果。