我有一个表(用户),列为
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列上的索引足以满足上面的查询,我将不必为激活设置另一个索引对于'插入&更新的性能。
答案 0 :(得分:4)
MySQL每个表只会使用1个索引,所以有一个额外的索引也无济于事。
但是,如果您希望获得最佳性能,请按以下顺序在两列上定义索引:(例如,2列中的1个索引)
index_name (uid, activated)
这样可以优化uid
或uid AND activated
的搜索。
答案 1 :(得分:0)
这取决于您的数据分布和uid的选择性与uid和激活的选择性。如果你有很多uid的唯一值,这将具有高选择性,即搜索uid = x只返回几行,然后包括在索引中激活将提供很少的值。然而,如果uid = x返回大量行,而uid = x和activate = 1则返回几行,那么索引中就有值。
如果不知道数据分布,很难提供具体的答案。
答案 2 :(得分:0)
创建索引不会让你选择更慢。
然而,只有当您搜索与事件不同时,它才会显着加快速度。
此索引仅在您的大部分帐户已激活并且您搜索未激活的帐户时有用,或者反之亦然:您的大多数帐户未激活,您搜索已激活。
创建此索引还可以提高UPDATE
和DELETE
并发性:如果没有此索引,给定uid
的所有帐户(已激活和未激活)都将在此期间被锁定UPDATE
中的InnoDB
操作。
但是,额外的索引当然会妨碍DML
性能。