2010-08-07 27 views
10

我有一個使用MySQL的電子商務應用程序,我希望它更快。當在之前訪問過的網站上訪問零件#時,零件會快速加載,因爲所有必要的數據都已存在於INNODB緩衝池中。但是,如果零件#以前從未裝入,那麼該數據尚未存入緩衝池,因此需要從磁盤讀取數據,速度很慢。我將INNODB緩衝池設置爲2GB,而整個數據庫只有大約350MB,因此有足夠的空間將整個數據庫加載到緩衝池中。我可以從INNODB統計數據中看到,現在只有大約一半的緩衝池被使用。如何使用MySQL將表預載入INNODB緩衝池?

我發現了預加載數據的參考,也稱爲「預熱」緩衝池,如Quickly preloading Innodb tables in the buffer pool或mysqldump.azundris.com/archives/70-Innodb-cache-preloading-using-blackhole html的。該策略基本上涉及在每個表上強制進行表掃描,因爲MySQL沒有用於預加載數據的本地方式。

我不想手動創建一個列出數據庫中每個表的腳本,並且必須執行此操作。我如何創建一個腳本並自動爲每個表執行選擇,並自動選取一個非索引列,以便執行表掃描?

回答

0

這個查詢會在你的數據庫返回表名,所以你不必手動輸入他們:

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

然後每個表名稱力表掃描。

22

這應該給你的查詢運行的列表;)

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 

你可以把它放到存儲過程,並在去用遊標結果集。從每一行創建一個準備好的語句,然後執行。

+3

這個算法簡潔明快。這將緩存innodb數據。我不確定是否會緩存所有innodb索引頁面,但是您的算法可以快速應用於此。我相信MyISAM只緩存MYI索引頁面。同樣,你的算法構成了通過表和索引的基礎。布拉沃(和+1)!!!! – RolandoMySQLDBA 2011-03-29 20:38:16

+1

我只是實現獲取查詢列表。這個想法來自問題中鏈接的Mysql性能博客。 – Mchl 2011-04-11 13:26:14

相關問題