为了提高服务器性能,我决定使用内存表来更快地读取用户的信息。
我的问题是:如何在服务器关闭后从另一个MyISAM表自动加载MEMORY表?
我可以在每次想要在MEMORY中查找时检查行数,然后通过PHP脚本逐行加载,但是从MyISAM读取2,000,000条记录并保存在MEMORY中需要时间。并检查行数。虽然它不是线程安全的,我应该照顾它。
有没有更好的方法?
最简单的方法是修改启动MySQL的任何脚本(mysqld_safe?)并让它运行'mysql'来发出命令来运行存储的proc,它会填充你的表。我不认为MySQL内部有任何可以在启动时自动触发的内容,或者任何类型的内部作业调度程序。
我已通过以下方式解决了这个问题。 1.在php上创建一个设置为cron的脚本。草稿版本:
$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);
}
}
//必要时进行最终检查并发送邮件或其他通知
您似乎还可以使用init_file选项将MySQL配置为在启动时自动运行某些语句:
http://dev.mysql.com/doc/refman/5.6/en/server-options.html#option_mysqld_init-file
您可以告诉它运行填充内存表的文件。
另一个考虑因素,如果您需要偶尔更新内存表,则使用事件: