文章目录

  • 问题描述
  • 问题分析
  • 总结

大家好,我是只谈技术不剪发的 Tony 老师。今天给大家分析一个由于 MySQL 字符集不一致导致索引失效的案例。

问题描述

有个朋友给我发来一个问题,说是他们的系统有几十万用户,某个查询需要 5 秒以上的时间才能返回,同时服务器 CPU 资源占用率将近 100%。这个对于用户的线上操作影响非常大,那么我们就来看看如何分析和解决这个慢查询问题。

为了便于说明问题,我们对表结构进行了简化:

create table customer(cid int auto_increment primary key,cname varchar(50) not null,register_time datetime not null,recommender varchar(50) character set utf8
) engine=innodb default charset=utf8mb4;create unique index uk_customer_cname on customer(cname);insert into customer(cname, register_time, recommender) values('张三', now(), '');
insert into customer(cname, register_time, recommender) values('李四', now(), '张三'),('王五', now(), '李四');

customer 是用户表,其中 cid 是主键;cname 上有一个唯一索引;recommender 是用户的推荐人。

实际查询涉及了很多表,经过简化之后存在性能问题的语句如下:

select c.*
from customer c
join customer r on (c.recommender = r.cname )
where r.cid = 1
and c.register_time between now() - interval 1 day and now();

大意是查找通过某人推荐,在指定时间段内注册的用户。

问题分析

了解问题之后,首先我让他给我发来了 explain 执行计划:

explain
select c.*
from customer c
join customer r on (c.recommender = r.cname )
where r.cname = '张三'
and c.register_time between now() - interval 1 day and now();id|select_type|table|partitions|type |possible_keys    |key              |key_len|ref  |rows|filtered|Extra      |
--|-----------|-----|----------|-----|-----------------|-----------------|-------|-----|----|--------|-----------|1|SIMPLE     |r    |          |const|uk_customer_cname|uk_customer_cname|202    |const|   1|   100.0|Using index|1|SIMPLE     |c    |          |ALL  |                 |                 |       |     |   3|   33.33|Using where|

从结果可以看出,有一个全表扫描(type = ALL)的操作,显然这是因为 recommender 字段上缺少索引。

MySQL 字符集不一致导致索引失效的一个真实案例相关推荐

  1. Mysql多表关联时因关联字段类型不一致导致索引失效及查询错误

    两表关联时,因关联字段类型不一致导致的问题. 问题1. 索引失效. 问题2. 查询错误. 关联查询时int 类型的1与varchar类型的'001' 可匹配. 解决问题:利用cast(字段 as 字段 ...

  2. Mysql 多表联查索引失效问题

    问题:mysql cpu占用率100%,然后查看了一下sql 四表联查一张表进行了全盘检索 找了很久,结论是其他三个表的关联字段的字符集是utf8.一张表的关联字段的字符集是utf8mb4 把关联字段 ...

  3. mysql left join 索引失效_MySQL索引列上做操作导致索引失效案例分析

    索引列上做操作导致索引失效 通常我们认为只要建立索引就可以万事大吉,以为只要建立就一定会使用到,可其实在索引列上的计算.函数.类型转换都可能导致索引失效,所以我们不仅要会创建索引,更重要的是如何正确的 ...

  4. 【数据库】13种会导致索引失效语句写法

    数据库的索引是保证数据快速查询的重中之重,以下13种会导致索引失效语句会导致你的SQL查询索引失效,具体如下: 1.使用like关键字模糊查询时,% 放在前面索引不起作用,只有"%" ...

  5. 索引法则--LIKE以%开头会导致索引失效进而转向全表扫描(使用覆盖索引解决)...

    Mysql 系列文章主页 =============== 1 准备数据 1.1 建表 DROP TABLE IF EXISTS staff; CREATE TABLE IF NOT EXISTS st ...

  6. 索引法则--字符串不加单引号会导致索引失效

    Mysql 系列文章主页 =============== 1 准备数据 1.1 建表 DROP TABLE IF EXISTS staff; CREATE TABLE IF NOT EXISTS st ...

  7. or导致索引失效的解决方法_SQL优化之索引失效

    尽量全值匹配 建表语句: CREATE TABLE `t_logs` ( `id` int(10) NOT NULL AUTO_INCREMENT, `action` varchar(100) DEF ...

  8. MySQL高级之查询优化(索引失效)

    MySQL高级之查询优化(索引失效) 文章目录 MySQL高级之查询优化(索引失效) 一.单表使用索引及常见的索引失效 1.索引失效的案例 2.建议 二.关联查询优化 1.建表 2.案例 3.优化 三 ...

  9. mysql查询where后面索引失效_where条件索引失效情况

    虽然说索引在使用上可能有种种限制,但是还是在数据库设计中被充分利用.因为在大部分情况下索引还是被用来提高数据库性能的一个工具.不过有些数据库工程师往往会犯一些低级的错误,导致索引失效.如在Where条 ...

最新文章

  1. Elasticsearch 参考指南(脚本)
  2. IDEA 启动 Tomcat 乱码 解决办法
  3. springboot接收多对象_SpringBoot同时接收单个对象和List<object>参数
  4. CRM_ORDER_PR_ASSIGN_SELECT_CB
  5. [Leedcode][JAVA][第300题][最长上上子序列][动态规划][压缩空间]
  6. html怎么保存曲奇,自制曲奇饼能保存多久 这些存放方法你懂吗
  7. 自定义委托,事件,参数的简单随笔
  8. SCOM2007R2上监控TMG之部署Agent
  9. 基于WCF的通道网络传输数据压缩技术的应用研究
  10. CRC校验码计算:多项式除法-模2除法
  11. 数字经济的网络黑手,中科信安:勒索软件攻击比去年同期增加7倍
  12. matlab 质心,Matlab中三点确定质心
  13. 易代账好会计zip导入提示不平衡
  14. 【MATLAB】MATLAB矩阵的表示
  15. H264编码基本原理(一)
  16. 光华股份深交所上市:市值51亿 应收账款余额超5亿
  17. LIN总线解析与UART模拟LIN从机实战
  18. 万字干货!核心用户获取和运营策略
  19. 忙忙碌碌,究竟为了什么
  20. Unity内存与资源管理

热门文章

  1. 二月 Z 星月度速览 | Milvus 图形化管理工具 Attu、开箱即用的 Embedding 流水线 Towhee……...
  2. Font Awesome图标的介绍与应用
  3. 各个大厂缺这号人!大家别瞎投简历!
  4. 方法-MathType加载到word2016和powerpoint2016
  5. 【机器学习】- 仿射变换/仿射函数
  6. 应聘华为各类工程师通信基础题库以及答案-知己知彼、百战不殆
  7. 1:三层for循环计算转置矩阵的乘积
  8. SG90 180°舵机的使用
  9. Sun Solaris 修改IP地址或者主机名
  10. 【Python】实训6:基于wine和wine_quality数据集练习sklearn构建模型方法(预处理、聚类、分类、回归)