线上MySQL慢查询现象案例

  • 时间:
  • 浏览:1

UNIQUE KEY `idx_name` (`name`)

背景:线上慢查询日志监控,得到如下的说说:

对此,我在当事人的数据库里面,做了一另一另一个测试。 ----------------------------------------------------测试模拟-----------------------------------------------------------

1).建立一另一另一个有唯一索引的表。

| id | select_type | table | type | possible_keys | key | key_len

-+-----------------------------------------------------+

| const | 1 | Using where; Using index |

| id | select_type | table | type | possible_keys | key | key_len | ref | rows

前言:2012年的笔记派发而得,发布当事人博客,做备忘录使用。

发现,就正常走了一般索引,rows=1的执行开销。

结论:从上述的例子和什么的什么的问题都都里能 看出,肯能数据不想唯一说说,普通的索引比唯一索引更好用。

+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+

KEY `idx_normal_name` (`name`)

+----+-------------+-------+------+-----------------+-----------------+---------

根据主键查询肯能唯一性索引查询,肯能这条数据没法说说,它会全表扫描,之后得出一另一另一个结论,该数据不在 表中。

CREATE TABLE `zsd01` (

+----+-------------+-------+------+---------------+------+---------+------+-----

+-------+------+--------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

1.查看上述说说的执行计划:

insert into zsd01 values(1,'a');

发现跟上述情况汇报一模一样。

+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+

Impossible WHERE noticed after reading const tables |

) ENGINE=InnoDB DEFAULT CHARSET=gbk

| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE noticed after reading const tables |

+-------+------+--------------------------+

insert into zsd01 values(2,'b');

| Extra |

对于高并发的库来说,这条数据,会让负载特别的高。

| 1 | SIMPLE | zsd01 | ref | idx_normal_name | idx_normal_name | 43

3).分析一另一另一个没法数据记录的执行计划。(累似 select name from zsd01 where name ='c'; )

| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL

发现了Impossible where noticed after reading const tables,这是一另一另一个有趣的什么的什么的问题?(经查找,累似 会全表扫描)

mysql> explain select name from zsd01 where name ='c';

`name` varchar(20) DEFAULT NULL,

+----+-------------+-------+------+---------------+------+---------+------+-----

`id` int(11) DEFAULT NULL,

+----+-------------+-------+------+---------------+------+---------+------+-----

`DOC_ID` bigint(12) NOT NULL COMMENT '词条ID流水号',

UNIQUE KEY `IDX_DOC_TITLE` (`DOC_TITLE`)(唯一索引)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

-+-----------------------------------------------------+

5.) 查看执行计划。

+----+-------------+-------+------+-----------------+-----------------+---------

`name` varchar(20) DEFAULT NULL,

+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+

mysql> explain select name from zsd01 where name ='c';

4.) 修改表形态为没法一般索引的情况汇报。

PRIMARY KEY (`DOC_ID`),

1 row in set (0.00 sec)

查看线上的表形态,也印证的上述说法:

`DOC_TITLE` varchar(255) NOT NULL COMMENT '条目原始标题',

| ref | rows | Extra |

+-------+------+--------------------------+

+----+-------------+-------+------+-----------------+-----------------+---------

-+-----------------------------------------------------+

`DOC_TEXT` mediumtext COMMENT '条目正文',

解释由于如下:

CREATE TABLE `zsd01` (

`id` int(11) DEFAULT NULL,

| t_wiki_doc_text | CREATE TABLE `t_wiki_doc_text` (

) ENGINE=InnoDB DEFAULT CHARSET=gbk