2011-10-25 80 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行?

相关问题