簡體   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