我的编程空间,编程开发者的网络收藏夹
学习永远不晚

mysql or走索引加索引及慢查询的作用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

mysql or走索引加索引及慢查询的作用

 前言

mysql or走索引加索引及慢查询的作用

小白白跑去鹅厂面试,面试官提出了一个很实际的问题: mysql增加索引,那些情况会失效呢?谈一下实际工作中遇到的情况。我们的小白白又抛出了白氏秘籍:用不用索引,找DBA小姐姐!啊?这是你面试哈,还是DBA小姐姐面试呀。

一 概述

日常处理mysql问题中,往往通过增加索引来提高查询速度,但在有些情况下,执行过程中并没有按照我们的预期结果执行,也就是说,即使字段加了索引,但现实也没有使用到,到底是什么地方出了差错,以下我们将一探究竟。

二 实验表结构声明

我们将对以下表结构进行实际案例分析:

CREATETABLE 

三 Mysql不走索引归类以及详细解析

根据实验表做具体case分析,归纳为以下几点:

1. 查询条件在索引列上使用函数操作,或者运算的情况

例如以下case是不走索引的:

explain select * from student where abs(age) =18;
explain select * from student where age + 1=18;

2. 查询条件字符串和数字之间的隐式转换

例如:name与age分别做字符串/数字(88)的隐式转换;

以下case走索引情况:

explain select * from student where name ='88'; 
explain select * from student where age='88'; 
explain select * from student where age =88;

以下case不走索引情况:

explain select * from student where name=88;

3. 特殊修饰符 %%, Or 将不走索引

explain select * from student where name like'%name%' ;
explain select * from student where name ='name' or age = 18;

4. 索引优化器选择最优的索引

这一点最重要,索引到底用不用,不是列加了索引就一定会用,而是根据索引优化器来决定。

索引优化器的存在,就是找到一个索引扫描行数最少的方案去执行语句。那么扫描行数怎么来判断的?是逐行统计数据表的数据吗?其实并不是,而是根据统计信息来估算的值。这个统计信息就是我们常说的索引的“区分度”。

显然,一个索引上不同的值越多,这个索引的区分度就越好。我们把一个索引上不同的值的个数,称之为“索引基数”。也就是说,基数越大,索引的区分度就越好,执行查询的行数就越少。如何查看索引基数呢?使用 show index from 表名,cardinality字段显示的就是索引的基数。

扩展:MySQL 是怎样得到索引基数的呢?不感兴趣的小伙伴可以飘过啦。

索引基数 = 采样统计*页数。采样统计就是避免把整张表取出来一行行统计做精准计算,以免消耗系统性能。在采样统计时,InnoDB默认会选择 N 个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数。统计信息不是固定不变的,他会随着数据表的变化而变化。当变更的数据行数超过 1/M 的时候,会自动触发重新做一次索引统计。

索引优化器实例一:

经常听人说,执行<>语句时,不走索引,今天我们将看一看实际执行情况,还是那句话,到底走不走,我们说了不算,还是索引优化器说了算:看截图 ,就会发现 <> 其实是走了索引。

mysql or走索引加索引及慢查询的作用

为什么会出现这样的情景呢?因为 student表中10W多条数据的值全都是'name',索引基数太小,所以在执行<>'1name'查询时,实际上要查询条数为10多W条,如果走了name字段索引,其实和全表查询没什么区别,况且,执行name字段索引,最终还是要转换为主键索引(二级索引查询都会转换为主键查询),所以索引优化器的优化结果是不走name索引。然而在执行<>'name'查询时,优化器优化结果是走name索引,因为,<>'name'的查询行数很小,大部分条数name字段的值都是'name'。

索引优化器实例二:

同理,前缀like匹配是走索引,但是,以下却展示了不一样的结果:

mysql or走索引加索引及慢查询的作用

为什么会这样呢?请小伙伴们参考实例一仔细思考一下。

如何指定优化器执行固定的索引?

索引优化器的存在,我们就没办法指定强制走我们指定的索引?答案就是通过 force index强制来实现,

执行语句和分析结果如下图所示:

mysql or走索引加索引及慢查询的作用

四 总结以及实际应用

实际应用中,应该牢记上述索引优化的原则,比如在实际工作中,由于索引优化器选错索引,导致数据查询缓慢,阻塞线上业务,而当时的解决办法,就是上述文章的分析过程,以及采用force 强制索引才解决的,前车之鉴,希望广大读者避免踩坑。

到此这篇关于mysql or走索引加索引及慢查询的作用的文章就介绍到这了,更多相关mysql or索引 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

mysql or走索引加索引及慢查询的作用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL索引原理及慢查询优化

MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上看到诸如&
2022-05-31

MySQL索引失效原因及SQL查询语句不走索引原因是什么

这篇“MySQL索引失效原因及SQL查询语句不走索引原因是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL索引失
2023-03-07

MySQL索引失效原因以及SQL查询语句不走索引原因详解

目录前言1. 隐式的类型转换,索引失效2. 查询条件包含 or,可能导致索引失效3. like 通配符可能导致索引失效4. 查询条件不满足联合索引的最左匹配原则5. 在索引列login_time上使用 mysql 的内置函数6. 对索引列a
2023-03-06

MySQL索引查询的具体使用

本文主要介绍了MySQL索引查询的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-19

MySQL索引查询limit offset及排序order by用法

目录引言使用 limit 和 offset 来限制返回的数量1、limit2、offsetorder by 的如下几个用法1、order by 的升序、倒序2、多个字段排序3、按照中文排序引言“ 这是mysql系列笔记的第九篇
2023-05-20

MySQL添加索引的作用是什么

MySQL添加索引的作用是提高查询性能。索引可以加快数据库的查询速度,特别是在查询大量数据时,可以显著减少查询的时间。通过为经常查询的列添加索引,可以使查询更加高效,加快数据的检索和处理速度。此外,索引还可以帮助数据库系统对数据进行排序和过
MySQL添加索引的作用是什么
2024-04-09

使用 MySQL 中的复合索引使慢速查询变得更快

让我们首先看看什么是复合索引 -复合索引是在多个列上使用的索引。 也称为多列索引。MySQL 允许用户创建复合索引,该索引最多可以包含16 列。查询优化器使用复合索引进行查询,这将测试索引中的所有列。它也可用于测试第一列、前两列等的查询。如
2023-10-22

MySQL的索引原理以及查询优化是怎样的

本篇文章为大家展示了MySQL的索引原理以及查询优化是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、介绍1.什么是索引?一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作
2023-06-22

记mysql中delete操作中使用in不会走索引的问题

目前负责的一个项目,需要维护一个电话号码对比库,表名为phone_bak1,以下称为a表,量级为3000万条。还有另外一张表存储电话白名单,表名为phone_delete,以下称为b表,量级为3000条左右。  目的呢,是要从a表中排除掉在b表中的电话号码。 
记mysql中delete操作中使用in不会走索引的问题
2020-05-20

MySQL全文索引如何解决like模糊匹配查询慢的问题

这篇文章主要讲解了“MySQL全文索引如何解决like模糊匹配查询慢的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL全文索引如何解决like模糊匹配查询慢的问题”吧!需求需要模
2023-07-04

编程热搜

目录