我在索引大型表时有点迷失。问题是我需要使用许多不同的过滤器来查询它。例如,在表格中:
id | key_1 | key_2 | ... | key_n
可能有一个或多个密钥的过滤器,每个都添加(我使用Zend框架使用预准备语句构建查询):
$select->where($this->_db->quoteInto('key_n = ?', $filter->key_n));
如果我理解正确加速查询,我应该索引一些列。所以它提出了几个问题:
答案 0 :(得分:0)
@ bodi0发布的链接有一些答案。但我会添加以下内容:
将索引添加到将要使用的所有列是否有意义 过滤数据?
也许。通常,索引会加速数据检索。但在某些情况下它不会:如果索引列的cardinality为低,则索引可能没有提供优点可能决定忽略它的优点。例如,可以考虑列“性别”,只有两个值“M”或“F”。如果每个行适用于大约50%的行,则索引可能几乎没有改进。或者,如果75%的记录是“M”而您正在查询“M”,则索引很可能根本不会被使用。
使用列的组合添加索引是否有意义?
也许。如果您知道某些列的组合通常会用于过滤单个SELECT
这样的索引可能会证明是有益的。请注意,虽然索引可用,但其第一列必须符合过滤条件。例如:列(gender, state)
上的索引只能在gender
(以及可选state
)用作查询中的条件时使用。如果索引仅过滤state
,则不会使用。
然后,鉴于MySQL对表的每个查询只使用一个索引,复合索引可能真的有意义,因为没有它,数据库引擎只能使用一个索引列。