For some reason I wanted to add more redundant conditions to a WHERE clause in a MySQL SELECT query, but I feared that, being redundant conditions, I may end up slowing up the query.
Shortly, there is this classifieds site, where each item’s table has the town_id, province_id and region_id rows. If you know the town_id you’re looking for already, you can query:
SELECT * FROM items WHERE town_id='12'
instead of:
SELECT * FROM items WHERE town_id='12' AND province_id='34' AND region_id='56'
as the results will be the same… but should you?
I prepared a quick test panel:
$creationstart=strtok(microtime()," ")+strtok(" ");
for($i=0;$i<=999;$i++)
$test=doquery("SELECT * FROM items WHERE town_id='58003'");
$creationend=strtok(microtime()," ")+strtok(" ");
$creationtime=number_format($creationend-$creationstart,4);
echo "town only: $creationtime<br />";
$creationstart=strtok(microtime()," ")+strtok(" ");
for($i=0;$i<=999;$i++)
$test=doquery("SELECT * FROM items WHERE town_id='58003' AND province_id='58' AND region_id='12'");
$creationend=strtok(microtime()," ")+strtok(" ");
$creationtime=number_format($creationend-$creationstart,4);
echo "all conditions: $creationtime<br />";
Surprisingly, it took anywhere from 2.4s to 4.5s for the “all conditions” routine to complete, while the “town only” query ended up being about 0.4s slower. At first I thought it might be the MySQL cache in action, but even inverting the position of the cycles inside the code, results were the same.
So well, even if it looks redundant to you, adding more WHERE ... AND ... clauses in your query speeds up the fetching of the results.
This article has been DigiprovedRelated posts:
- MySQL query with ORDER BY,GROUP BY to remove duplicate rows after ordering
- Zip MySQL database backup with PHP and send as email attachment
- Inverted search in MySQL database: check if keywords in field match some text
- PHP search string functions performance is “needle” dependent
- PHP templating, preg_match, file_get_contents and strpos, the fastest
