Mysql 应该创建什么索引?

Mysql 应该创建什么索引?,mysql,sql,database,database-optimization,Mysql,Sql,Database,Database Optimization,我正在学习一门在线数据库课程,我得到了这个问题 假设我有用户表、签入表和位置表 用户(uid、uname、ucity),uid是主键 位置(pid、pname、pxcoord、pycoord、pcity),pid是主键 签入(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'

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

假设我有用户表、签入表和位置表

用户(uid、uname、ucity),uid是主键

位置(pid、pname、pxcoord、pycoord、pcity),pid是主键

签入(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'

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

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


另外,如果您最多可以创建2个索引,那么也可以修改一个索引。如果是这种情况,请修改
签入
表上的主键,使其也包含
pid
,紧跟在
uid
之后,因为在不久的将来,您很可能会将此查询从内部联接或左联接中的一个进行转换

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


另外,如果您最多可以创建2个索引,那么也可以修改一个索引。如果是这种情况,请修改
签入
表上的主键,使其也包含
pid
,紧跟在
uid
之后,因为在不久的将来,您很可能会将此查询从内部联接或左联接中转换过来

您能解释一下为什么不在uid和pid上创建索引吗,因为它们是连接键?在此查询中它们不是连接键。这个查询是一个交叉连接查询(这3个表中的所有行之间的笛卡尔积),因为您没有使用CysOSK的ON子句,所以如果是自然连接,那么我们应该首先考虑连接键的索引,然后在WHERE子句中键入索引吗?并且,如果您必须只选择ucity或pcity列中的一个列作为索引,请选择表中具有更多行的列。您可以解释一下为什么不在uid和pid上创建索引,因为它们是连接键吗?在这个查询中它们不是连接键。这个查询是一个交叉连接查询(这3个表中的所有行之间的笛卡尔积),因为您没有使用CysOSK的ON子句,所以如果是自然连接,那么我们应该首先考虑连接键的索引,然后在WHERE子句中键入索引吗?而且,如果您必须只选择ucity或pcity列中的一列作为索引,请选择表中具有更多行的列。在我看来,这是一个无效的查询。为什么我们需要无条件连接?@Basilevs-该查询在MySQL中有效。它可能不会达到预期的效果。这就是我的意思。城市、访问量和用户的笛卡尔乘积?在我看来似乎是一个无效的查询。为什么我们需要无条件连接?@Basilevs-该查询在MySQL中有效。它可能不会达到预期的效果。这就是我的意思。城市、游客和用户的笛卡尔乘积?