2010-06-30 72 views
2

好了,所以我有一个SQL查询的位置:MySql使用主索引而不是多列第一列!

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

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

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

+0

我说过之后就想到了它,而且它使用主键似乎是合乎逻辑的。谢谢! :) – Rihards 2010-06-30 17:12:37

0

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

1

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

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

在MySQL中,为了提高效率,主键列被自动索引,因为它们使用MySQL的内置AUTO_INCREMENT功能。另一方面,人们不应该过分追求索引。虽然它提高了从数据库中读取数据的速度,但它减缓了数据库中数据更改的过程(因为这些更改需要记录在索引中)。索引是最好的列上使用: -

  • 那些经常在查询
  • 那些经常在ORDER使用查询的一部分的WHERE部分使用
  • 有许多不同的值(列有许多重复值不应被索引)。

所以我尝试使用主键如果我的查询可以满足它的使用。当&只有当需要更多这样的索引&获取记录的牢固度时,才使用复合索引。

希望它有帮助。