Specify explicit joins for package search

Refactor the query to use explicit LEFT JOINs, which appears to be handled
by MySQL in a saner fashion than the previous implicit join syntax. This is
part two in a slight fixup for observed slow queries in the production
environment. With the new indexes and this fixup, a particular iteration of
this query will examine only 13346 rows instead of 272060.

Signed-off-by: Dan McGee <dan@archlinux.org>
Signed-off-by: Loui Chang <louipc.ist@gmail.com>
This commit is contained in:
Dan McGee 2009-04-11 16:40:58 -05:00 committed by Loui Chang
parent e2b3bd1c37
commit 1ceeda8ab5

View file

@ -437,19 +437,19 @@ function pkg_search_page($SID="") {
Packages.Name, Packages.Version, Packages.Description, Packages.NumVotes, Packages.Name, Packages.Version, Packages.Description, Packages.NumVotes,
Packages.ID, Packages.OutOfDate Packages.ID, Packages.OutOfDate
FROM PackageCategories, PackageLocations, Packages FROM Packages
LEFT JOIN Users ON (Packages.MaintainerUID = Users.ID) "; LEFT JOIN Users ON (Packages.MaintainerUID = Users.ID) ";
if ($SID) { if ($SID) {
$q .= "LEFT JOIN PackageVotes $q .= "LEFT JOIN PackageVotes
ON (Packages.ID = PackageVotes.PackageID AND PackageVotes.UsersID = $myuid) ON (Packages.ID = PackageVotes.PackageID AND PackageVotes.UsersID = $myuid)
LEFT JOIN CommentNotify LEFT JOIN CommentNotify
ON (Packages.ID = CommentNotify.PkgID AND CommentNotify.UserID = $myuid) "; ON (Packages.ID = CommentNotify.PkgID AND CommentNotify.UserID = $myuid) ";
} }
$q .= "WHERE $q .= "LEFT JOIN PackageCategories
Packages.CategoryID = PackageCategories.ID ON (Packages.CategoryID = PackageCategories.ID)
AND Packages.LocationID = PackageLocations.ID LEFT JOIN PackageLocations
AND Packages.DummyPkg = 0 "; ON (Packages.LocationID = PackageLocations.ID)
WHERE Packages.DummyPkg = 0 ";
// TODO: possibly do string matching on category and // TODO: possibly do string matching on category and
// location to make request variable values more sensible // location to make request variable values more sensible