• mysql 索引失效情况/sql提示/覆盖索引和回表查询


    索引失效

    1:模糊查询,当我们建立一个索引emp_name时,对emp_name进行模糊查询时,索引是不会生效的,因为搜索树不支持[学了数据结构就是爽]

    2:or条件查询,当我们写了一个由or链接的条件语句时,当且仅当语句中存在一个或以上的字段没有建立索引时,语句中的全部索引都不会生效,这个很好理解,因为存在一个无索引字段说明我们要对整个表进行一次扫描,这个时间复杂度是o(n)的,所以o(logn / 1)的查询就变得没有必要了

    3:字符字段不加双引号,这个...I don't understand

    4 :mysql评估使用索引比全表扫描还慢的话,则不使用索引;

    sql提示

    使用情景:

    当我们写一个查询语句时,用到的条件语句可以对于多个索引,系统会评判索引的效率,然后选择使用哪个索引,但是有的时候我们需要指定某个索引,这个时候我们就可以用sql提示了

    1:use提示

            建议系统用每个索引,但是最终决策权在系统。

    select 字段1,字段2... from table use(index_name) where expression

    2:ignore提示

            与use相反,ignore是建议系统忽略某个索引

    select 字段1,字段2... from table ignore(index_name) where expression

    3:force提示

            强制系统使用某个索引,如果指定的索引不合法,则报错

    select 字段1,字段2... from table force(index_name) where expression

    覆盖索引/回表查询

    首先,索引分为聚集索引和辅助索引,在B+树结构中,聚集索引中的叶子节点会存储一行的数据,辅助索引是存储对于行的聚集索引字段,当我们要查询一行的所有数据且用辅助索引时,系统会先在辅助索引中找到对应行的聚集索引的字段和辅助索引的字段,然后根据聚集索引来找到对应行数据并返回;

    这里就引申出覆盖索引和回表查询的概念了,首先我们用select语句定然是要访问某些字段的,如果我们用辅助索引来查询,且查询的字段为被辅助索引中的字段和聚集索引的字段并集的子集,那么我们是不需要访问聚集索引了,因为我们需要查询的子段已经找到了,这就是覆盖查询

    回表查询是“通过辅助索引找到聚集索引的字段如,然后到聚集索引找数据”的过程

  • 相关阅读:
    私有化部署的即时通讯平台,为企业移动业务安全保驾护航
    L2-035 完全二叉树的层序遍历(Python)
    Jetson 设备docker全局代理映射方法以及迁移到ssd硬盘
    Springboot+swagger2
    06-Redis缓存高可用集群
    mysql面试题33:Blob和text有什么区别
    ZooKeeper 6:分布式系统及相关理论
    用这8种方法在海外媒体推广发稿平台上获得突破-华媒舍
    SpringBoot异常处理
    你的Spring应用启动很慢?不妨试试这个工具!
  • 原文地址:https://blog.csdn.net/weixin_62953519/article/details/127441014