[nycphp-talk] Adding indexes
danielc at analysisandsolutions.com
Mon Mar 22 13:54:35 EDT 2010
> $sql = "select dt1.*, d.* from
> driver d join
> (select `driver`, date(`leave`), sum(`points`) as pnts,
> sum(`xpnts`) as xpnts from check_head
> where date(`leave`) = '".$sdate."'
> group by `driver`) dt1
> on dt1.driver = d.id_num where `store` = '".$userStore."' ";
Ouch. You need to read up on how MySQL queries work. There are sections
in the manual that explain it pretty well.
Most importantly, it's a really bad idea to use functions on a column in
a WHERE clause. The function has to be run on every row in the table,
then those results get compared to the value ($sdate in this case).
Second, joins only use indexes when you're joining tables. Here, you're
joining a subquery, so no love.
Third, don't delimit your identifiers. If you're using identifiers that
need delimiting, don't.
Fourth, start queries from the table where the WHERE clause does the
Try something like this... Note, I'm leaving date(leave) out of the
output since you didn't put an alias (AS) on it makes me believe you're
not using it in your output because the likelyhood of you doing
$row['date(leave)'] in your PHP is low. Also, you better be sure the
value of $sdate and $userStore are safe for use in a query / can't be
tainted to perform an SQL injection attacks.
SELECT driver, SUM(points) AS pnts, SUM(xpnts) AS xpnts
JOIN driver ON (driver.id_num = check_head.driver)
WHERE leave = '$sdate'
AND store = '$userStore'
GROUP BY driver
T H E A N A L Y S I S A N D S O L U T I O N S C O M P A N Y
data intensive web and database programming
4015 7th Ave #4, Brooklyn NY 11232 v: 718-854-0335 f: 718-854-0409
More information about the talk