开发者

How to optimise this MySQL query

开发者 https://www.devze.com 2023-03-31 13:20 出处:网络
I have the following MySQL query: SELECT k.strNaam FROM klant AS k INNER JOIN project AS p ON p.iKlantID = k.iKlantID

I have the following MySQL query:

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'

This query takes more than 0.5 seconds to load, but I am using it in a while loop so that's very inefficient.

Thanks in advance

Edit the MySQL query with the EXPLAIN command prepended:

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


Try if this one won't be faster... because of the or condition in the where clause, index cannot be used to resolve the WHERE. But the worst part is that the iKlantID index was not used to resolve the join.

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'


Speed issues
Put indexes on all fields involved in the joins.
And on iFactuurID.

Loops and SQL don't mix
Well they do, but slowness will be the result.

Instead try code like this.

$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
}

If the values are consecutive, it's much faster to use

WHERE p.iFactuur BETWEEN '$lowvalue' AND '$highvalue' 

Always let SQL do the heavy lifting in loops.

0

精彩评论

暂无评论...
验证码 换一张
取 消