我对索引一个大表有些迷惑。问题是我需要使用很多不同的过滤器来查询它。因此,例如在一个表中:

id | key_1 | key_2 | ... | key_n


可能有一个针对一个或多个键的过滤器,每个键都在添加(我正在使用Zend框架使用准备好的语句来构建查询):

$select->where($this->_db->quoteInto('key_n = ?', $filter->key_n));


如果我正确理解以加快查询速度,则应该对一些列进行索引。因此,它引发了两个问题:


将索引添加到将用于过滤数据的所有列是否有意义?
如果我要索引很多列,它将如何影响将数据写入表的速度?
通过列的组合添加索引是否有意义?

最佳答案

@ bodi0发布的链接提供了一些答案。但我将添加以下内容:


  将索引添加到将要使用的所有列是否有意义?
  过滤数据?


也许。通常,索引确实可以加快数据检索的速度。但是在某些情况下却不是这样:如果索引列的cardinality较低,则索引可能没有提供任何好处,或者提供的好处很少,优化器可能会决定忽略它。例如,考虑一列“性别”,其中只有两个值“ M”或“ F”。如果每一行都适用于约50%的行,则索引的改进可能很小。或者,如果75%的记录为“ M”,而您要查询的是“ M”,则极有可能根本不使用索引。


  通过列的组合添加索引是否有意义?


也许。如果您知道经常使用某些列组合来过滤单个SELECT,则可以证明这种索引是有益的。请注意,要使索引可用,它的第一列必须在过滤条件中。例如:仅当将(gender, state)(以及可选的gender)用作查询中的条件时,才能使用列state上的索引。如果仅state被索引过滤,则不会使用。

然后,假设MySQL每个查询对一个表仅使用一个索引,则复合索引可能确实有意义,因为如果没有复合索引,则数据库引擎只能使用一个索引列。

09-12 11:13
查看更多