MySQL中,有兩種方式生成有序結(jié)果集:一是使用filesort,二是按索引順序掃描。利用索引進(jìn)行排序操作是非常快的,而且可以利用同一索引同時(shí)進(jìn)行查找和排序操作。當(dāng)索引的順序與ORDER BY中的列順序相同且所有的列是同一方向(全部升序或者全部降序)時(shí),可以使用索引來排序。如果查詢是連接多個(gè)表,僅當(dāng)ORDER BY中的所有列都是第一個(gè)表的列時(shí)才會(huì)使用索引。其它情況都會(huì)使用filesort。
MySQL索引通常是被用于提高WHERE條件的數(shù)據(jù)行匹配或者執(zhí)行聯(lián)結(jié)操作時(shí)匹配其它表的數(shù)據(jù)行的搜索速度。
MySQL也能利用索引來快速地執(zhí)行ORDER BY和GROUP BY語句的排序和分組操作。
通過索引優(yōu)化來實(shí)現(xiàn)MySQL的ORDER BY語句優(yōu)化:
| create table actor(actor_id int unsigned NOT NULL AUTO_INCREMENT,name varchar(16) NOT NULL DEFAULT '',password varchar(16) NOT NULL DEFAULT '',PRIMARY KEY(actor_id), KEY (name)) ENGINE=InnoDBinsert into actor(name,password) values('cat01','1234567');insert into actor(name,password) values('cat02','1234567');insert into actor(name,password) values('ddddd','1234567');insert into actor(name,password) values('aaaaa','1234567'); |
| mysql> explain select actor_id from actor order by actor_id /G |
| *************************** 1. row *************************** id: 1 select_type: SIMPLE table: actor type: indexpossible_keys: NULL key: PRIMARY key_len: 4 ref: NULL rows: 4 Extra: Using index1 row in set (0.00 sec) |
| mysql> explain select actor_id from actor order by password /G |
| *************************** 1. row *************************** id: 1 select_type: SIMPLE table: actor type: ALLpossible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 4 Extra: Using filesort1 row in set (0.00 sec) |
| mysql> explain select actor_id from actor order by name /G |
| *************************** 1. row *************************** id: 1 select_type: SIMPLE table: actor type: indexpossible_keys: NULL key: name key_len: 18 ref: NULL rows: 4 Extra: Using index1 row in set (0.00 sec) |
下面來羅列一些常見的索引對(duì)ORFER BY的優(yōu)化情況:
1、如果一個(gè)SQL語句形如:
| SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort]; |
在[sort]這個(gè)欄位上建立索引就可以實(shí)現(xiàn)利用索引進(jìn)行order by 優(yōu)化。
2、WHERE + ORDER BY的索引優(yōu)化,形如:
| SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort]; |