【问题标题】:What index should be created?应该创建什么索引?
【发布时间】:2016-08-25 09:21:45
【问题描述】:

我正在学习一个在线数据库课程,我收到了这个问题。

假设我有表 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'

最多只能创建两个索引结构,最好的选择是什么,为什么?

【问题讨论】:

  • 对我来说似乎是一个无效的查询。为什么我们需要无条件连接?
  • @Basilevs - 查询在 MySQL 中有效。它可能无法达到预期的效果。 stackoverflow.com/questions/16470942/…
  • 这就是我的意思。城市、访问量和用户的笛卡尔积?

标签: mysql sql database database-optimization


【解决方案1】:

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

另外,如果您最多可以创建 2 个索引,也许您也可以修改一个。如果是这种情况,请将CHECKIN 表上的主键修改为也包含pid,紧跟在uid 之后,因为很可能在不久的将来,您将把这个查询从cross join 转换为内部或左连接

【讨论】:

  • 您能解释一下为什么不在 uid 和 pid 上创建索引,因为它们是连接键?
  • 它们不是此查询中的连接键。此查询是交叉连接查询(这 3 个表的所有行之间的笛卡尔积),因为您的 JOIN 没有 on 子句
  • 好的,如果是自然连接,我们是否应该首先考虑连接键上的索引,然后是 where 子句中的键?
  • 没错。而且,如果您只需要选择 ucity 或 pcity 列之一进行索引,请选择表中具有更多行的列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多