Mysql入门MySQL中利用索引对数据进行排序的基础教程
《Mysql入门MySQL中利用索引对数据进行排序的基础教程》要点: MySQL中,有两种方式生成有序结果集:一是使用filesort,二是按索引顺序扫描.利用索引进行排序操作是非常快的,而且可以利用同一索引同时进行查找和排序操作.当索引的顺序与ORDER BY中的列顺序相同且所有的列是同一方向(全部升序或者全部降序)时,可以使用索引来排序.如果查询是连接多个表,仅当ORDER BY中的所有列都是第一个表的列时才会使用索引.其它情况都会使用filesort. MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. 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=InnoDB insert into actor(name,password) values('cat01','1234567'); insert into actor(name,password) values('cat02',password) values('ddddd',password) values('aaaaa','1234567'); ?MYSQL应用 mysql> explain select actor_id from actor order by actor_id G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: actor type: index possible_keys: NULL key: PRIMARY key_len: 4 ref: NULL rows: 4 Extra: Using index 1 row in set (0.00 sec) ?MYSQL应用 mysql> explain select actor_id from actor order by password G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: actor type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 4 Extra: Using filesort 1 row in set (0.00 sec) ?MYSQL应用 mysql> explain select actor_id from actor order by name G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: actor type: index possible_keys: NULL key: name key_len: 18 ref: NULL rows: 4 Extra: Using index 1 row in set (0.00 sec) 下面来罗列一些常见的索引对ORFER BY的优化情况:MYSQL应用 1、如果一个SQL语句形如: SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort]? 在[sort]这个栏位上建立索引就可以实现利用索引进行order by 优化. SELECT [column1],…. FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort]? 建立一个联合索引(columnX,sort)来实现order by 优化. SELECT [column1],…. 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)索引效果要好得多. 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不能使用索引进行排序时,就会利用自己的排序算法(快速排序算法)在内存(sort buffer)中对数据进行排序,如果内存装载不下,它会将磁盘上的数据进行分块,再对各个数据块进行排序,然后将各个块合并成有序的结果集(实际上就是外排序).对于filesort,MySQL有两种排序算法. 当对连接操作进行排序时,如果ORDER BY仅仅引用第一个表的列,MySQL对该表进行filesort操作,然后进行连接处理,此时,EXPLAIN输出“Using filesort”;否则,MySQL必须将查询的结果集生成一个临时表,在连接完成之后进行filesort操作,EXPLAIN输出“Using temporary;Using filesort”.MYSQL应用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |