2011-10-25 35 views
5

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

你'最有可能I/O受硬盤限制。將'innodb_buffer_pool'大小變量增加到內存的70%。這樣工作數據集的一部分將保存在內存中,查找速度會更快。 –

+0

嘗試分析表... http://dev.mysql.com/doc/refman/5.0/en/analyze-table.html –

+0

@Neville - 我已經做了,它說狀態是好的。 – stacker

回答

0

我通過重新安裝mysql 5.5.17解決了這個問題,並決定不使用'Developer Machine'設置,我使用了'Server Machine'的默認設置。 之後,查詢在幾秒鐘(第一次)執行後續查詢執行 好得多。

我想,在開發人員模式下,mysql配置爲保存ram,並且不會爲大型表緩衝足夠的索引頁。

的(再)配置可以由多才多藝與MYSQL_HOME/bin/MySQLInstanceConfig

enter image description here

新舊配置文件的對比表明,在配置過程中改變這些值:

tmp_table_size=103M old 18M 
myisam_sort_buffer_size=205M old 35M 
key_buffer_size=175M old 25M 
innodb_additional_mem_pool_size=7M old 3499K 
innodb_additional_mem_pool_size=2M old 1M 
innodb_buffer_pool_size=339M old 47M 
+0

正如評論中所建議的,你的'innodb_buffer_pool'增加了。您可以通過編輯my.cnf文件手動執行該操作,或者通過該GUI重新配置實例。無論哪種方式,您的工作數據集現在駐留在內存中。換句話說 - 它可能會不時緩慢。 –

+0

@ N.B。對不起,我不明白'工作數據集'的含義。現在,如果您發表評論作爲答案,我會接受它,現在一切都很清晰。感謝您的幫助。 – stacker

+0

這一切都好,我不是「狩獵」的代表,你的回答和評論會讓下一個有同樣問題的人清楚:) –

1

也許表非常零散,MySQL不得不走遍磁盤獲取那些5021行?

相關問題