2011-11-03 55 views
0

我有下表。我不知道定义其他密钥是否会导致服务器速度降低? 换句话说,如果我为任何MySQL表定义了10个或更多的键,我的查询速度是否会提高?此外,它是建议(添加更多的关键表)?关键定义Mysql优化

CREATE TABLE IF NOT EXISTS `xxx` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`intval1` int(11) DEFAULT NULL, 
`intval2` int(11) DEFAULT NULL, 
`intval3` int(11) DEFAULT NULL, 
`intval4` int(11) DEFAULT NULL, 
`intval5` int(11) DEFAULT NULL, 
`intval6` int(11) DEFAULT NULL, 
`intval7` int(11) DEFAULT NULL, 
`intval8` int(11) DEFAULT NULL, 
`intval9` int(11) DEFAULT NULL, 
`intval10` int(11) DEFAULT NULL, 
`intval11` int(11) DEFAULT NULL, 
`intval12` int(11) DEFAULT NULL, 
`intval13` int(11) DEFAULT NULL, 
`intval14` int(11) DEFAULT NULL, 
`intval15` int(11) DEFAULT NULL, 
`intval16` int(11) DEFAULT NULL, 
`intval17` int(11) DEFAULT NULL, 
`intval18` int(11) DEFAULT NULL, 
`intval19` int(11) DEFAULT NULL, 
`intval20` int(11) DEFAULT NULL 
) 
+1

如果没有上下文,不会帮助您有一个包含100列以上的单个表......但如果与数据库和其他相关表(如查找表)之间存在关系,那么您可能会在右脚远离...考虑数据标准化Guildelines。 – DRapp

回答

2

您添加的任何索引都会降低索引列中值的插入和更新速度,因为索引需要更新。 (这可能会因加速使用WHERE子句的更新而加以抵消。)

否则,回答您的问题的唯一方法是知道将针对该表发出哪些查询。如果查询将要求MySQL按id和/或intval1的值查找行,那么intval2上的索引不会加速任何操作。

通常,您应该只索引帮助查询的列。有关更多信息,请查看Optimization and Indexes上的MySQL手册部分。

1

正确的索引取决于使用的查询(否则它只是自动的),索引的大小和它们的数量很重要。它们放慢写入(插入,更新),但加速选择(选择,更新,删除 - 因为它们用于解决更新/删除的where子句)。

请记住,您可以在多个列上有1个索引,但只有在查询中使用了索引中最左侧的列时才能使用它。由于MySQL仅使用1个索引来解析查询(如果存在连接条件,但对于简单查询,技术上不正确),但在许多情况下,复合索引更好。 (MySQL的最新版本支持index_merge,它有多个索引用于解析查询,但仍然比复合索引慢)。

如果存储引擎InnoDB的,而你只选择其中使用了索引的一部分列中的所有列,查询是非常快(它被称为索引覆盖查询)

而且,重要的当您决定是否必须使用索引或不是特定列时,请考虑索引选择性 - 索引中每个唯一值的平均记录数。如果你有100000条记录,但只有2个可能的值,接近50%:50%的分布,选择性会很低 - MySQL仍然需要扫描接近50 000条记录。如果有10000个不同的值,选择性很高,这是一个很好的指标。

在同一个查询中可以使用多个索引可能会导致MySQL没有选择最好的索引。

在1句话中:尽可能降低索引的数量(但对每个查询执行索引,除非如果您知道表扫描在您的情况下是更好的选择)并且更喜欢复合索引而不是单独索引不同的列。