您现在的位置是:网站首页> 编程资料编程资料
MySQL慢查询现象解决案例_Mysql_
2023-05-26
463人已围观
简介 MySQL慢查询现象解决案例_Mysql_
背景
线上慢查询日志监控,得到如下的语句:
发现:select doc_text from t_wiki_doc_text where doc_title = '谢泽源'; 这条语句昨天执行特别的慢
1.查看上述语句的执行计划
mysql> explain select doc_text from t_wiki_doc_text where doc_title = '谢泽源'; +----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+ | 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE noticed after reading const tables | +----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+ 1 row in set (0.01 sec)
发现了Impossible where noticed after reading const tables,这是一个有趣的现象?(经查找,这个会全表扫描)
解释原因如下:
根据主键查询或者唯一性索引查询,如果这条数据没有的话,它会全表扫描,然后得出一个结论,该数据不在表中。
对于高并发的库来说,这条数据,会让负载特别的高。
查看线上的表结构,也印证的上述说法:
| t_wiki_doc_text | CREATE TABLE `t_wiki_doc_text` ( `DOC_ID` bigint(12) NOT NULL COMMENT '词条ID流水号', `DOC_TITLE` varchar(255) NOT NULL COMMENT '条目原始标题', `DOC_TEXT` mediumtext COMMENT '条目正文', PRIMARY KEY (`DOC_ID`), UNIQUE KEY `IDX_DOC_TITLE` (`DOC_TITLE`)(唯一索引) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
对此,我在自己的数据库里面,做了一个测试。
2.测试模拟
1).建立一个有唯一索引的表。
CREATE TABLE `zsd01` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, UNIQUE KEY `idx_name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk
2).插入两条数据
insert into zsd01 values(1,'a'); insert into zsd01 values(2,'b');
3).分析一个没有数据记录的执行计划。(例如select name from zsd01 where name ='c'; )
mysql> explain select name from zsd01 where name ='c'; +----+-------------+-------+------+---------------+------+---------+------+----- -+-----------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+----- -+-----------------------------------------------------+ | 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE noticed after reading const tables | +----+-------------+-------+------+---------------+------+---------+------+----- -+-----------------------------------------------------+
发现跟上述情况一模一样。
4.) 修改表结构为只有一般索引的情况。
CREATE TABLE `zsd01` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, KEY `idx_normal_name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk
5.) 查看执行计划。
mysql> explain select name from zsd01 where name ='c'; +----+-------------+-------+------+-----------------+-----------------+--------- +-------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+-----------------+-----------------+--------- +-------+------+--------------------------+ | 1 | SIMPLE | zsd01 | ref | idx_normal_name | idx_normal_name | 43 | const | 1 | Using where; Using index | +----+-------------+-------+------+-----------------+-----------------+--------- +-------+------+--------------------------+ 1 row in set (0.00 sec)
发现,就正常走了一般索引,rows=1的执行开销。
结论:从上述的例子和现象可以看出,如果数据不用唯一的话,普通的索引比唯一索引更好用。
到此这篇关于MySQL慢查询现象解决案例的文章就介绍到这了,更多相关MySQL慢查询内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
您可能感兴趣的文章:
相关内容
- mysql索引(覆盖索引,联合索引,索引下推)_Mysql_
- 修改MySQL密码的四种方法总结(适合初学者!)_Mysql_
- mysql日志系统redo log和bin log介绍_Mysql_
- MYSQL 增加从库方式介绍_Mysql_
- 一文带你永久摆脱Mysql时区错误问题(idea数据库可视化插件配置)_Mysql_
- mysql 中的备份恢复,分区分表,主从复制,读写分离_Mysql_
- MySQL乐观锁和悲观锁具体实现_Mysql_
- Mysql 5.7 新特性之 json 类型的增删改查操作和用法_Mysql_
- Mysql使用函数json_extract处理Json类型数据的方法实例_Mysql_
- MySQL数据库线上修改表结构的方法_Mysql_
