2

我的查询运行很慢。我的页面上有两个 lare 查询。自从我插入“in”语句以来,它变得运行缓慢。

    SELECT field1, field2, field3, field4, field5, field6, 
           DATE_FORMAT(field7, '%d-%m') AS field7_1, 
           DATE_FORMAT(fjield8, '%d-%m') AS field8_1 
    FROM 
         table1
    where 
       field9 in (select field1 from table2 where id = '$id_session') OR
       field10 in (select field1 from table2 where id = '$id_session')
    order by 
       field7_1 desc
   Limit 
       50, 100";

我认为问题出在“where field9 in (select field1 from table2 where id = '$id_session')”部分,它正在另一个表中搜索必须在 where 子句中的值。

加载大约需要 8 秒,这很慢。我已经减少了数据库中的记录数量,但这并没有变得更快。

请帮忙。

4

4 回答 4

2

您通常可以使用 IN 重构查询以改用 JOIN。

于 2013-05-22T08:18:29.087 回答
1

您的连接查询:

SELECT field1, field2, field3, field4, field5, field6, 
       DATE_FORMAT(field7, '%d-%m') AS field7_1, 
       DATE_FORMAT(fjield8, '%d-%m') AS field8_1 
FROM table1 INNER JOIN table2
ON table1.field9 = table2.field1 OR
   table1.field10 =  table2.field1
where table2.id = '$id_session'
order by field7_1 desc
Limit 50, 100;

或者我认为,它没有经过测试。您可能必须消除字段的歧义 - 放在table1.它们前面。索引 - table2.id 已经被索引;索引连接的列 - table1 字段 9 和 10 和table2.field1, 可能会有所帮助。但是索引会减慢写入速度,所以只使用那些能产生真正影响的索引。

您过滤和排序大量数据然后只请求第二批 50 个数据的方式也是响应缓慢的一个因素。如果有某种方法可以获得与限制相同的结果,但通过对日期字段(例如上周记录的位置)进行操作,可能会好很多。

于 2013-05-22T08:31:16.893 回答
1

See my answer to similar question for background here, and why JOINs will be much faster than subqueries:

MySQL "IN" queries terribly slow with subquery but fast with explicit values

于 2013-05-22T11:44:43.537 回答
0

您可以通过执行以下操作来连接两个表:

SELECT table1.field1, table1.field2, ..., table2.field1 FROM table1, table2 WHERE [your conditions]

加入工作更快

于 2013-05-22T08:26:17.013 回答