MYSQL是否每次都将整个表加载到缓存中?

时间:2010-12-26 19:06:49

标签: php mysql

假设我有一张表,比如100万行,第一列是主键。

然后,如果我运行以下内容:

SELECT * FROM table WHERE id='tomato117' LIMIT 1

表ALL是否被放入缓存中(从而导​​致查询在添加越来越多的行时变慢)或者表的行数无关紧要,因为查询使用主键?

编辑:(添加限制1)

4 个答案:

答案 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列上有一个索引(包括它是否设置为主键),引擎将能够直接跳转到确切的行(或行,对于非唯一索引)并且只读取最小量的日期。如果没有索引,则需要读取整个表。