就索引而言,索引所有将被搜索的字段(在WHERE中)以加速SELECTS是否合适?例如,我的数据库包含一个配置文件表,用于存储用户信息,如name,intrestCode,zip,description和email。配置文件记录由PRIMARY id列标识,该列唯一地与用户ID对应。我将zip和intrestCode设为索引,因为将通过zip搜索配置文件,并可能使用intrestCode(SELECT `blah`,`blah`... FROM profile WHERE zip=?
,SELECT `blah`,`blah`... FROM profile WHERE zip=? && intrestCode=?
)。我做得对吗?
答案 0 :(得分:3)
听起来基本正确。您应该知道,您不能在同一查询中的同一个表上使用两个不同的索引,因此如果您运行
CREATE INDEX `zip` ON `profile` (`zip`);
CREATE INDEX `intrestCode` ON `profile` (`intrestCode`);
然后查询
SELECT `blah`,`blah`... FROM profile WHERE zip=? && intrestCode=?
只能从索引中查找一个表。这里的秘诀是你可以在两个表上创建一个索引,如下所示:
CREATE INDEX `zip+intrestCode` ON `profile` (`zip`, `intrestCode`);
MySQL可以将此用于在WHERE子句中单独使用zip
的查询,或同时使用zip
和intrestCode
的查询,但不能用于仅使用intrestCode
的查询在WHERE子句中。
(这是因为每个索引都覆盖整个表。如果MySQL试图从不同的表中查找zip
和intrestCode
,那么它将从第二个索引中检索大量不相关的行因此,它只查看一个索引。如果要在两列上使用索引,则需要有一个包含两列的索引。)
答案 1 :(得分:1)
索引关系数据库有点艺术性。最好的方法是查看您将要进行的所有不同查询,并将索引放在所涉及的列上。使用EXPLAIN
查看查询将使用的索引。
但是,请记住,MySQL一次只能使用一个表中的一个索引。这就是您可以一次在多个列上放置索引的原因。如果只需要索引开头的列,MySQL可以使用多列索引。在您的示例中,我将多列索引zip
和intrestCode
放在一起,因为这将有助于两个查询。这样,您只需要zip
上的单独索引。
答案 2 :(得分:0)
我相信基本上是的。您应该监视数据库以发现更多问题,并根据结果优化查询和表格。
答案 3 :(得分:0)
通常,您希望将索引添加到要加入或包含在where子句中的列。请记住,两列上的索引与两列中每列上的索引不同。此外,如果您在多个列上有索引,则该顺序很重要。
假设您有两列A和B,并且按A和B的顺序排列有两列索引。有三种情况:
就像staticsan所说的那样,索引是一种艺术,并且没有规则可以100%适用。使用解释计划查看您的查询的执行情况并相应地进行调整。