Mysql索引失效场景

 

序言

 
  众所周知在Mysql中,通过使用索引的方式可以加快查询速度,从而避免全文搜索;而索引本身就像图书馆中所有书籍目录,通过查询关键字就能快速找到目标书籍在几列几行,这便是索引的原理,下图是平常索引失效的集中情况

 

正文

1、or使用不恰当

例如:User表中的两个字段ID、Name,ID本身为主键,那么Mysql会为该字段默认添加聚簇索引;而Name却没有建立索引,如果,在查询条件 ID=12 or Name ='Jay'中,由于ID存在索引那么Mysql本应该走索引进行查询,但是。or关键词的使用导致最后会查询满足另一个条件Name ='Jay',此条件却没有索引,那么意味着必须走全局检索;Mysql此时就会优化查询逻辑,字段ID也不会走索引(因为没有必要了,在全文检索Name时额外加入ID条件就行了),这样就能避免第二次查询

select ID,name from user where ID = 12 or name = 'jay'
--ID 存在索引,name不存在索引,优化原因统一不走索引

2、最左匹配原则

想要完全理解最左匹配原则,则需要理解Mysql中的索引树- B+ TREE,了解B+ TREE后理解最左匹配原则就非常容易了;

如上图所示,在Mysql组合索引中建立的索引匹配则是从最左往右进行匹配,如果,左边成立才会匹配邻近的下一个组合索引值,例如:组合索name,like组成,而查询的条件则是name ='jay',这时就会匹配组合索引name='jay'数据,如果,条件like='rapper'时则无法触发索引,因为,索引匹配原则遵循的就是最左匹配

3、not in not exists != <>

上述关键字和表达式无法触发索引,原因是无法通过索引匹配数据,只能通过全文遍历数据。

4、like %最左包含

like %最左包含会触发数据库的全文检索,检索时间会跟随数据而增长。

5、使用内置函数

在Mysql中的条件表达列中将Mysql内置函数作为第一人称条件会导致不走索引的情况,这钟情况下将内置函数至于第三人称即可。

6、索引参与运算、多个索引列进行比较

索引列参与运算也会导致索引失效。

7、联表查询时各表编码集不一致

在使用多个表进行连接查询时,如果,各表之间的编码字符集不一致也会导致不走索引情况出现。

8、表中的数据量少

Mysql中会存在Sql查询/优化器,该优化器会优化用户组织的T-SQL语句和查询逻辑;如果表中的数据量太少,这种情况下则不用走索引查询,因为,全文遍历所耗费的时间很少。

9、没有创建索引

10、select*

使用select*时也会导致不走索引的情况出现;在阿里开发手册中,不建议使用*,无论是从编码逻辑还是执行速度上都不建议。

11、隐式转换

在查询表达式中使用与字段不对应的数据类型时,也会导致不走索引的情况出现。

总结

通过Mysql explain关键字可以解释当前sql执行情况,从而分析每个阶段查询的耗时情况,索引引用的情况。

Mysql索引失效场景的更多相关文章

  1. Mysql 索引失效场景

    例如:一张USER表   有字段属性 name,age   其中name为索引 下面列举几个索引失效的情况 1. select * from USER where name=‘xzz’ or age= ...

  2. 《MySQL面试小抄》索引失效场景验证

    我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统,自己无法快速定位到关键问题点!!! 本期主要面试考点 面试官考点之什么情况下会索 ...

  3. MySQL索引失效的常见场景

    当然请记住,explain是一个好习惯! MySQL索引失效的常见场景 在验证下面的场景时,请准备足够多的数据量,因为数据量少时,MySQL的优化器有时会判定全表扫描无伤大雅,就不会命中索引了. 1. ...

  4. MySQL索引失效之隐式转换

    常见索引失效: 1. 条件索引字段"不干净":函数操作.运算操作 2. 隐式类型转换:字符串转数值:其他类型转换 3. 隐式字符编码转换:按字符编码数据长度大的方向转换,避免数据截 ...

  5. 面试突击60:什么情况会导致 MySQL 索引失效?

    为了验证 MySQL 中哪些情况下会导致索引失效,我们可以借助 explain 执行计划来分析索引失效的具体场景. explain 使用如下,只需要在查询的 SQL 前面添加上 explain 关键字 ...

  6. mysql索引总结(4)-MySQL索引失效的几种情况

    mysql索引总结(1)-mysql 索引类型以及创建 mysql索引总结(2)-MySQL聚簇索引和非聚簇索引 mysql索引总结(3)-MySQL聚簇索引和非聚簇索引 mysql索引总结(4)-M ...

  7. 面试题: MySQL 索引失效的10大原因

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.建表: CREATE TABLE staffs ( id INT PRIMARY KEY AUTO_ ...

  8. MySQL索引失效的几种场景

    我们都知道建立索引能够提高查询效率,那么是不是任何情况下都能提高呢,当然不是的的,下面我们就来列举一些常见的索引失效的场景. 借用上一篇文章的dm_person_info表 在card_code列没加 ...

  9. 3、MySQL 索引失效的场景

    索引失效的场景: 1.没有 where 条件 直接看 SQL 语句   2.where 条件中所在的列没有建立索引 show index from t;   3.从表中取得数据超过某个阈值.通常认为是 ...

  10. MySQL 索引失效-模糊查询,最左匹配原则,OR条件等。

    索引失效 介绍 索引失效就是我们明明在查询时的条件为索引列(包括自己新建的索引),但是索引不能起效,走的是全表扫描.explain 后可查看type=ALL. 这是为什么呢? 首先介绍有以下几种情况索 ...

随机推荐

  1. SE54视图簇

    一.创建关联表 头表 行表 设置行表的外键  创建两张表的表维护生成器,此处不再展开 二.SE54视图簇 激活上述 三.创建事务代码维护 四.效果展示 定期更文,欢迎关注 TRANSLATE with ...

  2. 如何在传统前端项目中进行javascript模块化编程,并引入使用vue.js、element-ui,并且不依赖nodejs和webpack?

    最近接手一个Web三维项目,前后端分离,前端是传统的前端项目,但又是模块化的开发方式,在修改的过程中,我需要做一些增删改查的功能,又想尽可能少的写css.尽可能少的直接操作DOM元素,所以引入了ele ...

  3. Python使用pandas库读取csv文件,并分组统计的一个例子

    代码: # coding=gbk # 从HostWrites.csv读取数据并分组统计 import pandas import datetime print "\r\n从 HostWrit ...

  4. 解决MySQL在连接时警告:WARN: Establishing SSL connection without server's identity verificatio

    起因: 程序在启动时,连接MySQL数据库,发出警告️: Establishing SSL connection without server's identity verification is n ...

  5. AtCoder Beginner Contest 210 (A~E)

    比赛链接:Here A - Cabbages 略 B - Bouzu Mekuri 略 C - Colorful Candies 用map维护连续一段区间的不同元素即可. int main() { c ...

  6. 【每日一题】36. 小AA的数列 (二进制DP)

    补题链接:Here 算法涉及:位运算,DP 这道题想了很久但实在没想什么巧妙的解法,暴力的代码就不放,这里引用Kur1su 的思路 异或问题优先考虑二进制位,对于这个问题,我们需要考虑偶数长度的区间, ...

  7. 版本升级 | v1.0.12发布,许可证风险早知道

    新版本来啦~~~~ 一.v1.0.12更新内容 优化许可证检出功能,可通过JSON / HTML / SPDX 报告获知许可证信息 支持HTML报告自定义分页 二.更新说明 1. 优化许可证检出功能, ...

  8. 无需修改代码,用 fcapp.run 运行你的 REST 应用

    作者 | 阿里云 Serverless 技术研发 落语 背景 阿里云函数计算产品在较早的时候支持了HTTP触发器能力,支持用户使用 HTTP 协议进行函数调用.函数计算后端通过一个共享的 APISer ...

  9. vue-draggable 学习和使用

    vue-draggable 学习和使用 https://www.jianshu.com/p/e8ff1e1cafb1

  10. [QML]从零开始QML开发(二)QML开发,浅谈控件、槽函数、锚等基本概念。QML和C++怎么交互?贯彻落实MVC原则

    [QML]从零开始QML开发(二)QML开发,浅谈控件.槽函数.锚等基本概念.QML和C++怎么交互?贯彻落实MVC原则 先看代码: import QtQuick 2.12 import QtQuic ...