使用索引

时间:2016-04-30 18:29:23

标签: mysql database query-optimization

我仍然对这个感到困惑。这来自在线问题集。

假设我有表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'
  1. 我可能对定义有一些误解。但是只允许创建最多两个索引结构,我们应该如何在有序索引和B +树索引之间进行选择?

  2. 对于签入表,我们应该创建两个索引(uid,pid)吗?如果是这样,哪一个是主要或次要指数会有什么区别吗?

  3. 我在这里复制了原始问题

    "假设对于每个查询,您可以创建最多两个索引结构以使查询快速,您将创建什么索引结构,以及这将如何更改评估计划和运行时间(换句话说,提取使用这些索引具有特定非键值的单个记录。)"

1 个答案:

答案 0 :(得分:0)

“没有人”使用NATURAL JOIN。请更改为JOIN ... ON ...语法,以便明确表格的相关性。另外,请为每个表格提供SHOW CREATE TABLE

“只有2个索引结构”?你是在哪里拿到的? InnoDB'需要'一个 PRIMARY KEY最多 64个'二级密钥'。 PRIMARY KEY与数据一起存储,并以这种方式对数据进行排序。辅助键中包含主键,因此它们会进行第二次查找以获取数据。主键和辅助键都采用BTree结构。

根据MySQL定义,PRIMARY KEYUNIQUE和索引。因此,根据表中任何列(或列的组合)的唯一性,为表提供“自然”PRIMARY KEY。或者创建代理AUTO_INCREMENT密钥。然后制作查找和/或JOINing所需的其他任何键。

是的,索引使查询运行得更快。当您获得一些包含百万行的表时,我们可以讨论除此之外的细微问题。

在不使用任何索引的SELECT中,将扫描整个表(“表扫描”)。这是'慢',特别是如果表是'大'。但没关系。

如果可以使用索引,则查找单行(“点查询”)很快。它可以更快地使用PRIMARY KEY,但我们谈论的是1毫秒而不是典型情况下的2毫秒。即使对于十亿行表,我们也谈论的是10ms vs 20ms。另一方面,十亿行的表扫描可能需要数小时。这是为什么索引很重要的一个极端例子。

在您的查询中,您需要

INDEX(ucity)

如果您提供了EXPLAIN SELECT ...的查询和表格,那么添加该索引并再次运行EXPLAIN,您将看到不同之处。我们可以讨论事情如何变得更好以及表扫描如何消失。

有关如何编写最佳索引的更多讨论,请参阅我的cookbook

另一个提示:不要将DATETIME分成两个单独的字段。在需要时分割DATETIME比将两个字段放在一起要容易得多。