我有一张四列的桌子。一个是主键,另三个列是对其他表的列的引用。我在这四个表上使用join作为搜索筛选器。这些加入需要时间。
所以我想在列上有索引,因为我读到应该在联接条件的列上创建索引。我的问题是,如果表中的所有列都被索引,会不会出现问题?有没有其他方法可以降低这些搜索过滤器的时间复杂度。
更多提示:
我使用的是MyISAM引擎。
发布于 2012-01-20 17:39:00
当涉及到查询时,表的索引永远不应该是您的首要考虑。
您计划使用的查询应该指定所需的索引。
根据这些查询,可以单独对某些列进行索引。其他查询需要复合索引。ORDER BY和GROUP BY子句应该为要创建的索引提供即时提示。不使用此类提示可能会导致临时表排序,而不是按照所需的顺序对数据使用索引。
列值基数低应消除索引的需要。
即使考虑到这些因素,您也会发现该查询可能需要进行一些调整(即。(重构)以提高性能。
当您达到拥有正确索引的地步时,不必担心这些索引的大小。对于MyISAM表,这意味着.MYI文件可能会显著增长。
索引文件的大小以及索引的数量现在应该与查询的性能进行权衡,特别是如果索引提供了正确的数据排序和最快的检索。
根据行数、列的基数、删除和更新的数量,查询的解释计划可能会随着时间的推移而改变。一旦查询的解释计划改变了几个月前的样子,您就应该探索添加或删除索引的必要性。
发布于 2012-01-20 17:30:41
索引所有列(在每一列上索引)可能会或不会提高整体性能。这取决于指数的选择性。考虑为典型查询创建覆盖索引。例如,如果您通常连接所有3个表,则查询将主要受益于复合索引(f1,f2,f3)。此外,如果这三个字段的组合是唯一的,则可以在f1,f2,f3上定义主键,因此不需要代理PK (假设此表中没有其他字段)
https://dba.stackexchange.com/questions/11040
复制相似问题