MySQL 字符集不一致导致索引失效的一个真实案例
文章目录
- 问题描述
- 问题分析
- 总结
大家好,我是只谈技术不剪发的 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 字符集不一致导致索引失效的一个真实案例相关推荐
- Mysql多表关联时因关联字段类型不一致导致索引失效及查询错误
两表关联时,因关联字段类型不一致导致的问题. 问题1. 索引失效. 问题2. 查询错误. 关联查询时int 类型的1与varchar类型的'001' 可匹配. 解决问题:利用cast(字段 as 字段 ...
- Mysql 多表联查索引失效问题
问题:mysql cpu占用率100%,然后查看了一下sql 四表联查一张表进行了全盘检索 找了很久,结论是其他三个表的关联字段的字符集是utf8.一张表的关联字段的字符集是utf8mb4 把关联字段 ...
- mysql left join 索引失效_MySQL索引列上做操作导致索引失效案例分析
索引列上做操作导致索引失效 通常我们认为只要建立索引就可以万事大吉,以为只要建立就一定会使用到,可其实在索引列上的计算.函数.类型转换都可能导致索引失效,所以我们不仅要会创建索引,更重要的是如何正确的 ...
- 【数据库】13种会导致索引失效语句写法
数据库的索引是保证数据快速查询的重中之重,以下13种会导致索引失效语句会导致你的SQL查询索引失效,具体如下: 1.使用like关键字模糊查询时,% 放在前面索引不起作用,只有"%" ...
- 索引法则--LIKE以%开头会导致索引失效进而转向全表扫描(使用覆盖索引解决)...
Mysql 系列文章主页 =============== 1 准备数据 1.1 建表 DROP TABLE IF EXISTS staff; CREATE TABLE IF NOT EXISTS st ...
- 索引法则--字符串不加单引号会导致索引失效
Mysql 系列文章主页 =============== 1 准备数据 1.1 建表 DROP TABLE IF EXISTS staff; CREATE TABLE IF NOT EXISTS st ...
- or导致索引失效的解决方法_SQL优化之索引失效
尽量全值匹配 建表语句: CREATE TABLE `t_logs` ( `id` int(10) NOT NULL AUTO_INCREMENT, `action` varchar(100) DEF ...
- MySQL高级之查询优化(索引失效)
MySQL高级之查询优化(索引失效) 文章目录 MySQL高级之查询优化(索引失效) 一.单表使用索引及常见的索引失效 1.索引失效的案例 2.建议 二.关联查询优化 1.建表 2.案例 3.优化 三 ...
- mysql查询where后面索引失效_where条件索引失效情况
虽然说索引在使用上可能有种种限制,但是还是在数据库设计中被充分利用.因为在大部分情况下索引还是被用来提高数据库性能的一个工具.不过有些数据库工程师往往会犯一些低级的错误,导致索引失效.如在Where条 ...
最新文章
- Elasticsearch 参考指南(脚本)
- IDEA 启动 Tomcat 乱码 解决办法
- springboot接收多对象_SpringBoot同时接收单个对象和List<object>参数
- CRM_ORDER_PR_ASSIGN_SELECT_CB
- [Leedcode][JAVA][第300题][最长上上子序列][动态规划][压缩空间]
- html怎么保存曲奇,自制曲奇饼能保存多久 这些存放方法你懂吗
- 自定义委托,事件,参数的简单随笔
- SCOM2007R2上监控TMG之部署Agent
- 基于WCF的通道网络传输数据压缩技术的应用研究
- CRC校验码计算:多项式除法-模2除法
- 数字经济的网络黑手,中科信安:勒索软件攻击比去年同期增加7倍
- matlab 质心,Matlab中三点确定质心
- 易代账好会计zip导入提示不平衡
- 【MATLAB】MATLAB矩阵的表示
- H264编码基本原理(一)
- 光华股份深交所上市:市值51亿 应收账款余额超5亿
- LIN总线解析与UART模拟LIN从机实战
- 万字干货!核心用户获取和运营策略
- 忙忙碌碌,究竟为了什么
- Unity内存与资源管理
热门文章
- 二月 Z 星月度速览 | Milvus 图形化管理工具 Attu、开箱即用的 Embedding 流水线 Towhee……...
- Font Awesome图标的介绍与应用
- 各个大厂缺这号人!大家别瞎投简历!
- 方法-MathType加载到word2016和powerpoint2016
- 【机器学习】- 仿射变换/仿射函数
- 应聘华为各类工程师通信基础题库以及答案-知己知彼、百战不殆
- 1:三层for循环计算转置矩阵的乘积
- SG90 180°舵机的使用
- Sun Solaris 修改IP地址或者主机名
- 【Python】实训6:基于wine和wine_quality数据集练习sklearn构建模型方法(预处理、聚类、分类、回归)