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

MySQL 字符集不一致导致索引失效的一个真实案例,第1张

概述MySQL 字符集不一致导致索引失效的一个真实案例,通过 explain 和 show warnings 发现索引没有被使用,而且存在字符集转换的 *** 作。通过修改字段的字符集之后,解决了慢查询的性能问题。


文章目录 问题描述问题分析总结

大家好,我是只谈技术不剪发的 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, recommender) values('李四', '张三'),('王五', '李四');

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

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

select c.*from customer cjoin customer r on (c.recommender = r.cname )where r.cID = 1and c.register_time between Now() - interval 1 day and Now();

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

问题分析

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

explainselect c.*from customer cjoin 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 字符集不一致导致索引失效的一个真实案例全部内容,希望文章能够帮你解决MySQL 字符集不一致导致索引失效的一个真实案例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1152161.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存