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的操作。'

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

    奔跑吧,蜗牛~

  • 相关阅读:
    Asp.net 动态添加Meta标签
    【转】在SharePoint Server 2010中更改“我的网站”
    SPQuery DateTime 类型查询
    Asp.net Web Application 打开 SharePoint 2010 Site 错误 The Web application at could not be found
    How To Create SharePoint 2010 Site Collection In Its Own DB
    C# 文件打印
    面试题 java集合
    《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读
    《深入理解Java虚拟机》(五)JVM调优
    《深入理解Java虚拟机》(四)虚拟机性能监控与故障处理工具
  • 原文地址:https://www.cnblogs.com/beyond-succeed/p/12572651.html
Copyright © 2011-2022 走看看