美文网首页MySQLMySQL面试题
面题:mysql 在执行 sql 的时候是如何选择使用哪个索引的

面题:mysql 在执行 sql 的时候是如何选择使用哪个索引的

作者: nged | 来源:发表于2019-06-10 22:08 被阅读19次

    面试中,当面试官问出这个问题时,你觉得这是在考察mysql的什么内容?我当时脑子过了一下,我知道一条sql在执行的时候,会经过查询缓存,sql解析器,预处理器,sql优化器,生成执行计划,调用存储过程的api,数据,这样一个大概过程。mysql在选择索引是在sql优化器这一步,但是具体如何选择索引的,我并没有读过源码,所以这个问题就GG了。

    回家后,我还在想这题到底考察的什么,并且查了一些资料,搞清楚了选择是怎么一回事。在不考虑临时表和排序的情况下,优化器的目的是通过选择合适索引找到扫描数据行数最少的方案,即选择“选择性”较高的索引。选择性=基数/数据总数。索引基数是数据列所包含的不同值的数量。扫描行多少涉及到索引“基数”,但是“基数”通过采样来统计,本身是估算出来的而且不是实时的,索引数据不够精准,导致最终选出的方案在优化器看来最优,但实际执行起来并不是最优。 mysql 优化器最终选择哪个索引,需要具体采样数据来决定的,我们并不能看出来或者算出来。

    但是优化器如果因为不准确的采样基数,无法选择最优索引怎么办? 这道题引申出的考察点如何干预mysql选择索引。如何让 mysql 能选择我们为某个 sql 所设计的最优索引,而不会因为优化器选择其他索引导致性能问题。

    方法一,在sql中通过 force index 指定索引,等于直接告诉优化器不要用你那不靠谱的采样了,就用这个索引吧。缺点就是耦合性太强,如果你换一个更好的index那你要去改sql了,维护麻烦。   

    方法二,analyze table,主动让让索引的基数重新计算一下。缺点,不够实时,不够灵活,你不看着点又会跑偏了。

    方法三,找出老是被错误选择的索引,如果作用不是很大,简单粗暴,删除。整个世界就清爽了。 

相关文章

  • 面题:mysql 在执行 sql 的时候是如何选择使用哪个索引的

    面试中,当面试官问出这个问题时,你觉得这是在考察mysql的什么内容?我当时脑子过了一下,我知道一条sql在执行的...

  • Mysql 索引优化

    联合索引和单个索引选择 对比,值越大越好 强制使用某个索引 使用explain分析索引 1、id:SQL执行的顺序...

  • 2. mysql 为什么会选错索引

    上节我们讲了mysql的整体架构,知道了优化器的作用是优化sql,选择索引,生成执行计划。索引是优化器阶段自己选择...

  • mysql之索引统计

    mysql中一张表支持多个索引,但是在写SQL语句的时候,并没有主动指定使用哪个索引。 1、删除历史数据和新增数据...

  • MySQL索引优化

    trace工具 MySQL执行的跟踪工具,通过trace可以查询sql语句具体使用中使用了哪些索引以及索引的性能比...

  • 【MySQL】10|MySQL为什么有时会选错索引?

    我们都知道在MySQL中一张表可以支持多个索引。但是我们在写sql的时候,并没有主动指定使用哪个索引,也就是说,使...

  • Mysql架构

    在具体执行SQL语句之前,要先经过优化器的处理– 当表中有多个索引的时候,决定用哪个索引– 当sql语句需要做多表...

  • mongodb索引

    先题几个问题 什么是索引? 如何建立索引? 如何选择建立索引的字段? 如何强制使用索引? 如何评估索引效率? 如果...

  • 01.MySQL架构与SQL执行流程

    MySql笔记,笔记分为四个部分:1.MySQL架构与SQL执行流程2.MySQL索引原理与使用原则[https:...

  • MySQL实战13 Explain详解与索引最佳实践

    MySQL实战 目录使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是 如何处理你的SQL...

网友评论

    本文标题:面题:mysql 在执行 sql 的时候是如何选择使用哪个索引的

    本文链接:https://www.haomeiwen.com/subject/ejatfctx.html