假设我有一张表,比如100万行,第一列是主键。
然后,如果我运行以下内容:
SELECT * FROM table WHERE id='tomato117' LIMIT 1
表ALL是否被放入缓存中(从而导致查询在添加越来越多的行时变慢)或者表的行数无关紧要,因为查询使用主键?
编辑:(添加限制1)
答案 0 :(得分:4)
如果id
被定义为主键,只有一个值为tomato117
的记录,那么限制无用。
使用SELECT *
将触发从磁盘读取mysql,因为不太可能将所有列存储到索引中。 (mysql无法从索引中获取)从理论上讲,它会影响性能。
但是,您的sql是匹配查询缓存条件。因此,mysql会将结果存储到查询缓存中以供后续使用。
如果查询缓存大小很大,mysql会将所有sql结果存储到查询缓存中,直到内存满为止。
这带来了成本,如果你的表上有更新,查询缓存失效将更难为mysql。
答案 1 :(得分:1)
SELECT * FROM table WHERE id = 'tomato117' LIMIT 1
当找到tomato117时,它会停止搜索,如果你没有设置LIMIT 1,它将搜索到表的末尾。 tomato117可以是第二个,它仍将搜索1 000 000行用于其他番茄117。
http://forge.mysql.com/wiki/Top10SQLPerformanceTips
Showing rows 0 - 0 (1 total, Query took 0.0159 sec)
SELECT *
FROM 'forum_posts'
WHERE pid = 643154
LIMIT 0 , 30
Showing rows 0 - 0 (1 total, Query took 0.0003 sec)
SELECT *
FROM `forum_posts`
WHERE pid = 643154
LIMIT 1
表约为1GB,600 000+行。
答案 2 :(得分:1)
没有那种。
它只会获取您选择的行以及其他一些块。它们将保留在缓存中,直到某些东西推出它们。
通过缓存,我指的是innodb缓冲池,而不是查询缓存,无论如何都应该关闭。
答案 3 :(得分:0)
如果您在单词EXPLAIN
之前添加单词SELECT
,它会显示一个表格,其中包含正在阅读的行数而不是正常结果的摘要。
如果您的表在id
列上有一个索引(包括它是否设置为主键),引擎将能够直接跳转到确切的行(或行,对于非唯一索引)并且只读取最小量的日期。如果没有索引,则需要读取整个表。