Mysql 什么';投票表的最佳索引是什么?
我的问题是:Mysql 什么';投票表的最佳索引是什么?,mysql,sql,indexing,Mysql,Sql,Indexing,我的问题是: SELECT qa.id, qa.subject, qa.category cat, qa.keywords tags, qa.body_html, qa.amount, qa.visibility, qa.date_time, COALESCE(u.reputation, 'N') reputation, COALESCE(CONCAT(u.user_fn
SELECT qa.id,
qa.subject,
qa.category cat,
qa.keywords tags,
qa.body_html,
qa.amount,
qa.visibility,
qa.date_time,
COALESCE(u.reputation, 'N') reputation,
COALESCE(CONCAT(u.user_fname, ' ', u.user_lname), 'unknown') name,
COALESCE(u.avatar, 'anonymous.png') avatar,
(SELECT COALESCE(sum(vv.value),0)
FROM votes vv
WHERE qa.id = vv.post_id
AND 15 = vv.table_code) AS total_votes,
(SELECT COALESCE(sum(vt.total_viewed),0)
FROM viewed_total vt
WHERE qa.id = vt.post_id
AND 15 = vt.table_code
LIMIT 1) AS total_viewed
FROM qanda qa
LEFT JOIN users u ON qa.author_id = u.id
AND qa.visibility = 1
WHERE qa.type = 0
ORDER BY qa.date_time DESC
LIMIT 0,
11;
下面是解释的结果:
看到了吗?最后一行(vv
)对任何索引都没有好处。以下是投票
表中的当前索引:
不管怎样,你有什么建议?我需要什么索引才能使性能更好?我认为您需要将
qa.visibility=1
从左连接..ON
移动到何处
。完成此操作后,请创建以下索引:
qanda: INDEX(visibility, type, date_time) -- date_time must be last
这将完全处理WHERE
、ORDER BY
和LIMIT
——这可能是性能的最大提升
vv and vt: INDEX(post_id, table_code) -- in either order
您似乎有(post\u id、table\u code、user\u id)
。如果是唯一的,则将其提升为主键
,并删除id
;这将提供额外的一点推动
我假设用户
有主键(id)
在vt
子查询上不需要LIMIT 1
如果需要进一步讨论,请为每个表提供
SHOW CREATE TABLE
。表投票是否包含大量数据或大量共币?为什么不在post\u id列上添加投票PK?然后,您有唯一的数据和post\u id上的索引,您可以在post\u id和table\u代码上添加索引,因为您在where条件中选择ti作为旁白,限制1似乎是多余的。请查看您的段落:“您似乎有..”。。!是的,就是说我可以删除id
列?老实说,没有id
列的表很奇怪:-)
,不是吗?没有主键的表很奇怪。通常,“自然PK”在各种方面都比人工的id
好。InnoDB在通过辅助索引进行查找时,获取PK(id
,位于辅助BTree的叶节点),然后通过PK进行第二次查找。通过将索引移动到PK中(如果它是唯一的),可以让查找只进行一步,而不是两步。