【问题标题】:MySQL query is slow when joining on tables containing BLOBs加入包含 BLOB 的表时,MySQL 查询很慢
【发布时间】:2010-11-01 14:20:12
【问题描述】:

我有一个带有大量左连接的 MySQL 选择查询,但只有一个连接会导致严重的性能问题。这个麻烦的表中有 2 个 BLOB 字段,当我在它的主键上离开时,查询的运行时间是 20 倍以上。由于这是导致问题的唯一表,我假设 BLOB 与它有关(即使它们没有被选择或加入)。请注意,此表中的行数相对于其他联接表而言并不是特别大。

如何加快查询速度?

编辑 - 这是查询(有问题的表是“提交”):

SELECT
 actions.id,
 actions.facebook_id,
 actions.created_at,
 actions.current_total_points,
 actions.current_weekly_points,
 submissions.id AS submission_id,
 submissions.challenge_week_number AS submission_challenge_week_number,
 submissions.challenge_number_in_week AS submission_challenge_number_in_week,
 reward_events.id AS reward_event_id,
 reward_events.reward_event_type_id,
 reward_events.action_id,
 reward_events.awarded_badge_type_id,
 reward_events.for_week_number AS reward_event_for_week_number,
 reward_events.challenge_number_in_week AS reward_event_challenge_number_in_week,
 challenge_weeks.week_number
from actions
left join submissions ON submissions.action_id = actions.id
left join reward_events ON reward_events.action_id = actions.id
left join challenge_weeks ON challenge_weeks.start_date <= CAST(actions.created_at AS DATE) AND challenge_weeks.end_date >= CAST(actions.created_at AS DATE)
where actions.facebook_id = '12345678'
order by actions.id asc

这是“提交”表的 EXPLAIN 结果:

id                        bigint(11) unsigned           NO  PRI  auto_increment
action_id                 bigint(11)                    NO
title                     varchar(255)                  YES
description               varchar(255)                  YES
submission_type           enum('alpha','beta','gamma')  YES
filename                  varchar(255)                  YES
ip_address                varchar(255)                  YES
community_release         bit(1)                        YES
approved                  bit(1)                        YES
fullsize                  longblob                      YES
thumb                     longblob                      YES
modified_at               timestamp                     YES  CURRENT_TIMESTAMP  
challenge_week_number     tinyint(1)                    YES
challenge_number_in_week  tinyint(1)                    YES

【问题讨论】:

  • 能否请您发布查询?当您看到查询时,优化查询总是更容易。
  • 同时发布 EXPLAIN 的输出和所涉及的表结构将有很大帮助

标签: mysql join blob


【解决方案1】:

您是否尝试过在您加入的非 PK 字段上创建索引,例如 submissions.action_idreward_events.action_id?这应该会导致查询时间的减少与您要加入的表的大小成正比。

【讨论】:

    猜你喜欢
    • 2015-05-29
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 2014-03-15
    相关资源
    最近更新 更多