Mysql 键缓存和操作系统缓存哪个更快?

Mysql 键缓存和操作系统缓存哪个更快?,mysql,caching,performance,indexing,key-cache-size,Mysql,Caching,Performance,Indexing,Key Cache Size,在1密耳的tb中。如果我在重新启动计算机后执行此操作,则不会缓存任何内容: 1.从tb1中选择价格、城市、州,其中ZIPD=13458; 结果是0.270秒内有23行 在我运行“将索引加载到缓存tb1”键\u buffer\u size=128M且tb的总索引大小为82M后: 2.从tb1中选择价格、城市、州,其中ZIPD=24781; 结果是0.252s内23行,Key_reads保持不变,Key_read_requests以23递增 但在我将'zipId'加载到操作系统缓存后,如果我再次运行

在1密耳的tb中。如果我在重新启动计算机后执行此操作,则不会缓存任何内容: 1.从tb1中选择价格、城市、州,其中ZIPD=13458; 结果是0.270秒内有23行

在我运行“将索引加载到缓存tb1”键\u buffer\u size=128M且tb的总索引大小为82M后: 2.从tb1中选择价格、城市、州,其中ZIPD=24781; 结果是0.252s内23行,Key_reads保持不变,Key_read_requests以23递增

但在我将'zipId'加载到操作系统缓存后,如果我再次运行查询: 2.从tb1中选择价格、城市、州,其中ZIPD=20548; 结果是0.006s中有22行

这只是一个简单的例子,但我运行了数十个测试和组合。但结果总是一样的。 我使用:MyISAM的MySql,windows764,查询缓存为0; zipId它是一个常规索引而不是主键

密钥缓存不应该比操作系统缓存快吗?? 在我将索引加载到缓存中之后,速度应该不会有很大的差异?? 在我的测试中,几乎没有区别

我读过很多关于这个问题的网站、教程和博客,但没有一个真正讨论速度上的差异。因此,任何想法或链接都将不胜感激。
谢谢。

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

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

要尝试的一件事是在查询中查看索引是如何使用的

编辑:因为我认为你的评论的答案不会放在评论空间里。我在这里回答

MyISAM本身没有缓存。它依赖操作系统进行磁盘缓存。表的缓存量取决于系统中运行的其他内容以及读取的数据量。Windows尤其不允许用户对缓存哪些数据以及缓存多长时间有太多的控制

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

SELECT indexed_col FROM tb1 WHERE zipId+0>1
像这样的查询,在谓词where子句上使用函数会导致MySQL执行完整表扫描,而不是使用任何索引。正如我上面所建议的,使用EXPLAIN SELECT查看MySQL正在做什么


如果希望对缓存进行更多控制,请尝试使用INNODB表。创建自己的缓存,您可以调整其大小,并更好地保存最新使用的内容

桌子的设计是什么?如果使用的索引不包括sipid、价格、城市和州,则密钥缓存不会很快。否则,查询将读取索引,然后读取表。@Thomas Jones Low索引将覆盖所有3列。我做了一些测试,如果选择1列或3列,或者所选列已编制索引或not@ThomasJones Low,还有为什么同样的疑问是,很多很多。。更快的操作系统缓存案例?基本上都是相同的步骤,我做了很多研究和测试,现在速度在0.000s以下。但有一件事我还不确定自己是否理解得很好:在这个查询中:从tb1中选择索引列,其中zipId+0>1,或者甚至从tb1中选择未索引列,其中zipId+0>1,或者从tb1中选择zipId忽略索引zipId缓存了什么?只有那个上校还是整个肺结核?因为我使用上面的哪个查询并不重要,但是在我使用它之后,每个SELECT都会像它在OS缓存中的所有表一样工作。也许你可以给我一个提示:在OS缓存中加载表的最佳方式是什么?我觉得上述方法不是最好的方法。而且过了一段时间,查询速度似乎变慢了。我的解释是,它将一些tb数据从操作系统缓存中推出。我说得对吗?这正常吗?如何防止这种情况发生?sistem有2G的RAM,当我在task manager上检查时,它通常在40-60%左右,所以我认为应该有足够的内存。