]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Temporary hack until notice_profile_id_idx is updated
authorBrion Vibber <brion@pobox.com>
Thu, 1 Apr 2010 17:15:40 +0000 (10:15 -0700)
committerBrion Vibber <brion@pobox.com>
Thu, 1 Apr 2010 17:15:40 +0000 (10:15 -0700)
to (profile_id, id) instead of (profile_id, created, id).
It's been falling back to PRIMARY instead, which is really
very inefficient for a profile that hasn't posted in a few
months. Even though forcing the index will cause a filesort,
it's usually going to be better. Even for large profiles it
seems much faster than the badly-indexed query.

classes/Profile.php

index 5de35c191af66c78ab4ba1cbd284b3c376c25844..54f557ea7cee40201f631ca7aa1416731b3693b4 100644 (file)
@@ -225,31 +225,62 @@ class Profile extends Memcached_DataObject
     {
         $notice = new Notice();
 
-        $notice->profile_id = $this->id;
+        // Temporary hack until notice_profile_id_idx is updated
+        // to (profile_id, id) instead of (profile_id, created, id).
+        // It's been falling back to PRIMARY instead, which is really
+        // very inefficient for a profile that hasn't posted in a few
+        // months. Even though forcing the index will cause a filesort,
+        // it's usually going to be better.
+        if (common_config('db', 'type') == 'mysql') {
+            $index = '';
+            $query =
+              "select id from notice force index (notice_profile_id_idx) ".
+              "where profile_id=" . $notice->escape($this->id);
+
+            if ($since_id != 0) {
+                $query .= " and id > $since_id";
+            }
 
-        $notice->selectAdd();
-        $notice->selectAdd('id');
+            if ($max_id != 0) {
+                $query .= " and id < $max_id";
+            }
 
-        if ($since_id != 0) {
-            $notice->whereAdd('id > ' . $since_id);
-        }
+            $query .= ' order by id DESC';
 
-        if ($max_id != 0) {
-            $notice->whereAdd('id <= ' . $max_id);
-        }
+            if (!is_null($offset)) {
+                $query .= " LIMIT $limit OFFSET $offset";
+            }
+
+            $notice->query($query);
+        } else {
+            $index = '';
 
-        $notice->orderBy('id DESC');
+            $notice->profile_id = $this->id;
 
-        if (!is_null($offset)) {
-            $notice->limit($offset, $limit);
+            $notice->selectAdd();
+            $notice->selectAdd('id');
+
+            if ($since_id != 0) {
+                $notice->whereAdd('id > ' . $since_id);
+            }
+
+            if ($max_id != 0) {
+                $notice->whereAdd('id <= ' . $max_id);
+            }
+
+            $notice->orderBy('id DESC');
+
+            if (!is_null($offset)) {
+                $notice->limit($offset, $limit);
+            }
+
+            $notice->find();
         }
 
         $ids = array();
 
-        if ($notice->find()) {
-            while ($notice->fetch()) {
-                $ids[] = $notice->id;
-            }
+        while ($notice->fetch()) {
+            $ids[] = $notice->id;
         }
 
         return $ids;