更新11M行数据库和my.cnf优化

时间:2012-11-16 08:15:42

标签: php mysql configuration sql-update easyphp

我必须在PHP脚本中更新数据库中的11M行。

一段时间后,脚本冻结或崩溃。我必须重新启动EasyPHP 12,然后重新加载它。

我的配置:

  • Windows 7 Pro 64位
  • 英特尔酷睿i7 860 2.8Ghz
  • 8G RAM

我的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;    }`

3 个答案:

答案 0 :(得分:1)

你必须看看php.ini,而不是my.cnf。

我想你在一条记录上执行一些逻辑并更新该记录,然后再到下一条记录。在这种情况下,单个记录(或记录子集)的更新不应该那个长。

冻结或崩溃是因为您的脚本达到了内存限制或其执行时间限制。

答案 1 :(得分:0)

您可能遇到执行时错误。您可以通过命令行创建一个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。有点像分页,但没有视觉输出。

来源:

答案 2 :(得分:0)

您需要从php.ini文件更改脚本的最长执行时间。