Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql in子句使用列表的子查询-执行时间比硬编码列表慢得多_Php_Mysql_Sql_Subquery_Query Optimization - Fatal编程技术网

Php mysql in子句使用列表的子查询-执行时间比硬编码列表慢得多

Php mysql in子句使用列表的子查询-执行时间比硬编码列表慢得多,php,mysql,sql,subquery,query-optimization,Php,Mysql,Sql,Subquery,Query Optimization,我有一个类似这样的查询(简化版) 前几次运行需要2秒,然后在缓存后大约0.15秒运行,但有时在重复执行后会反弹到2秒 现在,假设我接受子查询 SELECT otherID FROM otherTable WHERE someTrait IN (18, 19, 29, 20, 21, 30) 我在0.1秒内得到一个结果。结果如下: (1,27,145,600,1234) 所以我把它分到这个的原始查询中 SELECT title, count(title) t, SU

我有一个类似这样的查询(简化版)

前几次运行需要2秒,然后在缓存后大约0.15秒运行,但有时在重复执行后会反弹到2秒

现在,假设我接受子查询

SELECT 
  otherID 
FROM
  otherTable 
WHERE someTrait IN (18, 19, 29, 20, 21, 30)
我在0.1秒内得到一个结果。结果如下:

(1,27,145,600,1234)
所以我把它分到这个的原始查询中

SELECT 
  title,
  count(title) t,
  SUM(id IN (1, 27, 145, 600, 1234)) s
FROM
  `TABLE`
GROUP BY title
HAVING t-s > 0
第一次运行需要0.6秒,重复执行后需要0.05到0.15秒,但不会像第一次查询那样达到0.6秒

为什么MySQL运行第一个查询需要更长的时间?有没有合适的“MySQL方式”来完成我所做的事情,即获取子查询的结果,保存它,并将其直接放入我的另一个查询中

我正在使用php,所以目前我正在进行第一个查询,将结果存储到逗号分隔的值字符串中,并将其传递给第二个查询,但我感觉就像这样 应该是一个更好的方法,或者我缺少MySql的一些关键点


在这一点上,我喜欢在可能的情况下使用
JOIN
LEFT JOIN
来代替
IN
,但由于它是
SUM
的一个参数,我也不知道该怎么做。

运行时间更长,因为你在做两个IN(),它们都是求和的。IN的运行速度非常慢,尤其是与连接相比,因此在SUM()中有两个IN()肯定会使其运行缓慢。子查询的结果是否始终相同?因为如果这些可以更改,那么硬编码子查询返回的数字可能是个坏主意。我真的不知道你想用这个查询做什么,但我敢打赌有更好的方法来安排它第一个查询必须做最里面的IN()比较,然后选择每个数字。然后,不管外IN()重复了多少次,然后做一个SUM()。子查询的结果确实会随着时间的推移而改变,但是相对于脚本的执行时间来说,它是缓慢的;结果可能每天或每两天都会改变,但脚本理论上只需几个小时即可运行。我用php保存中间结果的方式,在纯mysql中有没有这样做的方法?您可以在mysql中执行一个存储过程yes,并在mysql中生成变量,如果您愿意,您可以在in()中传递这些变量,可以举个例子吗?
SELECT 
  title,
  count(title) t,
  SUM(id IN (1, 27, 145, 600, 1234)) s
FROM
  `TABLE`
GROUP BY title
HAVING t-s > 0