我对索引一个大表有些迷惑。问题是我需要使用很多不同的过滤器来查询它。因此,例如在一个表中:
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每个查询对一个表仅使用一个索引,则复合索引可能确实有意义,因为如果没有复合索引,则数据库引擎只能使用一个索引列。