mysql多索引问题

时间:2009-10-29 00:42:24

标签: mysql indexing

我有一个表(用户),列为

id INT AUTOINVREMENT PRIMARY
uid INT index
email CHAR(128) UNIQUE
activated TINYINT 

我需要像这样查询这个表:

SELECT * FROM users WHERE uid = ? AND activated = 1

我的问题是,因为“uid”列上有一个索引集,为了获得上述查询的最佳性能,我是否还需要为“激活”列设置另一个索引?这个表(将是一个很大的表)将被'INSERT','UPDATE'语句以及'SELECT'语句大量访问。

正如我从其他来源获悉的那样,索引与'INSERT'和'UPDATE'语句相反,所以如果uid列上的索引足以满足上面的查询,我将不必为激活设置另一个索引对于'插入&更新的性能。

3 个答案:

答案 0 :(得分:4)

MySQL每个表只会使用1个索引,所以有一个额外的索引也无济于事。

但是,如果您希望获得最佳性能,请按以下顺序在两列上定义索引:(例如,2列中的1个索引)

index_name (uid, activated)

这样可以优化uiduid AND activated的搜索。

答案 1 :(得分:0)

这取决于您的数据分布和uid的选择性与uid和激活的选择性。如果你有很多uid的唯一值,这将具有高选择性,即搜索uid = x只返回几行,然后包括在索引中激活将提供很少的值。然而,如果uid = x返回大量行,而uid = x和activate = 1则返回几行,那么索引中就有值。

如果不知道数据分布,很难提供具体的答案。

答案 2 :(得分:0)

创建索引不会让你选择更慢。

然而,只有当您搜索事件不同时,它才会显着加快速度。

此索引仅在您的大部分帐户已激活并且您搜索未激活的帐户时有用,或者反之亦然:您的大多数帐户未激活,您搜索已激活

创建此索引还可以提高UPDATEDELETE并发性:如果没有此索引,给定uid的所有帐户(已激活和未激活)都将在此期间被锁定UPDATE中的InnoDB操作。

但是,额外的索引当然会妨碍DML性能。