基本上我們對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