爲了提高服務器性能,我決定使用內存表來加快讀取用戶的信息。從另一個MyISAM表自動加載MEMORY表
我的問題是:如何在服務器關閉後從另一個MyISAM表中自動加載MEMORY表?
我可以在每次我想在MEMORY中查找時檢查行數,然後逐行加載PHP腳本,但從MyISAM讀取2,000,000條記錄需要時間並保存在MEMORY中。並檢查行數。雖然它不是線程安全的,我應該照顧它。
有沒有更好的方法?
爲了提高服務器性能,我決定使用內存表來加快讀取用戶的信息。從另一個MyISAM表自動加載MEMORY表
我的問題是:如何在服務器關閉後從另一個MyISAM表中自動加載MEMORY表?
我可以在每次我想在MEMORY中查找時檢查行數,然後逐行加載PHP腳本,但從MyISAM讀取2,000,000條記錄需要時間並保存在MEMORY中。並檢查行數。雖然它不是線程安全的,我應該照顧它。
有沒有更好的方法?
最簡單的方法是修改啓動MySQL的任何腳本(mysqld_safe?)並讓它運行'mysql'來發出一個命令來運行存儲過程來執行表填充。我不相信MySQL有任何內部的東西可以在啓動時自動觸發,或者任何類型的內部作業調度器。
我已經用下面的方法解決了這個問題。 1.在設置爲cron的php上創建一個腳本。版本 草案:
$connection = new PDO(....)
$sql = "Select id from table_memory limit 1";
$result = $connection->query($sql)->fetchColumn();
if (!$result) {
$sql = "select * into outfile '/path' from main_table";
$connection->exec($sql);
if (file_exists('/path')) {
$sql = "LOAD DATA INFILE '/path' INTO table_memory";
$connection->exec($sql);
}
}
//最後的檢查,如果有必要,併發送郵件或其他通知
看樣子你也可以配置MySQL使用在啓動時自動運行的某些陳述init_file選項:
http://dev.mysql.com/doc/refman/5.6/en/server-options.html#option_mysqld_init-file
你可以告訴它運行一個填充你的內存表的文件。
另一個考慮,如果你需要偶爾更新內存表是使用事件:
感謝馬克,你能舉例說明? – Shila
MySQL確實提供了一個事件調度器。請參閱:http://dev.mysql.com/doc/refman/5.6/en/server-options.html#option_mysqld_init-file –