我有以下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
答案 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在循环中完成繁重的工作。