如果我只使用我的表进行读取,是否可以索引查询中使用的每一列?

时间:2014-10-30 12:31:27

标签: mysql sql

这可能很愚蠢,但我想知道......

我有一个用于只读的数据库,我没有做任何插入。

对索引中使用的每一列进行索引是否明智?如果是这样,我应该为asc和desc创建一个索引吗?

2 个答案:

答案 0 :(得分:0)

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%',则不会使用任何索引。

总的来说,索引什么是有用的,忽略其余部分。

答案 1 :(得分:0)

在几乎所有情况下,这都是一个坏主意。

您需要了解将对您的数据运行哪种查询。然后,您可以制定最佳的索引策略。

如果在大多数或所有查询中都使用某些列(运算符需要基于索引的优化),并且这些列具有高基数(许多不同的值,分布均匀),则应将它们编入索引

基数较低或分布较差的列以及仅用于同时使用其他高基数索引或根本不用于选择的查询的列不应编入索引。

相反,您应该考虑使某些索引复合(包括多个列),以便只使用索引中的列来实现最关键的查询。根据我的经验,可以为性能较差的查询进行最简单,最有效的优化是覆盖索引。

仅在覆盖索引的情况下,索引的顺序可能很重要(并且仅当索引的顺序与查询中指定的顺序相同时)。对于非覆盖指数,指数的顺序可能并不重要。

创建不需要的和不需要的索引会给你的系统增加一些开销(如果你永远不会INSERT或UPDATE这个表相对较少,但查询优化器仍然需要查看这些索引)并引入你可能“傻瓜”的可能性“当有更好的索引时,查询优化器具有低基数索引。