MySQL_MySQL查詢截取分析之order by關鍵字排序優化

1.引入

   在SQL的查詢中,我們經常會使用到關鍵字:order by,那麼我們在使用order by的時候會出現使用文件類排序的情況,那麼這一個時候的SQL性能其實是不好的。那麼下面呢,我們就一起來說說如何實現sql的關鍵字order by的優化問題。其實就是說一個問題,如何把order by查詢結果由:using filesort優化到using index。

 

2.創建測試內容準備

(1).創建測試使用數據庫表:book

DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
  `book_id` int(11) NOT NULL AUTO_INCREMENT,
  `book_name` varchar(50) NOT NULL,
  `book_author` varchar(50) NOT NULL,
  `book_price` decimal(10,0) DEFAULT NULL,
  `book_pct` varchar(50) DEFAULT NULL,
  `book_pub` varchar(50) DEFAULT NULL,
  `book_num` int(10) NOT NULL,
  `book_intro` varchar(255) DEFAULT NULL,
  `book_record` varchar(50) DEFAULT NULL,
  `bookstore_id` int(11) NOT NULL,
  PRIMARY KEY (`book_id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

(2).插入數據並查詢

(3).創建索引,在book_name,book_price上創建索引

 

3..查詢分析測試

(1).按照book_price排序查詢,直接查詢排序

(2).按照book_price排序查詢,並設置where條件

(3).按照book_name進行排序,並設置where條件

(4).按照book_name.book_price進行排序。

(5).特殊情況的排序,直接按照創建的的索引進行數據的排序操作。

總結:

       MySQL數據庫對於查詢數據的時候的排序,一般情況會使用倆種,一種是index,另一種是filesort.其中index的效率高,它是指

MySQL數據庫掃描索引本身完成的排序;filesort效率比較低,它是指對文件進行排序。那麼也就是說我們在寫查詢排序SQL的時候

需要的就是讓它使用index的方式,那麼order by在什麼樣子的情況下會使用index呢?一般的情況如下倆種就會使用到index:

 

1.order by語句使用索引的最左前列。

2.使用where 子句和 order by 子句條件組合滿足索引最左前列。

 

      使用index排序是使用了我們所創建的索引本身來進行排序,那麼爲什麼使用filesort就會比index慢呢?其實MySQL數據庫在使用filesort的時候它就要啓動雙路排序和單路排序。

      雙路排序:掃描倆次磁盤,然後讀取到數據。從獲取的數據中進行buffer排序,然後再去讀取其他的字段。

     單路排序:對磁盤進行一次掃描,然後讀取數據。這一種的效率會更高一下,但是由於它一次讀取就需要把數據操作完成,所以它更加的耗費資源。但是效率更快。

     但是在使用單路的時候就會有一個問題,那就是如果計算機的配置信息等足夠,那麼MySQL數據庫在進行操作的時候不能夠一次性使用單路排序。那麼這樣的單路排序就會進行多次。這樣的效率還不如雙路排序的效率。那麼這一個時候怎麼解決呢?一般情況我們調整我們MySQL的配置文件信息就可以了:

   把配置文件中的sort_buffer_size和max_length_for_sort_data的參數值大小調大。

    

 

3.總結:如何提升order by的查詢速度

 

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