我知道我需要一个主键集,并设置任何唯一的键作为唯一键,但什么是INDEX以及如何使用它们?
有什么好处?优点缺点?我注意到我可以使用它们,我应该在什么时候使用它们?
Joh*_*ica 19
简短的回答:
指数加速SELECT和减速INSERT.
通常情况下,拥有索引会更好,因为它们的速度select比速度慢得多insert.
在一个UPDATE索引可以加快速度一路攀升,如果索引字段中使用的WHERE条款和慢下来的东西,如果你update的索引的领域之一.
你怎么知道何时使用索引
EXPLAIN在你的SELECT陈述前添加.
像这样:
EXPLAIN SELECT * FROM table1
WHERE unindexfield1 > unindexedfield2
ORDER BY unindexedfield3
Run Code Online (Sandbox Code Playgroud)
将向您展示MySQL在每个未编制索引的字段上必须完成的工作量.
使用该信息,您可以决定是否值得添加索引.
解释也可以告诉你是否更好地删除和索引
EXPLAIN SELECT * FROM table1
WHERE indexedfield1 > indexedfield2
ORDER BY indexedfield3
Run Code Online (Sandbox Code Playgroud)
如果选择了非常少的行,或者MySQL决定忽略索引(它会不时地执行此操作),那么您也可以删除索引,因为它会减慢您insert的速度,但不会加速您select的速度.
然后,也可能是你的select语句不够聪明.
(对不起,答案的复杂性,我试图保持简单,但失败了).
优点:
更快地查找结果.这就是减少磁盘IO的数量.您可以通过使用B-Trees或Hash Indexes之类的索引结构来更快地获取数据,而不是扫描整个表以获取结果,而不是减少磁盘IO的数量(页面提取).
缺点:
写得较慢(可能).您不仅需要将数据写入表中,还必须写入索引.这可能导致系统重构索引结构(哈希索引,B树等),这可能在计算上非常昂贵.
当然占用更多的磁盘空间.您正在存储更多数据.
考虑索引的最简单方法就是考虑字典。它有单词,并且有与这些单词相对应的定义。字典有一个关于“单词”的索引,因为当你查字典时,你想快速查找一个单词,然后得到它的定义。一本字典通常只包含一个索引——按单词的索引。
数据库是类似的。当数据库中有大量数据时,您将有某些想要将其取出的方法。假设您有一个 User 表,并且经常通过 FirstName 列查找用户。由于这是您在应用程序中经常执行的操作,因此您应该考虑在此列上使用索引。这将在数据库中创建一个结构,如果您愿意的话,可以按该列进行排序,以便按名字查找某些内容就像在字典中查找单词一样。如果您没有此索引,则可能需要先查看所有行,然后才能确定哪些行具有特定的 FirstName。通过添加索引,您可以加快速度。
那么为什么不在所有列上建立索引并使它们都变得更快呢?就像所有事情一样,需要权衡。每次您向表 User 中插入一行时,数据库都需要发挥其魔力并对索引列上的所有内容进行排序。这可能很昂贵。