MySql使用主索引而不是多列第一列!

时间:2010-06-30 16:26:40

标签: php mysql indexing

好的,我这里有一个SQL查询:

 SELECT a.id,... FROM article AS a WHERE a.type=1 AND a.id=3765 ORDER BY a.datetime DESC LIMIT 1

我希望按国家和ID获取确切的文章,并为该索引创建两个列类型和ID。 Id也是主键。 我使用EXPLAIN关键字来查看使用了哪个索引,而不是使用主键索引的多列索引,但是我确实按照创建索引的顺序设置了内容。

MySQL是否使用主键索引而不是多列索引,因为主键索引更快?或者我应该强制MySql使用多列索引吗?

P.S。刚注意到当有1个结果行时使用顺序是愚蠢的。哈哈。它将搜索时间增加了0.0001秒。 :P

3 个答案:

答案 0 :(得分:3)

我不知道,但我认为主键索引是最快的。如果是的话,使用任何其他索引的用处并不多。你要么会有一篇ID为3765的文章,要么你没有。扫描该单行以确定类型是否匹配是微不足道的。

如果您只返回一行,那么您的ORDER BY子句就没有意义了。并且a.type = 1的唯一要点是如果类型不正确,则拒绝具有正确id的文章。

答案 1 :(得分:1)

MySQL允许每个表最多32个索引,每个索引最多可包含16列。多列/复合索引被视为一个排序数组,其中包含通过连接索引列的值而创建的值。 MySQL使用多列索引,以便在WHERE子句中为索引的第一列指定已知数量时查询很快,即使您没有为其他列指定值也是如此。

如果仔细查看MySQL如何使用索引,您会发现索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找相关行。

在MySQL中,主键列会自动编入索引以提高效率,因为它们使用MySQL的内置AUTO_INCREMENT功能。另一方面,人们不应该过度索引。虽然它确实提高了从数据库读取的速度,但它减慢了更改数据库中数据的过程(因为需要将更改记录在索引中)。索引最适用于列: -

  • 经常在查询的WHERE部分中使用
  • 经常用于查询的ORDER BY部分
  • 具有许多不同的值(具有多个重复值的列不应被索引)。

因此,如果我的查询足以满足其使用,我会尝试使用主键。当&只有当需要更多这样的索引和获取记录的牢固性,我是否使用复合索引。

希望它有所帮助。

答案 2 :(得分:0)

主键是唯一的,因此MySQL不需要检查任何其他索引。 a.id=3765保证返回的行数不会超过一行。如果该行的a.type=1为false,则不会返回任何内容。