什么会降低MySqls的表现?

时间:2011-10-25 08:39:56

标签: mysql database performance

基本上我们对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

获取5021行需要50秒。丢失的索引可能是导致类似问题的最常见原因。所以我在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 Version是使用InnoDB作为引擎的5.5。 (仅限Windows上的默认参数)。

修改

当我删除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              |
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+

2 个答案:

答案 0 :(得分:1)

也许表格非常碎片,MySQL必须遍布整个磁盘来获取那些5021行?

答案 1 :(得分: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