基本上我们对Mysqls的表现非常满意,类似的查询在瞬间完成。现在我们面对这个查询的问题什么可以减少MySqls的性能?
SELECT dc.id,dmr.art_id
FROM dmr
JOIN dma ON dma.id = dmr.dml_id
JOIN dc ON dc.id = dma.dc_id
WHERE dmr.art_id = 2285
它需要50秒来获取5021行。缺少的索引可能是这类问题最常见的原因。因此,我在EXPLAIN之前查询并获得了此查询计划,该计划显示只有索引不使用顺序扫描。
表dmr和dma每行有300万行,dc有6000行。
+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+
| 1 | SIMPLE | dmr | ref | FKC33D5199F17E1825,ix_art_ref | ix_art_ref | 5 | const | 5021 | Using where |
| 1 | SIMPLE | dma | eq_ref | PRIMARY,FK8C6E1445153BBDC9 | PRIMARY | 8 | dev.dmr.dml_id | 1 | |
| 1 | SIMPLE | dc | eq_ref | PRIMARY | PRIMARY | 8 | dev.dma.dc_id | 1 | Using index |
+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+
什么会导致这个问题?
MySql版本是5.5使用InnoDB作为引擎。 (只有窗口上的默认参数)。
编辑
当我删除where子句,MySQL的返回(巨大)的结果立即成立。 在这种情况下,查询计划看起来像:
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+
| 1 | SIMPLE | dc | index | PRIMARY | FKAEB144C64FA71464 | 9 | NULL | 4037 | Using index |
| 1 | SIMPLE | dma | ref | PRIMARY,FK8C6E1445153BBDC9 | FK8C6E1445153BBDC9 | 9 | dev.dc.id | 263 | Using where; Using index |
| 1 | SIMPLE | dmr | ref | FKC33D5199F17E1825 | FKC33D5199F17E1825 | 9 | dev.dma.id | 1 | Using where |
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+
你'最有可能I/O受硬盘限制。将'innodb_buffer_pool'大小变量增加到内存的70%。这样工作数据集的一部分将保存在内存中,查找速度会更快。 –
尝试分析表... http://dev.mysql.com/doc/refman/5.0/en/analyze-table.html –
@Neville - 我已经做了,它说状态是好的。 – stacker