10

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

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

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

4

2 回答 2

27

这应该为您提供要运行的查询列表;)

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

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

于 2010-08-07T15:33:21.853 回答
0

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

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

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

于 2010-08-07T15:05:56.293 回答