mysql - 什么会降低 MySqls 的性能?

标签 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 版本是 5.5,使用 InnoDB 作为引擎。 (只有 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              |
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+

最佳答案

也许表非常零散,MySQL 必须遍历整个磁盘才能获取这 5021 行?

关于mysql - 什么会降低 MySqls 的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7886732/

相关文章:

ruby-on-rails - 如何处理 Rails 应用程序中定期更改的数据库数据?

database - Postgres 复制( native )是否支持每个数据库级别的复制?

swift - 找到一个数的所有因子的最有效方法?

php - 自动增量与唯一键的区别当你把它们都放在一张表中时?

php - MySQL 搜索速度很慢,查询或索引不好?

python - 插入不是默认 DJANGO 的数据库

java - 在 Activity 中使用内部 BroadcastReceiver 时出现内存问题

php - 如何在 Codeigniter 中进行数据库查询后获取行数?

mysql - 如何使用两个不同的列 mySQL 从查询而不是其他查询中获取数据?

Python:多重分配与个人分配速度