【问题标题】:Using SELECT with a primary key in MySQL在 MySQL 中使用 SELECT 和主键
【发布时间】:2010-02-26 16:58:19
【问题描述】:

我正在尝试加快我的网络应用程序中的SELECT 查询。我做了一些非常重要的优化,比如对 PHP 返回的行而不是 MySQL 本身进行排序。现在我只是想知道,在作为主键的列上使用 SELECT 语句会更快吗?

例如,我有一个表,其中包含 settingKeysettingValue 列,我将其用于我的配置。当settingKey 是主索引时,使用这样的语句来获取settingValue 的内容会更快吗?

SELECT settingValue FROM config WHERE settingKey="MasterPassword"

我已经尝试用谷歌搜索答案,但没有得到明确的答案。

谢谢。 :)

【问题讨论】:

    标签: mysql select performance primary-key


    【解决方案1】:

    是的,如果您从大表中选择单行,主键几乎肯定会提高性能。这是因为它会在表上创建一个索引,使用它可以比进行全表扫描更有效地找到所需的行。

    此外,它还会强制您的 settingKey 值保持唯一性。

    【讨论】:

      【解决方案2】:

      主键意味着:

      • 索引
      • 这是独一无二的

      这意味着它会很好。

      因此,在 where 子句中使用主键可能对性能有好处。


      作为旁注:通常建议对主键和索引使用“小”和“简单”的列:

      • “小”列,如“只有几个字节”,意味着比较简单:比较两个 2 字节整数可能比比较两个 4 字节整数更容易。
      • “简单”列:比较两个 4 字节整数比比较两个 varchar(20) 更容易/更快 --考虑排序规则:比较字符串通常意味着不区分大小写和不区分重音符号的比较!

      例如,在您的情况下,如果您的主键是 integer 字段,而不是 varchar,则性能会更好(至少一点)。

      【讨论】:

        【解决方案3】:

        是的,主键会很快,因为它是索引且唯一的。

        或者,您可以在要查询的字段上创建一个新索引。有关详细信息,请参阅http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html。这将为您提供与查询主键大致相同的查询性能。

        但需要注意的是,它会稍微增加数据库加载时间。

        【讨论】:

          【解决方案4】:

          我假设settingValue 上根本没有索引,部分原因是它没有意义,部分原因是您没有提到它。如果我的假设是正确的,那么通过主键查询是一个巨大的性能提升;它是表格最有效的访问路径。

          根据经验,不要使用未在WHERE 子句中编制索引的列。

          【讨论】:

            【解决方案5】:
            SELECT settingValue FROM config WHERE settingKey=`MasterPassword`
            

            对于MyISAM 表,此查询将具有与settingKeyPRIMARY KEY 或二级索引相同的性能。

            对于InnoDB 表,如果settingKey次要 索引,此查询很可能会更快。

            InnoDB 表是聚集的,这意味着表本身就是PRIMARY KEY 索引。

            表的大小往往比二级索引大,因此对表的查找将比对索引的查找要慢。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-08-10
              • 2018-09-21
              • 2020-04-23
              • 2012-08-28
              • 2015-07-04
              • 1970-01-01
              相关资源
              最近更新 更多