【问题标题】:mysql push index into memorymysql将索引推入内存
【发布时间】:2011-11-24 12:15:57
【问题描述】:

我使用 MySQL (MyISA)。超过 8M 行的表。 'id' 上的主索引。

我的申请展示:

first run: 55 req/sec, 
second run: ~120 req/sec, 
third run: ~1200 req/sec, 
fourth run: ~4500 req/sec, 
fifth run: ~9999 req/sec

重启 mysql-server 后再次相同。 启动数据库服务器后如何将所有索引一次性放入内存?

在我的.cnf 中

key_buffer_size=2000M

代码示例:

now = datetime.datetime.now()
cursor = connection.cursor()
for x in xrange(1, 10000):
    id = random.randint(10, 100000) # random first 10000 records for cache
    cursor.execute("""SELECT num, manufacturer_id
                   FROM product WHERE id=%s LIMIT 1""", [id])
    cursor.fetchone()    

td = datetime.datetime.now() - now
sec = td.seconds + td.days * 24 * 3600
print "%.2f operation/sec" % (float(x) / float(sec))

【问题讨论】:

标签: mysql memory indexing


【解决方案1】:

我认为这里有两个缓存在起作用。一种是索引缓存,可以预加载LOAD INDEX INTO CACHE

另一个是query cache,我认为在您的情况下,这是获得最多性能的地方。无法使用任何 mysql 命令预加载的 AFAIK。

您可以做的是替换重新启动前运行的最后 N 个查询。然后这些查询将填充缓存。或者保留一些实际查询的文件以在启动时运行。

【讨论】:

  • 如果您想查看“QUERY-CACHE-independent”的性能,可能需要在查询中添加/*! SQL_NO_CACHE */ 提示。通过这种方式,您将看到索引缓存、页面预取或表缓存是否真的很普遍。
猜你喜欢
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 2020-01-27
  • 2021-01-31
  • 2021-11-05
  • 2011-05-16
相关资源
最近更新 更多