【发布时间】:2011-11-13 17:46:35
【问题描述】:
这个 mysql 查询运行了大约 10 个小时,还没有完成。出事了。
这里有两个表格(文本和垃圾邮件)。 Spam 将垃圾邮件条目的 ID 存储在我要删除的文本中。
DELETE FROM tname.text WHERE old_id IN (SELECT textid FROM spam);
spam 只有 2 列,都是整数。 800K 条目的文件大小为几 Mbs。两个整数都是主键。
文本有 3 列。 id(主键)、文本、标志。大约 1200K 条目和大约 2.1 GB 大小(大多数垃圾邮件)。
服务器是一个至强四核,2 GB 内存(不要问我为什么)。只有 apache(为什么?)和 mysqld 正在运行。它是一个旧的免费 bsd 和 mysql 4.1.2(不要问我为什么)
线程:6 个问题:188805 慢查询:318 打开:810 刷新表:1 打开表:157 每秒查询平均:7.532
Mysql my.cnf:
[mysqld]
datadir=/usr/local/mysql
log-error=/usr/local/mysql/mysqld.err
pid-file=/usr/local/mysql/mysqld.pid
tmpdir=/var/tmp
innodb_data_home_dir =
innodb_log_files_in_group = 2
join_buffer_size=2M
key_buffer_size=32M
max_allowed_packet=1M
max_connections=800
myisam_sort_buffer_size=32M
query_cache_size=8M
read_buffer_size=2M
sort_buffer_size=2M
table_cache=256
skip-bdb
log-slow-queries = slow.log
long_query_time = 1
#skip-innodb
#default-table-type=innodb
innodb_data_file_path = /usr/local/mysql/ibdata1:10M:autoextend
innodb_log_group_home_dir = /usr/local/mysql/
innodb_buffer_pool_size = 128M
innodb_log_file_size = 16M
innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit=1
#innodb_additional_mem_pool_size=1M
#innodb_lock_wait_timeout=50
log-bin
server-id=201
[isamchk]
key_buffer_size=128M
read_buffer_size=128M
write_buffer_size=128M
sort_buffer_size=128M
[myisamchk]
key_buffer_size=128M[server:~] dmesg | grep memory
real memory = 2146828288 (2047 MB)
avail memory = 2095534080 (1998 MB)
read_buffer_size=128M
write_buffer_size=128M
sort_buffer_size=128M
tmpdir=/var/tmp
查询只使用一个 cpu,top 表示 25% cpu 时间(所以 1 of 4)。
real memory = 2146828288 (2047 MB)
avail memory = 2095534080 (1998 MB)
62 processes: 2 running, 60 sleeping
CPU states: 25.2% user, 0.0% nice, 1.6% system, 0.0% interrupt, 73.2% idle
Mem: 244M Active, 1430M Inact, 221M Wired, 75M Cache, 112M Buf, 31M Free
Swap: 4096M Total, 1996K Used, 4094M Free
PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND
11536 mysql 27 20 0 239M 224M kserel 3 441:16 94.29% mysqld
知道怎么解决吗?
【问题讨论】:
-
表上的存储引擎是什么?
-
您的查询包含一个 old_id 列,但您对表
text的描述没有 - 您真的描述了整个表吗?总的来说,我怀疑这个问题会随着更新的 MySQL 版本神奇地消失。 -
确保在
text.old_id和spam.textid上有索引。 -
是的,抱歉,它的 old_id 只是和 int 值(主键)。嗯...它是一个有很多用户的生产系统(由一个免费程序使用,如果服务器停止工作,它将停止工作)...菜鸟刚刚放弃了它,我被选中修复它...跨度>
-
我可以建议您将 MySQL 4.1.2 修补到更新的 4.1.21 版本,同样适用于 apache。有一些反向移植可能会对您有所帮助,尤其是针对
mysql_real_escape_string()的安全修复程序
标签: mysql subquery config sql-delete