This is a nice mod. Unfortunately, it crashed my site when this query was run repeatedly during a period of high load (23 times over, running between 78 and 208 seconds, as of just before I started killing them):
Code:
mysql> EXPLAIN SELECT a.*, au.*, post.userid, post.postid
-> FROM post AS post
-> INNER JOIN award_user AS au ON (au.userid=post.userid)
-> INNER JOIN award AS a ON (a.award_id=au.award_id)
-> WHERE 1=1
->
->
-> GROUP BY au.issue_id
-> ORDER BY au.issue_time DESC;
+----+-------------+-------+--------+---------------+---------+---------+-------------------------+-------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+-------------------------+-------+---------------------------------+
| 1 | SIMPLE | au | ALL | NULL | NULL | NULL | NULL | 117 | Using temporary; Using filesort |
| 1 | SIMPLE | a | eq_ref | PRIMARY | PRIMARY | 2 | totalwar_vb.au.award_id | 1 | Using where |
| 1 | SIMPLE | post | ref | userid | userid | 4 | totalwar_vb.au.userid | 25005 | Using where |
+----+-------------+-------+--------+---------------+---------+---------+-------------------------+-------+---------------------------------+
3 rows in set (0.00 sec)
While I'm no MySQL expert, it seems that this attempts to copy the entirety of the post table to a temporary table, in my case about 1.5 million rows. I've tracked the query down to the showthread_query hook:
PHP Code:
// Obtain list of awards for current user
$alluserawards = $db->query_read("
SELECT a.*, au.*, post.userid, post.postid
FROM " . TABLE_PREFIX . "post AS post
INNER JOIN " . TABLE_PREFIX . "award_user AS au ON (au.userid=post.userid)
INNER JOIN " . TABLE_PREFIX . "award AS a ON (a.award_id=au.award_id)
WHERE 1=1
". iif((!empty($ids)), "AND post.postid IN (0" . $ids . ")") ."
". iif((!empty($cache_postids)), "AND post.postid IN (" . $cache_postids . ")") ."
GROUP BY au.issue_id
$awardsdisplayorder
");
while( $ua = $db->fetch_array($alluserawards))
{
$userawardscache[$ua['userid']][$ua['issue_id']] = $ua;
}
$db->free_result($alluserawards);
Apparently this fails to account for the possibility that $ids and $cache_postids are both empty. I have no idea why it would or would not be reasonable to account for that, because I don't know what either of those variables is, but at any rate, if they both
are empty things are not very good. I've wrapped the whole thing in a conditional checking whether both are empty, just not setting anything if they both are. I'd appreciate any response.