MySQL第二次抽象连接显着减慢了查询速度

时间:2014-06-26 16:25:01

标签: mysql performance

当我向连接添加第二级抽象时,即加入第一个连接的表时,查询时间乘以1000x

mysql> SELECT xxx.content.id, columns.stories.title, columns.stories.date
    -> FROM xxx.content
    -> LEFT JOIN columns.stories on  xxx.content.contentable_id = columns.stories.id
    -> WHERE columns.stories.title IS NOT NULL
    -> AND xxx.content.contentable_type = 'PublisherStory';

产生0.01秒的结果

mysql> SELECT xxx.content.id, columns.photos.id as pid, columns.stories.title, columns.stories.date
    -> FROM xxx.content
    -> LEFT JOIN columns.stories on  xxx.content.contentable_id = columns.stories.id
    -> LEFT JOIN columns.photos on  columns.stories.id = columns.photos.story_id
    -> WHERE columns.stories.title IS NOT NULL
    -> AND xxx.content.contentable_type = 'PublisherStory';

在14秒内产生结果

这是在具有10ks到100ks记录

的记录的表上执行的

这是正常还是可能导致这种放缓的原因?

第一个查询计划:

+----+-------------+---------+--------+---------------+---------+---------+--------------------------------------+------+-------------+
| id | select_type | table   | type   | possible_keys | key     | key_len | ref                                  | rows | Extra       |
+----+-------------+---------+--------+---------------+---------+---------+--------------------------------------+------+-------------+
|  1 | SIMPLE      | content | ALL    | NULL          | NULL    | NULL    | NULL                                 | 7099 | Using where |
|  1 | SIMPLE      | stories | eq_ref | PRIMARY       | PRIMARY | 8       | xxx.content.contentable_id |    1 | Using where |
+----+-------------+---------+--------+---------------+---------+---------+--------------------------------------+------+-------------+

第二次查询

+----+-------------+---------+--------+---------------+---------+---------+--------------------------------------+-------+-------------+
| id | select_type | table   | type   | possible_keys | key     | key_len | ref                                  | rows  | Extra       |
+----+-------------+---------+--------+---------------+---------+---------+--------------------------------------+-------+-------------+
|  1 | SIMPLE      | content | ALL    | NULL          | NULL    | NULL    | NULL                                 |  7099 | Using where |
|  1 | SIMPLE      | stories | eq_ref | PRIMARY       | PRIMARY | 8       | xxx.content.contentable_id |     1 | Using where |
|  1 | SIMPLE      | photos  | ALL    | NULL          | NULL    | NULL    | NULL                                 | 21239 |             |
+----+-------------+---------+--------+---------------+---------+---------+--------------------------------------+-------+-------------+

1 个答案:

答案 0 :(得分:1)

如果加入columns.photos减速太多,可能是因为: photos.story_id不是故事中的外键,该列上没有索引。

没有看到你的桌子结构,我无法确切地说出来,但我建议你这样做 验证photos.story_id是否为外键,如果你的mysql版本没有 支持外键(很旧)在该列上放置一个索引。

  • 我会检查contentable_type和stories.title上的索引 附近的一部分。