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

 更新时间:2022年09月09日 14:58:21   作者:weixin_39908985  
这篇文章主要介绍了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 的时候,会自动触发重新做一次索引统计。

索引优化器实例一:

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

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

索引优化器实例二:

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

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

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

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

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

四 总结以及实际应用

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

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

相关文章

  • MySQL在不知道列名情况下的注入详解

    MySQL在不知道列名情况下的注入详解

    这篇文章主要给大家介绍了关于MySQL在不知道列名情况下的注入的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • MySQL COUNT函数的使用与优化

    MySQL COUNT函数的使用与优化

    优化COUNT函数的查询在 MySQL 中最容易被误解的话题中能够排进前10名,我们可以在网上搜索了解更多关于 COUNT 优化的误解信息。在进行优化前,理解 COUNT 到底做了什么很重要。
    2021-05-05
  • MySQL中DATE_FORMAT()函数的具体使用

    MySQL中DATE_FORMAT()函数的具体使用

    本文主要介绍了MySQL中DATE_FORMAT()函数的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • MySQL数据库终端—常用操作指令代码

    MySQL数据库终端—常用操作指令代码

    这篇文章主要介绍了MySQL数据库终端—常用操作指令代码,添加用户、更改用户名和host主机、更改密码、删除用户等等,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-01-01
  • mysql 如何动态修改复制过滤器

    mysql 如何动态修改复制过滤器

    这篇文章主要介绍了mysql 如何动态修改复制过滤器,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下
    2020-11-11
  • MySql如何查看索引并实现优化

    MySql如何查看索引并实现优化

    这篇文章主要介绍了MySql如何查看索引并实现优化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • mysql蠕虫复制基础知识点

    mysql蠕虫复制基础知识点

    在本篇内容中我们给大家分享了关于mysql蠕虫复制基础知识点,对此有需要的朋友们跟着学习下吧。
    2019-02-02
  • mysql给id设置默认值为UUID的实现方法

    mysql给id设置默认值为UUID的实现方法

    由于mysql并不支持默认值为函数类型,给id设值有两种方式,本文主要介绍了mysql给id设置默认值为UUID的实现方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • 阿里云下配置MySQL远程连接的步骤详解

    阿里云下配置MySQL远程连接的步骤详解

    大家都知道阿里云默认是不能用客户端远程连接的,但最近因为工作的需要,不得不实现远程连接,下面这篇文章主要给大家介绍了在阿里云下配置MySQL远程连接的步骤,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • windows10下 MySQL msi安装教程图文详解

    windows10下 MySQL msi安装教程图文详解

    这篇文章主要介绍了windows10 MySQL msi安装教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论