【问题标题】:Which is faster, key_cache or OS cache?哪个更快,key_cache 或 OS 缓存?
【发布时间】:2010-11-25 00:21:33
【问题描述】:

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

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

BUT 将“zipId”加载到操作系统缓存后,如果我再次运行查询:
2. SELECT price,city,state FROM tb1 WHERE zipId=20548;
结果是 0.006 秒内 22 行

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

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

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

【问题讨论】:

  • 什么是桌子设计?如果使用的索引不涵盖 sipid、价格、城市和州,则 Key Cache 不会很快。否则查询会先读取索引,然后再读取表。
  • @Thomas Jones-Low 该索引涵盖所有 3 列。我已经进行了一些测试,如果我选择 1 或 3 col 并没有显着差异。或者,如果选定的列是否被索引
  • @Thomas Jones-Low 还有为什么同样的查询在操作系统缓存的情况下要快得多、快得多? (基本上都是一样的步骤)

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


【解决方案1】:

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

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

要尝试的一件事是 Explain Select 在您的查询中查看索引的使用情况。

编辑:因为我认为您的 cmets 的答案不适合评论空间。我会在这里回答他们。

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

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

SELECT indexed_col FROM tb1 WHERE zipId+0>1

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

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

【讨论】:

  • 我做了很多研究和测试,现在速度在0.000s以下。但有一件事我还不确定我是否理解得很好:在这个查询中:SELECT indexed_col FROM tb1 WHERE zipId+0>1 甚至 SELECT not_indexed_col FROM tb1 WHERE zipId+0>1SELECT zipId FROM tb1 IGNORE INDEX(zipId) 它缓存了什么?只有那个上校。还是整个 tb? (因为我使用上面的哪个查询并不重要,但是在我使用它之后,每个 SELECT 就像它在 OS 缓存中的所有表一样)
  • 另外,也许您可​​以给我一个提示:在 OS 缓存中加载表的最佳方法是什么?我感觉以上方法都不是最好的方法。而且过了一会儿,查询似乎变慢了。我的解释是它被推出了操作系统缓存的一些 tb 数据。我对吗?正常吗?我怎样才能防止这种情况发生?
  • 系统有 2G 内存,我在任务管理器上查看时通常在 40-60% 左右,所以我认为内存应该足够了。
猜你喜欢
  • 2013-01-08
  • 2011-03-10
  • 2018-05-23
  • 2015-08-03
  • 1970-01-01
  • 2021-09-06
  • 2010-11-10
  • 2012-10-03
  • 2011-02-15
相关资源
最近更新 更多