【发布时间】:2014-12-26 11:56:59
【问题描述】:
这可能很愚蠢,但我想知道......
我有一个只读数据库,我不做任何插入操作。
索引查询中使用的每一列是否明智?如果是这样,我应该为 asc 和 desc 创建一个索引吗?
【问题讨论】:
-
这个问题可能会提供一些见解:stackoverflow.com/questions/5447987/…
这可能很愚蠢,但我想知道......
我有一个只读数据库,我不做任何插入操作。
索引查询中使用的每一列是否明智?如果是这样,我应该为 asc 和 desc 创建一个索引吗?
【问题讨论】:
MySQL 当前忽略索引上的 asc 和 desc。它接受语法,但只是创建一个升序索引:-
http://dev.mysql.com/doc/refman/5.0/en/create-index.html
index_col_name 规范可以以 ASC 或 DESC 结尾。这些 未来扩展允许关键字用于指定升序 或降序索引值存储。目前,它们已被解析,但 忽略;索引值始终按升序存储。
索引确实会增加插入时间,但如果您不进行插入,这不是问题。它们确实增加了表格的大小,但对于大多数常见表格来说,这可能不是主要问题。
然而,MySQL 只会在查询中对表使用 1 个索引。因此,如果您在每个字段上都有一个索引,则查询将只使用其中一个索引。如果您的表格包含(作为示例)每个员工每月 1 行的工资单的详细信息,并且您在员工 ID 和月份上有一个索引,则只会使用其中的一个,尽管如果合并,这将是唯一的一个记录。为此,您需要涵盖超过 1 列的索引,并且所有组合都可能是相当多的索引。
任何大型文本字段可能都不值得使用普通索引进行索引(全文索引可能很有用,具体取决于您查询数据的方式)。对于这些,您需要检查字段的整个值,或者如果使用 LIKE,则需要检查字段开头的值。如果您查询的是WHERE some_field LIKE '%something%',则不会使用索引。
总体而言,将有用的内容编入索引并忽略其余部分。
【讨论】:
在几乎所有情况下,这都是一个坏主意。
您需要了解将对您的数据运行什么样的查询。然后,您可以制定最佳索引策略。
如果在您的大部分或所有查询中使用了某些列(使用基于索引优化的运算符),并且这些列具有高基数(许多不同的值,分布良好),则应将它们编入索引.
基数低或分布不佳的列以及仅用于同时使用另一个高基数索引的查询或根本不用于选择的列不应被编入索引。
相反,您应该考虑将一些索引组合起来(包括多列),这样您最关键的查询就可以仅使用索引中的列来完成。以我的经验,可以针对性能不佳的查询进行的最简单和最有效的优化是覆盖索引。
只有在覆盖索引的情况下,索引的顺序才可能很重要(并且只有当索引的顺序与查询中指定的顺序相同时)。对于非覆盖索引,索引的顺序可能并不重要。
创建不需要的和不需要的索引会给您的系统增加一些开销(如果您从不插入或更新表,则相对较少,但查询优化器仍然需要查看这些索引)并引入您“愚弄”的可能性" 当有更好的可用时,具有低基数索引的查询优化器。
【讨论】: