如何使用“IN”语句加快MySQL Qyery的速度?

如何使用“IN”语句加快MySQL Qyery的速度?,mysql,where-clause,in-clause,Mysql,Where Clause,In Clause,我的查询速度很慢。我的页面上有两个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 wh

我的查询速度很慢。我的页面上有两个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";
我认为问题在于表2中select field1中的field9部分,其中id='$id_session',它在另一个表中搜索必须在where子句中的值

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


请提供帮助。

您通常可以使用IN来重构查询,而不是使用JOIN。

您通常可以使用IN来重构查询,而不是使用JOIN。

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

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

join工作得更快

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

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

join工作得更快

使用join进行查询:

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;
或者我认为,它没有经过测试。您可能需要消除字段的歧义-将表1放入。在他们面前。索引-table2.id已被索引;为连接的列(表1字段9和10以及表2.field1)编制索引可能会有所帮助。但是索引会减慢写入速度,所以只使用那些真正起作用的索引


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

使用联接进行查询:

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;
或者我认为,它没有经过测试。您可能需要消除字段的歧义-将表1放入。在他们面前。索引-table2.id已被索引;为连接的列(表1字段9和10以及表2.field1)编制索引可能会有所帮助。但是索引会减慢写入速度,所以只使用那些真正起作用的索引


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

请参阅我对类似问题的回答,了解背景信息,以及为什么联接比子查询快得多:


请参阅我对类似问题的回答,了解背景信息,以及为什么联接比子查询快得多:


需要指定表1和表2之间的关系才能修改添加联接语句的查询。需要指定表1和表2之间的关系才能修改添加联接语句的查询。联接在哪里?这是加入。。。你不必写内部连接或左连接或。。。在查询中,你写这样的东西,效果会很好。写这样的东西,效果会很好-我的同事和我对这种答案有一个特殊的分类。。。我们称之为挥手,而不是coding@boisvert:你的意思是有必要编写加入代码?那样更快吗?@AlaaA.F。可以使用where语句而不是join代码。但你必须明确:哪些列是相等的,等等@boisvert:你说得对,我想这是显而易见的,现在我想我错了。。。谢谢你的建议,从现在起,我会更清楚地告诉你:join在哪里?这是加入。。。你不必写内部连接或左连接或。。。在查询中,你写这样的东西,效果会很好。写这样的东西,效果会很好-我的同事和我对这种答案有一个特殊的分类。。。我们称之为挥手,而不是coding@boisvert:你的意思是有必要编写加入代码?那样更快吗?@AlaaA.F。可以使用where语句而不是join代码。但你必须明确:哪些列是相等的,等等@boisvert:你说得对,我想这是显而易见的,现在我想我错了。。。谢谢你的建议,从现在开始,我会更清楚地告诉你:你怎么知道field9与table2.id相关?哎呀!打字错误,现在更正。要获得与中的等效项,请选择。。。我们必须将表1.field9与表2.field1匹配。谢谢@Ghigo。你怎么知道field9与table2.id相关?哎呀!打字错误,现在更正。要获得与中的等效项,请选择。。。我们必须将表1.field9与表2.field1匹配。谢谢@Ghigo。