高性能的索引策略2

6 覆盖索引

【可参考博文 https://www.cnblogs.com/kerrycode/p/9909093.html

如果一个索引包含所有需要查询的字段,则称之为“覆盖索引”。

使用覆盖索引,只需要扫描索引,而无需回表:

  • 一般索引比数据行数少,若只需要读取索引,则mysql访问数据量会减少
  • 索引是按照索引列值排序的,所以对于IO密集型范围查询会比随机从磁盘读取每一行数据的磁盘IO要少得多

当发起一个被索引覆盖的查询是,在EXPLAIN中的extra列可以看到 “Using index”的信息。

延迟关联

Explain select * from products where actor = ‘SEAN Carrey‘ and title like ‘%APOLLO%‘;

上述查询不能走上索引:

  • 没有任何索引能够覆盖这个查询。因为查询从表总选择了所有列,没有任务索引覆盖了所有列。
  • Mysql在索引上执行like操作是有局限在性的,这是底层存储引擎的限制:
    • 在索引中做最左前缀匹配的like操作可以走索引,like ‘APoLLO%‘,底层可以转换成比较操作
    • 通配符开头的like, like ‘%APOLLO%‘,是不能走索引的

针对上述情况,可以通过重新设计索引来规避:

修改索引为 actor,title,prod_id

  • 先通过覆盖索引查询出来prod_id
  • 再通过prod_id在外层查询匹配获取需要的所有列值,即:

    select *

    from products

    join (

      select prod_id from products where actor = ‘SAEN CARREY‘ and title like ‘%APOLLO%‘

    ) as t1

    on (t1.prod_id = products.prod_id)

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

时间: 2024-10-10 12:37:25

高性能的索引策略2的相关文章

高性能的索引策略(上)

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

高性能的索引策略01---独立的列

我们通常会看到一些查询不当地使用索引,或者使得MySQL无法使用已有的索引.如果查询中的列不是独立的,则MySQL就不会使用索引."独立的列"是指索引列不能是表达式的一部分,也不能是函数的参数. 例如下面这个查询无法使用actor_id列的索引: mysql> select actor_id from sakila.actor where actor_id+1 = 5; 凭肉眼很容易看出where中的表达式其实等价于actor_id=4,但是MySQL无法自动解析这个方程式.这完

高性能的索引策略5-案例学习

mysql使用某个索引进行范围查询,也就无法使用该所有后续字段进行排序了. 1 支持多种过滤条件 2 避免多个范围条件 对于范围条件查询,mysql无法使用范围列后面的其他索引, 但是对于等“多个等只查询”没有这个限制[in (a,b,c,d...) 是等值操作] 3 优化排序 原文地址:https://www.cnblogs.com/wooluwalker/p/12237341.html

高性能的索引策略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

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

mysql有两种方式生成有序结果: 通过排序操作 order by 按照索引顺序扫描(explain 出来的type 为 index) 扫描索引本身是很快的,因为只需要从一条索引记录移动到下一条索引记录即可.但是如果索引不能覆盖查询所需的全部列,那就不得不每扫描一条索引记录就得回表查询一次对应的行.这基本上就是随机IO. 因此,按照索引顺序读取数据的速度通常要比顺序全表扫描慢. 尽可能设计同一个索引技能满足排序,又可用于查找行. mysql使用索引对结果排序的前提: 索引的列顺序和order b

创建高性能的索引

索引可以包含一个或多个列的值.若索引包含多个列,那么列的顺序也十分重要,因为MySQL只能高效的使用索引的最左前缀列. 在MySQL中,索引是在存储引擎层而不是服务层实现的,所以并没有统一的索引标准.不同存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引.即使多个存储引擎支持同一种类型的索引,其底层的实现也可能不同. B-Tree索引 若没有指定特定类型的索引,则一般都是指的是B-Tree索引,它使用B-Tree数据结构来存储数据.InnoDB使用的是B+Tree.MyI

《高性能MySQL》读书笔记之创建高性能的索引

索引是存储引擎用于快速找到记录的一种数据结构.索引优化是对查询性能优化的最有效手段.索引能够轻易将查询性能提高几个数量级.创建一个最优的索引经常需要重写查询.5.1 索引基础 在MySQL中,存储引擎首先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行. 索引可以包含一个或多个列的值.如果索引包含多个列,那么列的顺序也十分重要,因为MySQL只能高效地使用索引的最左前缀列. 5.1.1 索引的类型 索引有很多类型,可以为不同的场景提供更好的性能.在MySQL中,索引是在储存引擎层而不是

高性能MySQL——创建高性能的索引

索引是存储引擎用于快速查找记录的一种数据结构.索引优化是对查询性能优化最有效的手段. 1.索引的类型 在MySQL中,索引是在存储引擎层而不是服务器层实现的.所以没用统一的索引标准,不同存储引擎的索引工作方式并不相同. B-Tree索引 B-Tree索引即使用B-Tree数据结构来存储数据.B-Tree通常意味着所有值都是按顺序存储的,并且每个叶子页到根的距离相同.存储引擎已不同的方式来使用B-Tree索引,性能也各不相同. 可以使用B-Tree索引的查询类型--全键值.键值范围和键前缀查找.其

高性能MySQL--创建高性能的索引

关于MySQL的优化,相信很多人都听过这一条:避免使用select *来查找字段,而是要在select后面写上具体的字段. 那么这么做的原因相信大家都应该知道:减少数据量的传输. 但我要讲的是另外一个原因:使用select *,就基本不可能使用到覆盖索引(什么是覆盖索引,后面会说). 而将一个本该可以用覆盖索引的查询变成了不能使用覆盖索引的查询,就会导致随机I/O或回表查询(回表查询在介绍聚簇索引的时候会说). 一.索引的类型 1.B-Tree索引 大部分的MySQL引擎都支持这种索引,它是使用