索引對排序的影響

索引不僅能提高查詢速度,還可以添加排序速度,如果order by 後面的語句用到了索引,那麼將會提高排序的速度。

測試

1、創建測試表:t15表

CREATE TABLE `t15` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `cat_id` int(10) unsigned NOT NULL DEFAULT '0',
  `price` decimal(10,2) NOT NULL DEFAULT '0.00',
  `name` char(5) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8

2、插入1W行數據

<?php  
$db = 'test';
$conn = mysql_connect('localhost','root','1234');
mysql_query('use ' . $db , $conn);
mysql_query('set names utf8' , $conn);

for($i=1;$i<=10000;$i++) {
    $cat_id = rand(1,10);
    $price = rand(1,50000);
    $name = substr(str_shuffle('abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ234565789'),0,5);
    $sql = sprintf("insert into t15 values (%d,%d,%f,'%s')",$i,$cat_id,$price,$name);
    mysql_query($sql , $conn);
}

3、商場網站,一般都會按照某個分類進行價格上的排序,我們來模擬一下,執行同一條sql語句。

select name,cat_id,price from t15 where cat_id=1 order by price;

(1)首先不添加索引

從查詢分析可以看到Extra中使用到了Using filesort,表示需要進行文件排序。
這裏寫圖片描述

(2)給(cat_id,price)列添加索引

alter table t15 add index cp(cat_id,price);

這裏的查詢分析中Extra沒用了Using filesort,表示添加上索引再進行查詢的sql沒有使用到外部排序,而是使用到了索引的排序,因爲索引本身就是會排序的,所以不需要額外的order by一次。

這裏寫圖片描述

4、觀測查詢時間

這裏寫圖片描述

Query_ID爲1的是沒有添加索引執行的語句,Query_ID爲3的是添加索引後執行的語句,一個執行時間爲0.013秒,一個執行時間爲0.005秒,肯定是加上索引的快,我們來看看具體快在哪裏

Query_ID爲1的sql語句執行詳細耗時圖:
這裏寫圖片描述

Query_ID爲3的sql語句執行詳細耗時圖:

這裏寫圖片描述

很明顯,Query_ID1中的Sorting result耗時0.012秒,而Query_ID2中的Sorting result只耗時0.000004秒,而這個Sorting result就是排序耗時。

結論:索引對排序的速度是有一定的影響的,所以,在實際的開發中,要結合實際情況制定索引,並儘可能將排序字段添加至索引中。

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