sta*_*ker 5 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
Run Code Online (Sandbox Code Playgroud)
获取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 |
+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+
Run Code Online (Sandbox Code Playgroud)
什么可能导致这个问题?
使用InnoDB作为引擎的MySql版本是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 |
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+
Run Code Online (Sandbox Code Playgroud)
我通过重新安装 mysql 5.5.17 解决了问题,并决定不使用“开发人员机器”设置,我使用“服务器机器”的默认设置。之后,查询在几秒钟内执行(第一次),后续查询的性能要好得多。
我认为在开发人员模式下,mysql 配置为节省内存,并且没有为大型表缓冲足够的索引页。
(重新)配置可以通过以下方式完成MYSQL_HOME/bin/MySQLInstanceConfig

新旧配置文件的比较显示这些值在配置过程中发生了更改:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |