程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL 經由過程索引優化含ORDER BY的語句

MySQL 經由過程索引優化含ORDER BY的語句

編輯:MySQL綜合教程

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看看後果。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved