如何优化这个MySQL查询

时间:2011-08-30 11:17:37

标签: mysql

我有以下MySQL查询:

SELECT k.strNaam
FROM klant AS k
INNER JOIN project AS p ON p.iKlantID = k.iKlantID
LEFT JOIN klant_factuurregels AS kfr ON kfr.iJobID = p.iProjectID
WHERE p.iFactuurID =  '49'
OR kfr.iFactuurID =  '49'

此查询加载时间超过0.5秒,但我在while循环中使用它,因此效率非常低。

提前致谢

编辑使用EXPLAIN命令前置的MySQL查询:

id  | select_type   | table | type  | possible_keys | key       | key_len           | ref                       | rows    | Extra
1     SIMPLE          p       ALL     iKlantID        NULL        NULL                NULL                        18848  
1     SIMPLE          k       eq_ref  PRIMARY         PRIMARY     8                   projecten.p.iKlantID        1  
1     SIMPLE          kfr     ALL     NULL            NULL        NULL                NULL                        18        Using where

2 个答案:

答案 0 :(得分:2)

尝试这个不会更快...因为where子句中的或条件,索引不能用于解析WHERE。但最糟糕的是,iKlantID索引并未用于解析连接。

SELECT k.strNaam
FROM klant AS k
INNER JOIN project AS p ON p.iKlantID = k.iKlantID
LEFT JOIN klant_factuurregels AS kfr ON kfr.iJobID = p.iProjectID
WHERE p.iFactuurID =  '49'
UNION 
SELECT k.strNaam
FROM klant AS k
INNER JOIN project AS p ON p.iKlantID = k.iKlantID
LEFT JOIN klant_factuurregels AS kfr ON kfr.iJobID = p.iProjectID
WHERE kfr.iFactuurID =  '49'

答案 1 :(得分:1)

速度问题
将索引放在联接中涉及的所有字段上 在iFactuurID上。

循环和SQL不混合
他们确实做到了,但结果会很慢。

而是尝试这样的代码。

$array = (10,11,12,13,49);
//if this comes from outside you need to sanitize these values 
//using PDO or mysql_real_escape_string
$in = "'".implode("','",$array)."'"; 
$sql = "SELECT k.strNaam
        FROM klant AS k
        INNER JOIN project AS p ON p.iKlantID = k.iKlantID
        LEFT JOIN klant_factuurregels AS kfr ON kfr.iJobID = p.iProjectID
        WHERE p.iFactuurID IN ($in)
        OR kfr.iFactuurID IN ($in) ";
$result = mysql_query($sql);
while ($row = mysql_fetch_row($result)) 
{
   //do stuff
}

如果值是连续的,则使用

要快得多
WHERE p.iFactuur BETWEEN '$lowvalue' AND '$highvalue' 

始终让SQL在循环中完成繁重的工作。