繁体   English   中英

如何使用MySQL将表预加载到INNODB缓冲池中?

[英]How to preload tables into INNODB buffer pool with MySQL?

我有一个使用MySQL的电子商务应用程序,我希望它更快。 当在之前访问过的网站上访问部件#时,部件会快速加载,因为所有必需的数据已经在INNODB缓冲池中。 但是,如果之前从未加载过部分#,那么该数据还不在缓冲池中,因此需要从磁盘读取,这很慢。 我将INNODB缓冲池设置为2GB,整个数据库只有350MB左右,因此有足够的空间在缓冲池中加载整个数据库。 我可以从INNODB统计数据中看到,目前只使用了大约一半的缓冲池。

我发现了预加载数据的引用,也称为“预热”缓冲池,例如在缓冲池中快速预加载Innodb表或mysqldump.azundris.com/archives/70-Innodb-cache-preloading-使用-blackhole.html。 该策略基本上涉及强制对每个表进行表扫描,因为MySQL没有用于预加载数据的本机方式。

我不想手动创建一个脚本来列出我的数据库中的每个表,并且必须这样做。 如何创建一个脚本,并自动为每个表执行选择,并自动选取一个非索引列以执行表扫描?

这应该给你一个要运行的查询列表;)

SELECT 
  CONCAT('SELECT ',MIN(c.COLUMN_NAME),' FROM ',c.TABLE_NAME,' WHERE ',MIN(c.COLUMN_NAME),' IS NOT NULL')
FROM
  information_schema.COLUMNS AS c
LEFT JOIN (
  SELECT DISTINCT
    TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME
  FROM
    information_schema.KEY_COLUMN_USAGE
) AS k
USING
  (TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME)
WHERE
  c.TABLE_SCHEMA = 'yourDatabase'
  AND k.COLUMN_NAME IS NULL
GROUP BY
  c.TABLE_NAME

您可以将其放入存储过程,并使用光标检查结果集。 从每一行创建一个准备好的语句,然后执行。

此查询将返回数据库中的表名,因此您不必手动输入它们:

SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database name'

然后为每个表名强制表扫描。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM