【问题标题】:What are the biggest benefits of using INDEXES in mysql?在 mysql 中使用 INDEXES 的最大好处是什么?
【发布时间】:2011-08-07 12:03:03
【问题描述】:

我知道我需要设置一个主键,并将任何应该唯一的东西设置为唯一键,但什么是 INDEX 以及如何使用它们?

有什么好处?优点缺点?我注意到我可以使用或不使用它们,我应该什么时候使用?

【问题讨论】:

标签: mysql indexing


【解决方案1】:

简答:
索引加快SELECT 的速度并减慢INSERT 的速度。

通常最好有索引,因为它们加快select 比减慢insert

UPDATE 上,如果在WHERE 子句中使用索引字段,则索引可以加快速度提升,如果您在update 索引字段之一中使用,则可以减慢速度。

您如何知道何时使用索引

在您的 SELECT 语句前面添加 EXPLAIN
像这样:

EXPLAIN SELECT * FROM table1 
WHERE unindexfield1 > unindexedfield2 
ORDER BY unindexedfield3

将向您展示 MySQL 必须对每个未索引字段执行多少工作。
使用该信息您可以决定是否值得添加索引。

Explain 还可以告诉你是否更好地删除和索引

EXPLAIN SELECT * FROM table1 
WHERE indexedfield1 > indexedfield2 
ORDER BY indexedfield3

如果选择的行很少,或者 MySQL 决定忽略索引(它会不时这样做),那么您不妨删除索引,因为它正在减慢您的inserts,但不会加快您的selects。

再一次,也可能是您的 select 语句不够聪明。
(对不起,答案很复杂,我试图保持简单,但失败了)。

链接:
MySQL indexes - what are the best practices?

【讨论】:

  • 我应该如何使用这个查询?:EXPLAIN SELECT * FROM table1 WHERE indexedfield1 > indexedfield2 ORDER BY indexedfield3;我的意思是我知道在 indexedfield1 上放什么,但是那些 indexedfield2 和 indexedfield3 怎么样?
【解决方案2】:

优点:

更快地查找结果。这一切都是为了减少磁盘 IO 的数量。您可以通过使用诸如B-TreesHash Indexes 之类的索引结构来减少磁盘IO(页面获取)的数量,而不是扫描整个表以获取结果,从而更快地获取数据。

缺点:

  • 写入速度较慢(可能)。您不仅必须将数据写入表,还必须写入索引。这可能会导致系统重新构建索引结构(哈希索引、B-Tree 等),这可能在计算上非常昂贵。

  • 自然会占用更多磁盘空间。您正在存储更多数据。

【讨论】:

    【解决方案3】:

    考虑索引的最简单方法是考虑字典。它有词,并且有与这些词相对应的定义。字典有一个关于“单词”的索引,因为当你去字典时,你想快速查找一个单词,然后得到它的定义。字典通常只包含一个索引 - 一个单词索引。

    数据库是类似的。当您在数据库中有一堆数据时,您将有某些方法可以将其取出。假设您有一个 User 表,并且您经常通过 FirstName 列查找用户。由于这是您在应用程序中经常执行的操作,因此您应该考虑在此列上使用索引。这将在数​​据库中创建一个结构,如果您愿意,按该列排序,以便按名字查找某些内容就像在字典中查找单词一样。如果您没有此索引,您可能需要先查看所有行,然后才能确定哪些行具有特定的 FirstName。通过添加索引,您的速度很快。

    那么为什么不在所有列上都建立一个索引并让它们都快呢?像所有事情一样,有一个权衡。每次您在表 User 中插入一行时,数据库都需要执行其魔法并对索引列上的所有内容进行排序。这可能很昂贵。

    【讨论】:

    • 因此,如果我的表非常大,有很多行,最好不要使用它们而只使用 PRIMARY KEY,我的大多数 WHERE 子句无论如何都只使用我的 PRIMARY KEY。谢谢你的回答。
    • 不一定-如果它确实有很多行,并且您确实需要通过主键以外的其他方式获取信息,那么您确实应该在该列上放置一个索引。如果人们要不断地通过该列获取信息,那么它需要快速。您只是不想随意添加索引,因为这是有后果的——希望对您有所帮助!
    【解决方案4】:

    你没有有一个主键。索引(任何类型)用于加速查询,并且至少使用 InnoDB 引擎强制执行外键约束。是使用唯一索引还是普通(非唯一)索引取决于您是否希望在键中允许重复值。

    【讨论】:

      【解决方案5】:

      这是一个通用的数据库概念,您可以使用外部资源来阅读它,例如 http://beginner-sql-tutorial.com/sql-index.htmhttp://en.wikipedia.org/wiki/Index_(database)

      【讨论】:

        【解决方案6】:

        索引允许 MySQL 更快地找到数据。您可以在 WHERE 子句中使用的列上使用它们。例如,如果您有一个名为 score 的列,并且想要查找所有包含 where score > 5 的内容,默认情况下,这意味着 MySQL 将需要扫描整个表以查找这些分数。但是,如果您使用 BTREE 索引,找到满足该条件的索引会更快。

        索引是有代价的:磁盘和内存空间。如果它是一个非常大的表,您的索引会变得相当大。

        【讨论】:

          【解决方案7】:

          这样想:在书中设置索引的最大好处是什么?这几乎是一样的。您有一本稍大的书,但您可以快速查找内容。当您在列上创建索引时,您是说您希望能够在 where 子句中引用它以快速查找它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-09-15
            • 2015-07-09
            • 2017-11-18
            • 2012-03-09
            • 2011-07-12
            • 2010-11-30
            • 1970-01-01
            相关资源
            最近更新 更多