【发布时间】:2012-11-06 15:20:11
【问题描述】:
有人告诉我,如果您知道自己会经常使用某个字段进行连接,那么最好在其上创建一个索引。
我通常理解为表格编制索引的概念(很像纸质书中的索引,允许您查找特定术语而无需逐页搜索)。但我不太清楚何时使用它们。
假设我有 3 个表:一个 USERS、COMMENTS 和一个 VOTES 表。我想创建一个类似 Stackoverflow 的评论线程,其中查询返回 cmets 以及对这些 cmets 的赞成/反对票数。
USERS table
user_id user_name
1 tim
2 sue
3 bill
4 karen
5 ed
COMMENTS table
comment_id topic_id comment commenter_id
1 1 good job! 1
2 2 nice work 2
3 1 bad job :) 3
VOTES table
vote_id vote comment_id voter_id
1 -1 1 5
2 1 1 4
3 1 3 1
4 -1 2 5
5 1 2 4
Here's the query and SQLFiddle to return the votes on topic_id=1:
select u.user_id, u.user_name,
c.comment_id, c.topic_id, c.comment,
count(v.vote) as totals, sum(v.vote > 0) as yes, sum(v.vote < 0) as no,
my_votes.vote as did_i_vote
from comments c
join users u on u.user_id = c.commenter_id
left join votes v on v.comment_id = c.comment_id
left join votes my_votes on my_votes.comment_id = c.comment_id
and my_votes.voter_id = 1
where c.topic_id = 1
group by c.comment_id, u.user_name, c.comment_id, c.topic_id, did_i_vote;
让我们假设 cmets 和投票的数量达到数百万。为了加快查询速度,我的问题是我应该在comments.commenter_id、votes.voter_id 和votes.comment_id 上添加索引吗?
【问题讨论】:
-
在加快查询速度时使用它们。
-
@SteveWellens 能否提供 SQL 代码以在答案和/或 SQLFiddle 中添加适当的索引?
-
您还需要在
topic_id上添加索引。 -
@Skpd,我对 -@SteveWellens 的评论相同...
-
@SteveWellens,我感兴趣的只是让人们在 SQLFiddle 的基础上进行构建,显然您不必回答,我也很感谢您的 cmets,并不是有意冒犯 :)跨度>
标签: mysql sql database indexing