我仍然对这个感到困惑。这来自在线问题集。
假设我有表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 natural join checkin c natural join place p
where ucity='NewYork' and pcity='Chicago'
我可能对定义有一些误解。但是只允许创建最多两个索引结构,我们应该如何在有序索引和B +树索引之间进行选择?
对于签入表,我们应该创建两个索引(uid,pid)吗?如果是这样,哪一个是主要或次要指数会有什么区别吗?
我在这里复制了原始问题
"假设对于每个查询,您可以创建最多两个索引结构以使查询快速,您将创建什么索引结构,以及这将如何更改评估计划和运行时间(换句话说,提取使用这些索引具有特定非键值的单个记录。)"
答案 0 :(得分:0)
“没有人”使用NATURAL JOIN
。请更改为JOIN ... ON ...
语法,以便明确表格的相关性。另外,请为每个表格提供SHOW CREATE TABLE
。
“只有2个索引结构”?你是在哪里拿到的? InnoDB'需要'一个 PRIMARY KEY
和最多 64个'二级密钥'。 PRIMARY KEY
与数据一起存储,并以这种方式对数据进行排序。辅助键中包含主键,因此它们会进行第二次查找以获取数据。主键和辅助键都采用BTree结构。
根据MySQL定义,PRIMARY KEY
是UNIQUE
和索引。因此,根据表中任何列(或列的组合)的唯一性,为表提供“自然”PRIMARY KEY
。或者创建代理AUTO_INCREMENT
密钥。然后制作查找和/或JOINing
所需的其他任何键。
是的,索引使查询运行得更快。当您获得一些包含百万行的表时,我们可以讨论除此之外的细微问题。
在不使用任何索引的SELECT
中,将扫描整个表(“表扫描”)。这是'慢',特别是如果表是'大'。但没关系。
如果可以使用索引,则查找单行(“点查询”)很快。它可以更快地使用PRIMARY KEY
,但我们谈论的是1毫秒而不是典型情况下的2毫秒。即使对于十亿行表,我们也谈论的是10ms vs 20ms。另一方面,十亿行的表扫描可能需要数小时。这是为什么索引很重要的一个极端例子。
在您的查询中,您需要
INDEX(ucity)
如果您提供了EXPLAIN SELECT ...
的查询和表格,那么添加该索引并再次运行EXPLAIN
,您将看到不同之处。我们可以讨论事情如何变得更好以及表扫描如何消失。
有关如何编写最佳索引的更多讨论,请参阅我的cookbook。
另一个提示:不要将DATE
和TIME
分成两个单独的字段。在需要时分割DATETIME
比将两个字段放在一起要容易得多。