【发布时间】:2016-03-06 21:14:30
【问题描述】:
我有一个具有特定结构的 MySQL 查询,我想重写它以使其运行得更快。它目前运行速度非常慢,大约需要 255 秒才能执行。如果我删除加入,它会在
我怀疑该查询花费了很长时间,因为它不仅对找到的前 100 行进行了联接。这是真的吗,如果是这样,有没有办法在从主表中获取行后重写查询以进行连接?
数据来自一个“主”表 A,它有一个日期时间字段 (START_TIME) 和几个带有字符串值的表的外键(表、B、C、D)。
表 A 有 250 万行。表 B 有 600K 行。 表 A 在 START_TIME 有一个索引。表 B 在其 ID 值上有一个索引。
这是查询的基本形式。我不想对 START_TIME 设置上限,因为我总是想从查询中取回 100 条记录。我使用少于 100 条记录的响应来表明数据库中没有更多记录。
SELECT
A.START_TIME, A.F1, A.F2, B.STRING
FROM
A
INNER JOIN B ON A.B_ID = B.ID
WHERE
A.START_TIME >= '2015-03-22 05:23:44'
LIMIT 0, 100;
这是解释。对不起格式:
# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, SIMPLE, B, index, PRIMARY, FSN, 95, , 1, Using index; Using temporary; Using filesort
1, SIMPLE, A, ref, A_ix_B_ID,A_ix_C, A_ix_B_ID, 4, ag100_a$$burnaby.B.ID, 2, Using where
【问题讨论】:
-
您可以使用
ctrl-k将文本格式化为代码。 -
现在你必须尝试每次添加一个表importblogkit.com/2015/05/how-do-you-eat-an-elephant你应该尝试每个选择都输入
index -
这是一次添加一个表的结果: 仅表 A:8.7 秒,表 A 和 B:255 秒。问题仍然存在,我最初的问题仍然存在:有没有办法重组此查询,以便在从表 A 检索记录后完成连接。了解这一点非常重要,因为这是一个非常常见的查询。
-
所以你说的时间是秒并期望我们给你一个解决方案?没有计划?给我们详细信息。 A中有多少行,B中有多少行。有多少A匹配
A.START_TIME >= '2015-03-22 05:23:44' How manyA.ID`匹配B.ID -
根据您对 A 和 B 中的行数的问题,该信息出现在我的帖子中,并且一直在我的帖子中。
标签: mysql database join query-optimization