优化昂贵的php查询/子查询

时间:2013-07-10 19:49:56

标签: php mysql sql query-performance load-time

我有一个包含3列的表:submission_id,column_id,data。每个submission_id都有25列和数据值。

我有一个页面显示所有提交的内容,其中column_id = 16,data =(''或0)。为了得到这个,我使用子查询来获取我需要的所有不同的submission_id,然后我获得主查询中的所有列。我的疑问是:

SELECT sid,cid,data FROM webform_submitted_data WHERE sid in(select distinct sid from webform_submitted_data where cid=16 and data in (' ',0)) ORDER BY sid ASC

表越来越大,从PHP运行时查询现在需要30-40秒(虽然距离MYSQL只有1.0e-6秒)这不是PHP开销,我使用mysqld-slow.log文件检查,我得到以下内容: < - #Query_time:32.975552 Lock_time:0.000138 Rows_sent:108 Rows_examined:177396 - >

我也试过在PHP中运行一个解释 ![解释]:(http://i.imgur.com/692eyHf.png

还有一件事,这个页面更新了当前的提交,并将一个ID值放在column_id 16中,这会在重新加载时将其从页面中删除。没有更新的重新加载只需不到一秒钟,但是当我们需要更新100条记录时,它每次都会重建缓存。

任何想法都会非常感激。

1 个答案:

答案 0 :(得分:0)

EXPLAIN报告的DEPENDENT SUBQUERY成本最高。这意味着它为外部查询中的每个不同的sid执行一次子查询。这笔费用相对于180000+行中不同sid值的数量而言需要多少开销。

您可以尝试此查询以确保子查询仅执行一次。它可能需要将结果存储在临时表中,但根据您的EXPLAIN,该临时表只有~7行。

SELECT d1.sid, d1.cid, d1.data 
FROM webform_submitted_data AS d1 
INNER JOIN (
  SELECT DISTINCT sid FROM webform_submitted_data 
  WHERE cid=16 AND data IN (' ',0)) AS d2 USING (sid)
ORDER BY d1.sid ASC