好的,我这里有一个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
答案 0 :(得分:3)
我不知道,但我认为主键索引是最快的。如果是的话,使用任何其他索引的用处并不多。你要么会有一篇ID为3765的文章,要么你没有。扫描该单行以确定类型是否匹配是微不足道的。
如果您只返回一行,那么您的ORDER BY子句就没有意义了。并且a.type = 1的唯一要点是如果类型不正确,则拒绝具有正确id的文章。
答案 1 :(得分:1)
MySQL允许每个表最多32个索引,每个索引最多可包含16列。多列/复合索引被视为一个排序数组,其中包含通过连接索引列的值而创建的值。 MySQL使用多列索引,以便在WHERE子句中为索引的第一列指定已知数量时查询很快,即使您没有为其他列指定值也是如此。
如果仔细查看MySQL如何使用索引,您会发现索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找相关行。
在MySQL中,主键列会自动编入索引以提高效率,因为它们使用MySQL的内置AUTO_INCREMENT功能。另一方面,人们不应该过度索引。虽然它确实提高了从数据库读取的速度,但它减慢了更改数据库中数据的过程(因为需要将更改记录在索引中)。索引最适用于列: -
因此,如果我的查询足以满足其使用,我会尝试使用主键。当&只有当需要更多这样的索引和获取记录的牢固性,我是否使用复合索引。
希望它有所帮助。
答案 2 :(得分:0)
主键是唯一的,因此MySQL不需要检查任何其他索引。 a.id=3765
保证返回的行数不会超过一行。如果该行的a.type=1
为false,则不会返回任何内容。