MySQL慢查询现象解决案例

 更新时间:2022年08月25日 09:50:29   作者:zhangshengdong  
这篇文章主要介绍了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中的常用参数查询,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • MySQL5.7 集群配置的步骤

    MySQL5.7 集群配置的步骤

    这篇文章主要介绍了MySQL5.7 集群配置的步骤,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-03-03
  • 如何修改mysql数据表主键

    如何修改mysql数据表主键

    这篇文章主要介绍了如何修改mysql数据表主键问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • mysql如何将数据库中的所有表结构和数据导入到另一个库

    mysql如何将数据库中的所有表结构和数据导入到另一个库

    介绍了如何使用mysqldump命令备份和导入数据库,以及创建目标数据库的步骤,首先使用mysqldump备份源数据库,然后在目标数据库中创建数据库,并将备份文件导入到目标数据库,确保数据结构和内容完整复制,提到了DataGrip、Navicat在导入导出过程中可能出现的问题
    2024-10-10
  • MySQL 常见时间字段设置小结

    MySQL 常见时间字段设置小结

    本文详细探讨了MySQL中常见时间字段的设置和处理,包括DATETIME、DATE、TIME和TIMESTAMP等类型的介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • mysql累加计算实现方法详解

    mysql累加计算实现方法详解

    这篇文章主要介绍了mysql累加计算实现方法,结合实例形势分析了mysql累加计算原理、实现方法及操作注意事项,需要的朋友可以参考下
    2020-05-05
  • mysql 5.7.9 winx64在windows上安装遇到的问题

    mysql 5.7.9 winx64在windows上安装遇到的问题

    mysql5.7.9版本以上在windwos上安装时会遇到无法启动但是没有任何报错的问题,怎么回事呢?接下来通过本文给大家介绍mysql 5.7.9 winx64在windows上安装遇到的问题及解决方法,需要的朋友可以参考下
    2016-10-10
  • MySQL更改数据字段的前几位数字的方法示例

    MySQL更改数据字段的前几位数字的方法示例

    本文主要介绍了MySQL更改数据字段的前几位数字的方法示例,包括使用SUBSTRING函数、REPLACE函数、LEFT函数,还是正则表达式或者CASE语句,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • linux下mysql 5.1 和 5.7的安装教程

    linux下mysql 5.1 和 5.7的安装教程

    下面小编就为大家分享一篇linux下mysql 5.1 和 5.7的安装教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • 简单了解MySQL SELECT执行顺序

    简单了解MySQL SELECT执行顺序

    MySQL数据据库中我们经常使用SQL SELECT语句来查询数据,那么关于它的执行顺序,下面小编来带大家简单了解一下
    2019-05-05

最新评论