最近公司做了一个千万数量级的项目,由于要求性能比较高,每一个相对慢的查询都需要优化,项目经理是一个比较有经验的开发人员,基本上遇到问题都会先自行处理:或自己分析原因或网络寻求帮助。

但是项目平稳运行一个多月后,他突然说有个SQL。怎么也不走索引,索引怎么建都不走,他查找了网络上可以找到的原因,都无法解决,最后找到我这个兼职dba。

我接到问题也是一脸懵逼,MySQL数据库,是一个表连接的SQL,查询条件列有索引,执行计划中显示索引不使用,强制使用索引也无效。多方面研究发现现象是,单表查询索引列判断等于某个字符串的查询可以使用索引,但是和其他表连接就不使用索引,最后判断是排序规则错误。

大部分索引失效原因是索引列被显式计算或隐式类型转换,其中隐式类型转换包括排序规则冲突,所谓排序规则请自行网络了解,最后解决方案是统一列的排序规则。

总结:

问题原因:排序规则主要针对字符串列,创建表时,列不指定默认表的排序规则,表不指定默认库的排序规则,所以如果建表时,列的排序规则没有指定,则使用逻辑上级的排序规则,一般都是在建库时指定排序规则,如utf8mb4_general_ci或MySQL8默认的utf8mb4_0900_ai_ci。

例如CREATE SCHEMA `库名` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

如果建表时列指定了排序规则,以指定的为准。这种东西一般不会人为指定,多数情况,是在别的项目中复制的表结构,因原库和新库的排序规则不同,原排序规则被带过来了。当表连接时,使用字符串类型的列作为表连接键时,排序规则不同引起隐式转换,导致索引失效。当使用单表查询索引列判断等于某个字符串例如【列名='abc'】时不需要统一排序规则,不会引发隐式转换,无法排查出此问题

解决方案:统一排序规则

项目上线之前执行以下SQL,会查询出指定库下的所有列的排序规则和字符集,一定要统一后,再上线

select table_name,column_name,character_set_name,collation_name
from information_schema.columns where table_schema = '库名' and data_type = 'varchar'

相关信息请查看MySQL官网对排序规则的描述

一次MySQL索引失效引发的思考的更多相关文章

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

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

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

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

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

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

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

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

  5. mysql索引失效

    在做项目的过程中,难免会遇到明明给mysql建立了索引,可是查询还是很缓慢的情况出现,下面我们来具体分析下这种情况出现的原因及解决方法   索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: ...

  6. MySQL索引失效的几种情况

    1.索引不存储null值 更准确的说,单列索引不存储null值,复合索引不存储全为null的值.索引不能存储Null,所以对这列采用is null条件时,因为索引上根本 没Null值,不能利用到索引, ...

  7. 【索引失效】什么情况下会引起MySQL索引失效

    索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件 ...

  8. 【转-mysql索引失效的几种情形】

    索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件 ...

  9. MySQL索引失效及使用索引的优缺点

    本文所有实验基于MySQL5.7.21,实验将会用到Explain工具,不了解的同学可参考此文章:MySQL性能优化神器Explain详解 联合索引失效 先创建一个包含三个字段的联合索引,索引顺序如下 ...

随机推荐

  1. day5 字符串 函数

    字符串 1.单引号,双引号,三引号括起来的都是字符串    索引  从0开始  str[0]    遍历   for循环    判断字符串中是否都是数字    ,字母  返回bool型         ...

  2. 浏览器自动化的一些体会3 webBrowser控件之零碎问题

    1. 一般需要执行这一句:webBrowser1.ScriptErrorsSuppressed = true; 主要目的是禁止跳出javascript错误的对话框,否则会导致程序无法正确地跑下去.缺点 ...

  3. Docker 的前世今生

    虚拟化 「要解释清楚 Docker,首先要解释清楚容器(Container)的概念」.要解释容器的话,就需要从操作系统说起.操作系统太底层,细说的话一两本书都说不清楚.这里就一句话来总结一下:操作系统 ...

  4. Javascript模块化编程(二):AMD规范 (转)

    原文作者: 阮一峰 日期: 2012年10月30日 这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? ...

  5. 在我们使用Redis作为一个LRU缓存的时候,怎么做才能更高效

    当用Redis作为一个LRU存储时,有些时候是比较方便的,在你增添新的数据时会自动驱逐旧的数据.这种行为在开发者论坛是非常有名的,因为这是流行的memcached系统的默认行为. LRU实际上只是支持 ...

  6. Robot Framework(4)——Selenium2Library关键字

    在第一讲的时候,已经安装了Selenium2Library这个库,这一篇主要来整理介绍一下Selenium2Library中的常用关键字,为我们之后的web自动化打好基础 一.browserManag ...

  7. 仿京东BOE官网 JavaScript代码

    let items = document.getElementsByClassName('item'); let points = document.getElementsByClassName('p ...

  8. String,StringBuffer,StringBuillder的底层结构

    一:StringBuffer的底层 (1)线程安全的字符串操作类 (2)通过synchronized关键字声明同步方法,保证多线程环境下数据安全 public synchronized StringB ...

  9. lx

    自我介绍:我是18软件技术5班 张震. -统计截止目前为止我自己写过代码3000行,我希望在本课结束后累计到10000行代码, 选择自测题17分,错题大多是运算符和运算符先 后级一类的题,编程题不会, ...

  10. 团队作业4:第六篇Scrum冲刺博客(歪瑞古德小队)

    目录 一.Daily Scrum Meeting 1.1 会议照片 1.2 项目进展 二.项目燃尽图 三.签入记录 3.1 代码/文档签入记录 3.2 Code Review 记录 3.3 issue ...