哪个更快,key_cache或OS缓存?

时间:2010-11-25 00:21:34

标签: mysql caching performance indexing key-cache-size

在1密耳的tb中。如果我这样做(在我重新启动计算机之后 - 所以没有任何它被缓存):
1. SELECT price,city,state FROM tb1 WHERE zipId=13458;
结果是0.270s中的23个

运行'LOAD INDEX INTO CACHE tb1'后(key_buffer_size = 128M,tb的总索引大小为82M): 2. SELECT price,city,state FROM tb1 WHERE zipId=24781;
结果是0.252s中的23个,Key_reads保持不变,Key_read_requests增加23

将“zipId”加载到OS缓存后

BUT,如果我再次运行查询:
2. SELECT price,city,state FROM tb1 WHERE zipId=20548;
结果是0.006s中的22个

这只是一个简单的例子,但我运行了数十个测试和组合。但结果总是一样的。
我使用:MySql与MyISAM,WINDOWS 7 64,query_cache为0; zipId它是一个常规索引(不是主键)

不应该key_cache比OS缓存更快吗? 将索引加载到缓存后,不应该是速度的巨大差异吗? (在我的测试中它几乎没有区别)。

我已经阅读了很多有关此事的网站,教程和博客,但他们都没有真正讨论速度上的差异。因此,任何想法或链接将不胜感激 谢谢。

1 个答案:

答案 0 :(得分:0)

在正常查询处理下,MySQL将扫描索引中的where子句值(即zipId = 13458)。然后使用索引从MyISAM主表(第二个磁盘访问)中查找相应的值。将表加载到内存中时,磁盘访问都在内存中完成,而不是从读取实际磁盘。

查询的缓慢部分是从索引到主表的查找。因此,将索引加载到内存中可能无法提高查询速度。

要查询的一件事是Explain Select,以查看索引的使用方式。

修改:由于我认为您的评论的答案不适合评论空间。我会在这里回答他们。

MyISAM本身并没有缓存。它依赖于OS来执行磁盘缓存。缓存的表有多少取决于您在系统中运行的其他内容,以及您正在阅读的数据量。特别是Windows不允许用户很好地控制缓存的数据和持续时间。

操作系统缓存索引文件或完整表文件的磁盘块(4K或8K块)。

SELECT indexed_col FROM tb1 WHERE zipId+0>1

在谓词(Where子句)上使用函数的这样的查询可能导致MySQL执行全表扫描而不是使用任何索引。正如我上面建议的那样,使用EXPLAIN SELECT来查看MySQL正在做什么。

如果您想要更多地控制缓存,请尝试使用INNODB表。 InnoDB engine创建了自己可以调整大小的缓存,并且可以更好地保留最新使用的内容。