我有一个非常简单的查询,在我的本地Windows机器上需要0.04秒,但在我们的实时服务器上,这是一台Linux机器需要30秒!
有谁熟悉同样的问题?
这是查询:
String status = channel.getVariable("DIALSTATUS");
编辑:任何子查询运行缓慢
解决方案:当我使用INNER JOIN时,它不是使用COLUMN IN()的子查询,而是按预期工作。检查重构查询的已批准答案。
答案 0 :(得分:1)
基于评论,我可以思考"统计数据"在dbs上是不同的。 你可以尝试这个,看看你是否获得了更好的性能(当使用INNER JOIN和COLUMN IN(...)时,db引擎可以准备不同的计划:
SELECT DISTINCT
s.carId
FROM cardetail_search s
INNER JOIN (SELECT DISTINCT c.carId FROM carid id
INNER JOIN car c ON c.carId = id.carId
WHERE id.ProductNumber = 'pnumber' OR id.ProductNumber = 'pnumber2') X ON s.carID = X.carID
INNER JOIN (SELECT DISTINCT pictureTableId FROM cardetail WHERE ProductNumber = 'pnumber' OR ProductNumber = 'pnumber2') Y ON s.pictureTableId = Y.pictureTableId
答案 1 :(得分:0)
这种差异的一个可能原因是你有一个不同的缓存子查询配置,而mysql正在linux服务器上的磁盘上创建临时表。 这个过程需要很长时间,而且效率不高。你可以通过修改内存上临时表的最大大小来增加mysql决定在磁盘中创建临时表之前分配的内存量:
查看这2个变量的配置并考虑增加它们。
答案 2 :(得分:0)
提及car
似乎没必要?
SELECT DISTINCT carId
FROM cardetail_search AS s
JOIN carid AS cid ON s.carId = cid.carId
JOIN cardetail AS cd ON s.pictureTableId = cd.pictureTableId
WHERE cid.ProductNumber IN (...)
AND cd.ProductNumber IN (...)
或者,也许您打算让ProductNumber匹配......
SELECT DISTINCT carId
FROM cardetail_search AS s
JOIN carid AS cid ON s.carId = cid.carId
JOIN cardetail AS cd ON s.pictureTableId = cd.pictureTableId
WHERE cid.ProductNumber IN (...)
AND cd.ProductNumber = cid.ProductNumber
不要将tmp_table_size
增加到大约1%的RAM。否则,你可能会在极端情况下冒出RAM。
IN ( SELECT ... )
曾经非常低效。
FROM ( SELECT ... ) JOIN ( SELECT ... )
目前效率低下,因为子查询都没有任何索引。