【问题标题】:MySql using primary index instead of multiple column one!MySql 使用主索引而不是多列一!
【发布时间】:2010-06-30 16:26:39
【问题描述】:

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

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

我想按国家和 id 获取准确的文章,并为该索引创建了两列 type 和 id。 Id 也是主键。 我使用 EXPLAIN 关键字来查看使用了哪个索引,而不是使用主键索引的多列索引,但我确实在创建索引时完全按顺序设置了 where 内容。

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

附:只是注意到当有 1 个结果行时使用 order 是愚蠢的。哈哈。它将搜索时间增加了 0.0001 秒。 :P

【问题讨论】:

    标签: php mysql indexing


    【解决方案1】:

    我不知道,但我认为主键索引将是最快的可用索引。如果是这样,使用任何其他索引就没有多大用处。你要么有一篇 id 为 3765 的文章,要么没有。扫描该单行以确定类型是否匹配很简单。

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

    【讨论】:

    • 你说完我就在想它,它使用主键似乎是合乎逻辑的。谢谢! :)
    【解决方案2】:

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

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

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

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

    因此,如果我的查询足以使用它,我会尝试使用主键。当&仅当需要更多这样的索引和获取记录的速度时,我才使用复合索引。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-10
        • 2020-05-09
        • 1970-01-01
        • 2013-04-07
        • 2013-05-20
        • 2020-09-19
        • 2012-01-19
        • 2019-01-24
        相关资源
        最近更新 更多