您现在的位置是:亿华云 > 域名
程序员经典面试题:为什么MySQL偶尔会选错索引?
亿华云2025-10-04 03:42:59【域名】2人已围观
简介在此之前,我做过不少ToC的项目,在ToC的应用场景中,业务一般都是比较简单,基本上没有多少复杂的查询(基本上,只要建立用户ID为索引,就能够大大提升查询效率了。)这两年,也逐渐接触到一些ToB的业务
在此之前,程序我做过不少ToC的员经项目,在ToC的典面应用场景中,业务一般都是试题索引比较简单,基本上没有多少复杂的选错查询(基本上,只要建立用户ID为索引,程序就能够大大提升查询效率了。员经)这两年,典面也逐渐接触到一些ToB的试题索引业务,发现ToB的选错业务,真的程序是比ToC的要复杂一些。举个简单的员经例子,ToB应用中,典面最痛苦的试题索引事情就是组织架构,原本查询一个人的选错数据,可能变成查询一个小组,一个部门,甚至是一个分公司的数据。
不仅如此,服务器托管由于不同职级的员工的查询权限可能不一样。查询条件比ToC场景中复杂得多,所以有时候一张表,会建立好多个不同的索引。后时候我们就会发现,怎么查询莫名其妙就变得很慢了。按道理说,如果命中了我们想要的索引,应该很快才对。
于是,我们就对Sql语句进行分析,发现Mysql使用的是另外一个索引,但是在这个业务下,使用另外一个索引会得到更好的结果,为什么Mysql会选错索引呢?很显然,存储很难会去理解业务的实际情况,Mysql也需要一定的算法才能评估出索引的优劣,Mysql是这样进行评分的。
Mysql对索引的服务器租用评分的首要原则,就是索引的差异度最大,举个例子,假如是一个小学生信息查询系统,我们以出生日期建立索引,那么大概就有365*7个不同的值,假如我们以学生的性别作为索引,那么基本上就只有2个不同的值了,假如一个查询条件同时包含出生日期跟性别,那么Mysql必然优先选基数更大的作为索引,也就是出生日期作为索引。
那但是,Mysql实际上并不理解什么是出生日期,什么是性别,他们是判断哪一个基数更大的呢?非常简单,把索引扫一遍不就知道结果了么?我们只要在索引树上扫一遍,就能够知道不同的Key有多少个。但是云服务器提供商,假如我们的数据越来越多,每次都把所有的索引树都扫描一遍并不现实。基于大多数的互联网应用都是读多写少的,Mysql会把索引的评分记录一段时间,但是,每次触发重新评估的时候,仍要花费不少的时间。
Mysql采用抽样调查的方式,随机从各个索引树上面取一定的页数,通过统计这些页数对索引进行评估。现在回到我们现实的开发中,不知道你有没有遇到过这样的问题,一些异常状态占总数量非常少,例如退货退款的订单只占总订单的少数,但是你使用Mysql查询的时候却很命中这个索引。就是因为在Mysql评估分数的时候,大多数时候都会觉得这个索引上面不同数据量很少,所以打了低分。所以,如果你有这种特殊的业务场景,最好进行指定索引。
好了,今天我们简单介绍了mysql的索引选择,不知道对你是否有所启发,欢迎大家关注我,共同学习,共同进步。大家的支持是我继续唠嗑的动力。
很赞哦!(51)
相关文章
- 只要我们做的是从目前的市场情况选择域名,从简单易记,从个性特征上,我们就可以找到一个好域名进行注册。域名注册进行域名记录和解析以及绑定网站后,客户可以通过URL登录您的网站。
- 多起宕机事故发生,竟都归咎于最初的失败设计……
- 我的 JavaScript 比你的 Rust 更快
- 运营商数据库选型有哪些需求?
- 在数以亿计的网站中,我们应该抓住每一个可能带来宣传的机会,域名可以带有企业的名字,一般可以使用汉语拼音或者英语单词或者是相关缩写的形式,只要用户记住了你企业的名字,就能很容易的打出你的网站域名,同样的,记住了网站域名也能很快的记住你公司的名字。
- 基于目标TPS的性能测试,如何通过手动设置场景进行测试?
- 用Python绘制超酷的gif动图,惊艳了所有人
- 超详细的Oracle 11g安装后参数设置规范,值得收藏
- 为什么现在中文域名觉得好?使用中文域名有什么好处?
- 为什么越来越多的人选择Spring Boot?