萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> MySQL ORDER BY排序語句用法與優化

MySQL ORDER BY排序語句用法與優化

在mysql中ORDER BY keyword是用來給記錄中的數據進行分類的,下面我來總結了order by語句利用索引進行優化的方法。

MySQL Order By語法

 代碼如下 復制代碼

 SELECT column_name(s) FROM table_name ORDER BY column_name

注意:SQL語句是“字母大小寫不敏感”的語句(它不區分字母的大小寫),即:“ORDER BY”和“order by”是一樣的。

MySQL Order By案例

下面的例子:從“Person”表中選取所有記錄,並將“Age”列進行分類:

 代碼如下 復制代碼 <?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
mysql_select_db("my_db", $con);
$result = mysql_query("SELECT * FROM person ORDER BY age");
while($row = mysql_fetch_array($result))
  {
  echo $row['FirstName']
  echo " " . $row['LastName'];
  echo " " . $row['Age'];
  echo "<br />";
  }
mysql_close($con);
?>


上面的代碼將輸出下面的結果:

  Glenn Quagmire 33

  Peter Griffin 35

按照升序或者降序進行分類排列

如果你使用了“ORDER BY”關鍵詞,所有記錄將按照默認的升序進行排列(即:從1到9,從a到z)

使用“DESC”關鍵詞可以制定所有的數據按照降序排列(即:從9到1,從z到a):


雙擊代碼全選 123 SELECT column_name(s) FROM table_name ORDER BY column_name DESC


MySQL Order By根據兩列進行分類

很多時候,我們需要同時根據兩列內容(或者更多列)來對數據進行分類。當指定的列數多於一列時,僅在第一列的值完全相同時才參考第二列:


雙擊代碼全選 123 SELECT column_name(s) FROM table_name ORDER BY column_name1, column_name2


通過索引優化來實現MySQL的ORDER BY語句優化:

1、ORDER BY的索引優化。如果一個SQL語句形如:

 代碼如下 復制代碼

SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort];

在[sort]這個欄位上建立索引就可以實現利用索引進行order by 優化。
2、WHERE + ORDER BY的索引優化,形如:

SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort];
建立一個聯合索引(columnX,sort)來實現order by 優化。

注意:如果columnX對應多個值,如下面語句就無法利用索引來實現order by的優化

 代碼如下 復制代碼

SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] IN ([value1],[value2],…) ORDER BY[sort];

3、WHERE+ 多個字段ORDER BY

 代碼如下 復制代碼

SELECT * FROM [table] WHERE uid=1 ORDER x,y LIMIT 0,10;

建立索引(uid,x,y)實現order by的優化,比建立(x,y,uid)索引效果要好得多。


MySQL Order By不能使用索引來優化排序的情況

* 對不同的索引鍵做 ORDER BY :(key1,key2分別建立索引)

 代碼如下 復制代碼

SELECT * FROM t1 ORDER BY key1, key2;

* 在非連續的索引鍵部分上做 ORDER BY:(key_part1,key_part2建立聯合索引;key2建立索引)

 代碼如下 復制代碼

SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2;

* 同時使用了 ASC 和 DESC:(key_part1,key_part2建立聯合索引)

 代碼如下 復制代碼

SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;

* 用於搜索記錄的索引鍵和做 ORDER BY 的不是同一個:(key1,key2分別建立索引)

 代碼如下 復制代碼

SELECT * FROM t1 WHERE key2=constant ORDER BY key1;

* 如果在WHERE和ORDER BY的欄位上應用表達式(函數)時,則無法利用索引來實現order by的優化

 代碼如下 復制代碼

SELECT * FROM t1 ORDER BY YEAR(logindate) LIMIT 0,10;

特別提示:

>mysql一次查詢只能使用一個索引。如果要對多個字段使用索引,建立復合索引。

>越小的數據類型通常更好:越小的數據類型通常在磁盤、內存和CPU緩存中都需要更少的空間,處理起來更快。
>簡單的數據類型更好:整型數據比起字符,處理開銷更小,因為字符串的比較更復雜。在MySQL中,應該用內置的日期和時間數據類型,而不是用字符串來存儲時間;以及用整型數據類型存儲IP地址。
>盡量避免NULL:應該指定列為NOT NULL,除非你想存儲NULL。在MySQL中,含有空值的列很難進行查詢優化,因為它們使得索引、索引的統計信息以及比較運算更加復雜。你應該用0、一個特殊的值或者一個空串代替空值。
>在ORDER BY操作中,MySQL只有在排序條件不是一個查詢條件表達式的情況下才使用索引。

copyright © 萬盛學電腦網 all rights reserved