在MySQL中使用SELECT和主键

时间:2010-02-26 16:58:19

标签: mysql select performance primary-key

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

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

SELECT settingValue FROM config WHERE settingKey="MasterPassword"

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

感谢。 :)

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

根据经验,请勿使用未在WHERE子句中编入索引的列。

答案 2 :(得分:0)

主键意味着:

  • 索引
  • 那是独一无二的

这意味着它会非常好。

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


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

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

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

答案 3 :(得分:0)

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

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

但请注意,它会稍微增加数据库加载时间。

答案 4 :(得分:0)

SELECT settingValue FROM config WHERE settingKey=`MasterPassword`

使用MyISAM表格,此查询的效果与settingKey a PRIMARY KEY或二级索引相同。

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

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

表的大小往往比辅助索引大,因此针对表的查找将比索引的查找慢。