在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
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缓存更快吗? 将索引加载到缓存后,不应该是速度的巨大差异吗? (在我的测试中它几乎没有区别)。
我已经阅读了很多有关此事的网站,教程和博客,但他们都没有真正讨论速度上的差异。因此,任何想法或链接将不胜感激 谢谢。
答案 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创建了自己可以调整大小的缓存,并且可以更好地保留最新使用的内容。