zoukankan      html  css  js  c++  java
  • 你了解MySql覆盖索引吗?

    简单点来讲,总是开篇简单讲,其实有的面试简单说一下就够啦,其实面试官就问你一下了解不了解。

    覆盖索引是指,索引上的信息足够满足查询请求,不需要再回到主键上去取数据。

    下面详细的讲一下:

    覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引不存储索引列的值,所以mysql只能用B-tree索引做覆盖索引。

    当发起一个索引覆盖查询时,在explain的extra列可以看到using index的信息:

    覆盖索引的坑:mysql查询优化器会在执行查询前判断是否有一个索引能进行覆盖,假设索引覆盖了where条件中的字段,但不是整个查询涉及的字段,mysql5.5和之前的版本也会回表获取数据行,尽管并不需要这一行且最终会被过滤掉。

    如上图则无法使用覆盖查询,原因:

    1.没有任何索引能够覆盖这个索引。因为查询从表中选择了所有的列,而没有任何索引覆盖了所有的列。

    2.mysql不能在索引中执行LIke操作。mysql能在索引中做最左前缀匹配的like比较,但是如果是通配符开头的like查询,存储引擎就无法做比较匹配。这种情况下mysql只能提取数据行的值而不是索引值来做比较

    最后总结一下:


      当一条查询语句符合覆盖索引条件时,sql只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后再返回表操作,减少I/O提高效率。
    使用覆盖索引Innodb比MyISAM效果更好----InnoDB使用聚集索引组织数据,如果二级索引中包含查询所需的数据,就不再需要在聚集索引中查找了

      注:遇到以下情况,执行计划不会选择覆盖查询
      1.select选择的字段中含有不在索引中的字段 ,即索引没有覆盖全部的列。
      2.where条件中不能含有对索引进行like的操作。'

    哎 也没办法,现在市场上各种人才都太多了,只能通过各种原理性问题来筛选大多数的小朋友了,太难了。

    奔跑吧,蜗牛~

  • 相关阅读:
    工作流 —— AWS
    ant design —— form 生成 嵌套json数据
    react 获取子组件的 state (转发)
    React 调用子组件的函数(函数)
    react js 组件传参(转发)
    链接脚本文件(.ld .lds)详解
    gcc ------ -ffunction-sections -fdata-sections -gc-sections 参数详解
    GNU ARM 汇编伪指令
    STM32 CM3/CM4 ------ startup.s 文件分析 ------ GCC RT-Thread Studio 版本
    __attribute__之section详解 ------ 把函数指定到具体某个section 之 RT-thread 实例详解
  • 原文地址:https://www.cnblogs.com/beyond-succeed/p/12572651.html
Copyright © 2011-2022 走看看