正确索引MySQL

时间:2012-01-30 00:58:02

标签: php mysql indexing

就索引而言,索引所有将被搜索的字段(在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=?)。我做得对吗?

4 个答案:

答案 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的查询,或同时使用zipintrestCode的查询,但不能用于仅使用intrestCode的查询在WHERE子句中。

(这是因为每个索引都覆盖整个表。如果MySQL试图从不同的表中查找zipintrestCode,那么它将从第二个索引中检索大量不相关的行因此,它只查看一个索引。如果要在两列上使用索引,则需要有一个包含两列的索引。)

答案 1 :(得分:1)

索引关系数据库有点艺术性。最好的方法是查看您将要进行的所有不同查询,并将索引放在所涉及的列上。使用EXPLAIN查看查询将使用的索引。

但是,请记住,MySQL一次只能使用一个表中的一个索引。这就是您可以一次在多个列上放置索引的原因。如果只需要索引开头的列,MySQL可以使用多列索引。在您的示例中,我将多列索引zipintrestCode放在一起,因为这将有助于两个查询。这样,您只需要zip上的单独索引。

答案 2 :(得分:0)

我相信基本上是的。您应该监视数据库以发现更多问题,并根据结果优化查询和表格。

答案 3 :(得分:0)

通常,您希望将索引添加到要加入或包含在where子句中的列。请记住,两列上的索引与两列中每列上的索引不同。此外,如果您在多个列上有索引,则该顺序很重要。

假设您有两列A和B,并且按A和B的顺序排列有两列索引。有三种情况:

  1. 针对A列的Where子句:使用索引
  2. 针对B列的Where子句:未使用索引
  3. 针对A列和B列的Where子句:使用索引
  4. 就像staticsan所说的那样,索引是一种艺术,并且没有规则可以100%适用。使用解释计划查看您的查询的执行情况并相应地进行调整。