高性能的索引策略3-使用索引扫描做排序

mysql有两种方式生成有序结果:

  • 通过排序操作 order by
  • 按照索引顺序扫描(explain 出来的type 为 index)

  扫描索引本身是很快的,因为只需要从一条索引记录移动到下一条索引记录即可。但是如果索引不能覆盖查询所需的全部列,那就不得不每扫描一条索引记录就得回表查询一次对应的行。这基本上就是随机IO。

因此,按照索引顺序读取数据的速度通常要比顺序全表扫描慢。

尽可能设计同一个索引技能满足排序,又可用于查找行。

mysql使用索引对结果排序的前提:

  • 索引的列顺序和order by 子句的顺序完全一致
  • 所有列的排序方向一致,同时都为asc 或者 desc
  • 如果查询需要关联多张表,则只有当order by 子句引用的字段全部为第一个表时
  • order by子句和查找型查询的限制一样:满足索引的最左前缀要求
    • 例外:当where子句或join子句中对索引的前导列指定为常量,则可以直接利用索引前导列之后的列进行排序,具体例子见下图:

原文地址:https://www.cnblogs.com/wooluwalker/p/12237334.html

时间: 2024-10-22 08:47:12

高性能的索引策略3-使用索引扫描做排序的相关文章

mysql使用索引扫描来做排序

mysql有两种方式可以生成有序的结果,通过排序操作或者按照索引顺序扫描,如果explain的type列的值为index,则说明mysql使用了索引扫描来做排序(不要和extra列的Using index搞混了,那个是使用了覆盖索引查询).扫描索引本身是很快的,因为只需要从一条索引记录移动到紧接着的下一条记录,但如果索引不能覆盖查询所需的全部列,那就不得不扫描一条索引记录就回表查询一次对应的整行,这基本上都是随机IO,因此按索引顺序读取数据的速度通常要比顺序地全表扫描慢,尤其是在IO密集型的工作

高性能的索引策略(上)

高效的选择和使用索引有很多方式,其中有些事针对特殊案例的优化方法,有些则是针对特定行为的优化,使用哪个索引,以及如何评估选择不同索引性能影响的技巧,则需要持续不断的练习.接下来将介绍如何高效的使用索引. 独立的列 我们通常会看到一些查询不当的使用索引,或者是的MySQL无法使用已有的索引.如果查询中的列不是独立的,则MySQL就不会使用索引.“独立的列”是指索引列不能是表达式的一部分,也不能是函数的参数. 例如,下面的这个查询无法使用actor_id的索引: SELECT actor_id FR

MySQL索引背后的之使用策略及优化(高性能索引策略)

为了讨论索引策略,需要一个数据量不算小的数据库作为示例.本文选用MySQL官方文档中提供的示例数据库之一:employees.这个数据库关系复杂度适中,且数据量较大.下图是这个数据库的E-R关系图(引用自MySQL官方手册): 图12 MySQL官方文档中关于此数据库的页面为http://dev.mysql.com/doc/employee/en/employee.html.里面详细介绍了此数据库,并提供了下载地址和导入方法,如果有兴趣导入此数据库到自己的MySQL可以参考文中内容. 最左前缀原

高性能索引-高性能索引策略

1.独立的列 如果查询中的列不是独立的,则MySql就不会使用索引."独立的列"是指索引列不能是表达式的一部分,也不能是函数的参数. 2.前缀索引和索引的选择性 对于很长字符列,可以索引开始的部分字符,这样可以大大节约索引空间,从而提高索引的效率.但是会降低索引的选择性.索引的选择性是指:不重复的索引值(也称基数)和数据表的总记录数的比值.索引的选择性越高则查询效率越高.诀窍在于选择足够长的前缀以保证较高的选择性,同时又不能太长(以便节省空间).前缀索引是一种能使索引更小.更快的有效办

高性能的索引策略2

6 覆盖索引 [可参考博文 https://www.cnblogs.com/kerrycode/p/9909093.html] 如果一个索引包含所有需要查询的字段,则称之为“覆盖索引”. 使用覆盖索引,只需要扫描索引,而无需回表: 一般索引比数据行数少,若只需要读取索引,则mysql访问数据量会减少 索引是按照索引列值排序的,所以对于IO密集型范围查询会比随机从磁盘读取每一行数据的磁盘IO要少得多 当发起一个被索引覆盖的查询是,在EXPLAIN中的extra列可以看到 “Using index”

高性能索引-高性能索引策略二

1.覆盖索引 索引是一种查找数据的高效方式,如果MySQL可以使用索引来直接获取列的数据,这样就不再需要读取数据行.如果一个索引包含所有需要查询的字段的值,就称之为"覆盖索引".覆盖索引具有以下好处: 索引条目通常远小于数据行大小,所以如果只需要读取索引,就会极大的减少数据的访问. 索引是按列值顺序存储的,所以对I/O密集型的范围查询会比随机从磁盘读取每一行数据的I/O要少的多. 一些存储引擎如MyISAM在内存只会缓存索引. 由于InnoDB的聚族索引,覆盖索引对InnoDB非常有用

高性能索引策略

1.独立的列 一些查询不当的使用索引,或者使得MySOL无法使用已有的索引.如果查询中的列不是独立的,则MySOL就不会使用索引."独立的列"是指索引列不能是表达式的一部分,也不能是函数的参数. 例如:mysql>select id from student where id+1=5;,就无法使用id列的索引 凭肉眼很容易看出where 中的表达式其实等价以id=4,但是mysql无法自动解析这个方程式.这完全是用户行为,我们应该始终将索引列单独放在比较符号的一侧. 2.前缀索引

高性能索引策略一

高效的选择和使用索引有很多方式,有的是针对特殊案例的优化方法,有的则是针对特定行为的优化,使用哪个索引,以及如何评估选择不同索引的性能影响的技巧,则需要持续不断地学习.(本文章需要一定索引基础) 1.索引要是独立的列 "独立的列"是指索引列不能是表达式的一部分,也不能是函数的参数.例如,下面这个查询无法使用actor_id列的索引 mysql>SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5; 凭肉眼很容易看出WHE

高性能的索引策略4-冗余和重复索引

如果创建了索引(A,B),再创建索引(A)就是荣誉索引,因为索引(A)是索引(A,B)的前缀索引,因此索引(A,B)可以当做索引(A)来使用[仅仅针对B Tree索引来讲] 针对InnoDB,ID为主键,索引(A)可当做 (A,ID)来使用,不用再创建索引(A,ID) 表中的索引越多,则insert .update.delete的操作会变得越慢,一般来讲,会选择扩展现有的索引,而不是 增加新的索引. 原文地址:https://www.cnblogs.com/wooluwalker/p/12237