我正在尝试加速我的网络应用程序中的SELECT
查询。我做了一些非常重要的优化,比如命令PHP返回的行而不是MySQL本身。现在我只是想知道,在作为主键的列上使用SELECT
语句会更快吗?
示例,我设置了一个包含settingKey
和settingValue
列的表,我将其用于配置。当settingValue
是主索引时,使用这样的语句获取settingKey
的内容会更快吗?
SELECT settingValue FROM config WHERE settingKey="MasterPassword"
我已经尝试了谷歌的答案,但没有得到明确的答案。
感谢。 :)
答案 0 :(得分:1)
是的,如果您从大表中选择一行,主键几乎肯定会提高性能。这是因为它将在表上创建一个索引,可以比使用全表扫描更有效地查找所需的行。
此外,它还会强制设置您的settingKey值的唯一性。
答案 1 :(得分:0)
我假设settingValue
上根本没有索引,部分原因是它没有意义,部分原因是你没有提及它。如果我的假设是正确的,那么通过主键查询是一个巨大的性能提升;它是该表最有效的访问路径。
根据经验,请勿使用未在WHERE
子句中编入索引的列。
答案 2 :(得分:0)
主键意味着:
这意味着它会非常好。
因此,在where子句中使用主键可能对性能有好处。
作为旁注:通常建议对主键和索引使用“小”和“简单”的列:
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
索引。
表的大小往往比辅助索引大,因此针对表的查找将比索引的查找慢。