[英]Updating 11M rows database and my.cnf optimisation
我必须用PHP脚本从数据库中更新1100万行。
一段时间后,脚本冻结或崩溃。 我必须重新启动EasyPHP 12,然后重新加载它。
我的配置:
我的my.cnf文件:
port = 3306
socket = /tmp/mysql.sock
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
thread_concurrency = 8
log-bin=mysql-bin
server-id = 1
[mysqldump]
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
这是崩溃的伪代码。
`For i to 100000 { do magic (check content on the web); UPDATE table; }`
您必须查看php.ini,而不是my.cnf。
我想您正在对一条记录执行一些逻辑并更新该记录,然后再更新到下一条。 在这种情况下,单个记录(或记录的子集)的更新不应花费那么长时间。
冻结或崩溃是因为您的脚本达到了内存限制或其执行时间限制。
您可能会遇到执行时间错误。 您可以通过命令行创建运行的shell脚本。
例如(伪):
<?php
SELECT * FROM table
LIMIT $x to $y
FOR every result
do some magic, SAVE to record with ID $id
如果您将此文件my_update.php
,请通过输入php path/to/my_update.php
运行它并观看魔术。 (其中php
是php可执行文件)。
保持聪明,并记录每一个动作! 因此,当脚本失败时,您将拥有不错的足迹,而不必从头开始! 这正是我在查询中添加LIMIT的原因,因此它不必缓冲11M的行,而只需缓冲一些。 在第一行行之后,它将简单地转到下一个LIMIT。 有点像分页,但是没有视觉输出。
资料来源:
您需要从php.ini文件中更改脚本的最大执行时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.