2016-04-30 67 views
0

我正在关注一个在线数据库课程,并且我收到了这个问题。应该创建什么索引?

假设我有表USER,CHECKIN和PLACE。

USER(uid,uname,ucity),uid是主键。

PLACE(pid,pname,pxcoord,pycoord,pcity),pid是主键。

CHECKIN(uid,pid,cdate,ctime),(uid,cdate,ctime)是主键。

该查询

select c.uid, c.pid c.cdate 
from user u join checkin c join place p 
where ucity='NewYork' and pcity='Chicago' 

只允许建立两个索引结构,什么是最好的选择,为什么?

+0

看起来像一个对我无效的查询。为什么我们需要无条件加入? – Basilevs

+0

@Basilevs - 查询在MySQL中有效。它可能不会达到目的。 http://stackoverflow.com/questions/16470942/can-i-use-mysql-join-without-on-condition –

+0

这就是我的意思。城市,访问和用户的笛卡尔积? – Basilevs

回答

3

对于该查询,请在ucity上创建一个索引,然后在pcity上创建索引。

此外,如果您允许创建最多2个索引,也许您可​​以修改其中一个。如果是这样的情况下,修改的CHECKIN表的主键也包含piduid之后,因为最有可能在不久的将来,你会从cross join在内部改造这个查询或左加入

+0

你能解释为什么不在uid和pid上创建索引,因为它们是连接键? – Vicky

+1

它们不是此查询中的连接键。这个查询是一个交叉连接查询(这3个表的所有行之间的笛卡尔积),因为你没有关于JOIN的子句 –

+0

好吧,所以如果它是自然连接,我们应该首先考虑连接键上的索引,然后在where子句中键? – Vicky