在MySQL中使用索引来排序数据的基本教程

在MySQL数据库中,有生成命令的结果集的方式有两种:一是利用filesort,二是在索引顺序扫描,排序操作指标的使用是非常快的,和相同的指数可以用来找到同时排序操作。指标可以根据指数的时候索引的顺序是一样的列顺序为,所有列在同一个方向(升序或降序所有所有)。如果查询连接到多个表中,使用索引只有当所有列的顺序是第一个表中的列。filesort用于其他情况。



MySQL索引通常是数据行的搜索速度,用于在执行联合操作时匹配数据位置的数据线或匹配其他表。

MySQL还可以使用索引来快速执行按顺序按组和按组分组的排序和分组操作。

利用索引优化实现MySQL的逐语句优化:


创建表参与者(

actor_id int unsigned不空auto_increment,

varchar(16)不为空名的默认,

varchar(16)非空密码默认,

主键(actor_id),

密钥(名称)

InnoDB引擎=)

插入的演员(姓名、密码)值('cat01 ','1234567);

插入的演员(姓名、密码)值('cat02 ','1234567);

插入的演员(姓名、密码)值(ddddd ','1234567);

插入的演员(姓名、密码)值(aaaaa ','1234567);







MySQL >解释选择actor_id从演员以actor_id G





*************************** 1。行***************************

编号:1

select_type:简单

演员表:

类型:指数

possible_keys:空

关键词:小学

key_len:4

参考:空

行数:4

附加:使用索引

1行集(0秒)







MySQL >解释选择的密码 G为actor_id演员





*************************** 1。行***************************

编号:1

select_type:简单

演员表:

类型:所有

possible_keys:空

关键词:零

key_len:空

参考:空

行数:4

另外:使用filesort

1行集(0秒)







MySQL >解释按名称选择 G为actor_id演员





*************************** 1。行***************************

编号:1

select_type:简单

演员表:

类型:指数

possible_keys:空

关键词:名字

key_len:18

参考:空

行数:4

附加:使用索引

1行集(0秒)




下面是一个排序的优化的一些常见的索引列表:

1。如果SQL语句类似:




选择{ column1 },{方法},{ }…从表以{点}



{排序}列中的索引可以通过索引优化来启用订单。

2、+ +按索引顺序优化,如:




选择{ column1 },{方法},{ },{…从桌子columnx } = { } { }值顺序排序



创建一个columnx(排序)实现顺序的优化。

注意:如果columnx对应多个值,如下面的语句,索引不能用于优化顺序




选择{ column1 },{方法},{ },{…从表中columnx } { } {(value1,value2 },{ }…顺序排序



3,其中+多个字段按




SELECT * FROM {表},uid = 1,x,y的极限、



UID(x,y)建立优化的顺序是比建立更好的(x,y,UID)指数。

MySQL命令不能使用索引来优化排序。

*做顺序:(key1,key2分别)不同的索引键




SELECT * FROM由KEY1 T1,key2



*做为:在不连续的索引键部分(key_part1,key_part2建立建立联合索引键的一个指标)




SELECT * FROM T1,key2 =常数为key_part2



*使用ASC和DESC的同时:(key_part1,key_part2建立联合索引)




SELECT * FROM T1 ORDER BY key_part1 DESC, key_part2 ASC



*搜索记录和顺序索引键是不相同的:(key1,key2分别建立索引)




SELECT * FROM T1,key2 =常数按KEY1



*如果表达式(函数)应用于字段的位置和顺序,则不能使用索引来优化顺序。




选择每年从T1秩序*(logindate)限制、





当MySQL无法使用索引,排序,将使用自己的排序算法(快速排序算法)在内存中(sort buffer)排序数据,如果内存不加载,它将磁盘上的数据进行分块,然后对每个数据块的序列,然后融入到每个块排序结果集(实际上是),filesort,有两种排序算法的MySQL。

1。二次扫描算法(两次扫描)

是实现排序字段的第一需要的方式,可以直接定位到相关的数据的指针信息,然后设置内存(使用sort_buffer_size参数集)整理,整理线再要求删除列的指针信息后。

注意:该算法是一种在4.1之前使用的算法,它要求两次访问数据,特别是第二次读取操作,导致大量随机I/O操作,另一方面,内存开销小。

2。一次扫描算法(单程)

该算法一次取出所有所需的列,在内存中进行排序后直接输出结果。

注:本算法是从MySQL 4.1版本使用。它减少了我/ O,是更有效的,但有一个更大的内存成本。如果我们采取了列,我们不需要,我们会大大浪费的排序过程所需要的内存。在MySQL 4.1版本后,MySQL可以通过设置max_length_for_sort_data参数选择第一种算法或第二控制。当各大领域的总大小大于max_length_for_sort_data,MySQL会选择使用第一个排序算法,否则,就会有第二个选择。为了提高排序性能尽可能,我们自然喜欢用二排序算法,以提取所需的柱是非常必要的仅在查询中。

当连接操作排序,如果只引用表中第一列顺序表MySQL filesort,然后连接,在这一点上,说明利用filesort输出;否则,MySQL必须生成一个临时表的查询结果,对filesort操作完成后,本连接。这说明利用临时用filesort输出。