使用联接进行限制X、Y MySQL查询运行得更快

使用联接进行限制X、Y MySQL查询运行得更快,mysql,database,join,query-optimization,Mysql,Database,Join,Query Optimization,我有一个MySQL查询,它有一个特定的结构,我想重写它,以便它运行得更快。它目前运行速度非常慢,大约需要255秒才能执行。如果我删除连接,它将在='2015-03-22 05:23:44'多少行匹配A.ID`匹配A和B中的行数根据您的问题,该信息出现在我的帖子中,并且一直在我的帖子中。

我有一个MySQL查询,它有一个特定的结构,我想重写它,以便它运行得更快。它目前运行速度非常慢,大约需要255秒才能执行。如果我删除连接,它将在<10秒内运行。它的目的是从表A中获取记录,每次100行,只要用户希望看到更多行

我怀疑查询花费了很长时间,因为它不仅仅在找到的前100行上进行连接。这是真的吗?如果是的话,有没有办法在查询从主表中获取行之后重写查询以进行连接

数据来自一个“main”表a,该表有一个datetime字段(START_TIME)和几个外键,外键指向具有字符串值的表(tables、B、C、D)

表A有250万行。表B有60万行。 表A有一个关于开始时间的索引。表B的ID值上有一个索引

下面是查询的基本形式。我不想设置开始时间的上限,因为我总是想从查询中获取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

您必须提供解释计划,以便我们能更好地帮助您

但对于您的描述,您仍然需要索引

START\u TIME
旁边的表a中,每个连接字段都需要索引
B\u id、C\u id和D\u id
,可能对所有4个变量使用复合索引会更好

 CREATE INDEX A_Bid_idx ON A (B_id);
 CREATE INDEX A_Cid_idx ON A (C_id);
 CREATE INDEX A_Did_idx ON A (D_id);

 OR

 CREATE INDEX A_Full_idx ON A (B_id,C_id, D_id, START_TIME);
表C和D还需要
C.ID和D.ID
的索引。如果他们使用综合指数会更好

  (C.ID, C.STRING)  and
  (D.ID, D.STRING)

  CREATE INDEX C_id_idx ON C (ID);
  CREATE INDEX D_id_idx ON D (ID);

  OR

  CREATE INDEX C_id_string_idx ON C (ID, STRING);
  CREATE INDEX D_id_string_idx ON C (ID, STRING);
这样db就不必进行查找来查找与ID相关的字符串值

SELECT  A.START_TIME, A.F1, A.F2, 
      ( SELECT  STRING
            FROM  B
            WHERE  A.B_ID = B.ID 
      ) AS String
    FROM  A
    WHERE  A.START_TIME >= '2015-03-22 05:23:44'
    ORDER BY START_TIME
    LIMIT  0, 100; 
可能会跑得更快。“强制”使用
索引(开始时间)
A


请为两个表提供
SHOW CREATE TABLE
;我想检查数据类型等。

关于更好的解释,您还想知道什么?但是,
100条记录被找到后,对连接进行处理,这难道不是最大的时间节省吗?我将添加您建议的索引,然后重试。正如我所说,您仍然需要一些索引。你必须向我们展示解释计划,看看问题出在哪里,请帮我解决。我不知道还有什么其他信息可以提供给你。平均而言,任何B_ID值在表A中只出现4次。我不认为把它放在综合索引中会有帮助。请记住表B有60万行。请阅读我给您的链接。这将向您展示如何使用
EXPLAIN
工作您可以使用
ctrl-k
将文本格式化为代码。现在您必须尝试每次添加一个表。您应该尝试每次选择be类型
index
以下是每次添加一个表的结果:仅表a:8.7秒,表a和表B:255秒。问题仍然存在,我最初的问题仍然存在:是否有一种方法可以重新构造此查询,以便在从表a检索记录后完成连接。这是一个非常重要的问题,因为这是一个非常常见的查询。因此,您以秒为单位表示时间,并期望我们为您提供解决方案?没有计划?告诉我们细节。A中有多少行,B中有多少行。多少行匹配A.开始时间>='2015-03-22 05:23:44'多少行匹配A.ID`匹配A和B中的行数根据您的问题,该信息出现在我的帖子中,并且一直在我的帖子中。