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. Even for large profiles it
seems much faster than the badly-indexed query.
This commit is contained in:
Brion Vibber 2010-04-01 10:15:40 -07:00
parent d60c1f1a9f
commit f1c01f9ead
1 changed files with 47 additions and 16 deletions

View 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);
$notice->selectAdd();
$notice->selectAdd('id');
if ($since_id != 0) {
$query .= " and id > $since_id";
}
if ($since_id != 0) {
$notice->whereAdd('id > ' . $since_id);
}
if ($max_id != 0) {
$query .= " and id < $max_id";
}
if ($max_id != 0) {
$notice->whereAdd('id <= ' . $max_id);
}
$query .= ' order by id DESC';
$notice->orderBy('id DESC');
if (!is_null($offset)) {
$query .= " LIMIT $limit OFFSET $offset";
}
if (!is_null($offset)) {
$notice->limit($offset, $limit);
$notice->query($query);
} else {
$index = '';
$notice->profile_id = $this->id;
$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;