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的查詢速度