Mysql子查询在实时服务器上运行缓慢但在本地运行速度很快

时间:2017-08-25 08:07:45

标签: mysql subquery database-performance

我有一个非常简单的查询,在我的本地Windows机器上需要0.04秒,但在我们的实时服务器上,这是一台Linux机器需要30秒!

有谁熟悉同样的问题?

这是查询:

String status = channel.getVariable("DIALSTATUS");

编辑:任何子查询运行缓慢

解决方案:当我使用INNER JOIN时,它不是使用COLUMN IN()的子查询,而是按预期工作。检查重构查询的已批准答案。

3 个答案:

答案 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个变量的配置并考虑增加它们。

  • tmp_table_size
  • max_heap_table_size

答案 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 ... )目前效率低下,因为子查询都没有任何索引。