我注意到在测试服务器上删除表中的多行需要花费很多时间,例如,删除100K行需要大约80-90秒。我在mysql中使用innodb引擎。没有DELETE触发器。该表现在有大约23M行。 需要很长时间的查询类似于:
DELETE FROM contacts WHERE list_id = som_list_id
添加了索引。
EXPLAIN SELECT *
FROM contacts
WHERE list_id =118
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE subscribers ref FK_list_id FK_list_id 4 const 1
以下是分析结果:
SET PROFILING = 1;
DELETE FROM contacts WHERE list_id = 118;
SHOW PROFILE FOR QUERY 1;
Status Duration CPU_user CPU_system Context_voluntary Context_involuntary Block_ops_in Block_ops_out Messages_sent Messages_received Page_faults_major Page_faults_minor Swaps Source_function Source_file Source_line
starting 0.000031 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
checking permissions 0.000004 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL check_access sql_parse.cc 4895
Opening tables 0.000031 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL open_tables sql_base.cc 4860
System lock 0.000005 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL mysql_lock_tables lock.cc 299
init 0.000079 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL mysql_delete sql_delete.cc 79
updating 94.624119 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL mysql_delete sql_delete.cc 277
end 0.000007 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL mysql_delete sql_delete.cc 356
Waiting for query cache lock 0.000003 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL lock sql_cache.cc 749
end 0.000006 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
query end 0.012509 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL mysql_execute_command sql_parse.cc 4584
closing tables 0.000018 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL mysql_execute_command sql_parse.cc 4636
freeing items 0.000038 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL mysql_parse sql_parse.cc 5817
logging slow query 0.000006 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL log_slow_statement sql_parse.cc 1581
logging slow query 0.000000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL log_slow_statement sql_parse.cc 1590
cleaning up 0.000003 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL dispatch_command sql_parse.cc 1443
我尝试将联系人复制到没有联系人的子表的contact1: 分析结果类似:
Status Duration CPU_user CPU_system Context_voluntary Context_involuntary Block_ops_in Block_ops_out Messages_sent Messages_received Page_faults_major Page_faults_minor Swaps Source_function Source_file Source_line
starting 0.000028 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
checking permissions 0.000005 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL check_access sql_parse.cc 4895
Opening tables 0.000035 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL open_tables sql_base.cc 4860
System lock 0.000014 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL mysql_lock_tables lock.cc 299
init 0.000792 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL mysql_delete sql_delete.cc 79
updating 72.805936 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL mysql_delete sql_delete.cc 277
end 0.000006 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL mysql_delete sql_delete.cc 356
Waiting for query cache lock 0.000002 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL lock sql_cache.cc 749
end 0.000006 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
query end 0.013662 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL mysql_execute_command sql_parse.cc 4584
closing tables 0.000017 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL mysql_execute_command sql_parse.cc 4636
freeing items 0.000044 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL mysql_parse sql_parse.cc 5817
logging slow query 0.000003 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL log_slow_statement sql_parse.cc 1581
logging slow query 0.000002 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL log_slow_statement sql_parse.cc 1590
cleaning up 0.000003 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL dispatch_command sql_parse.cc 1443
看起来更新大部分时间消耗。
为什么删除需要这么长时间?因为服务器的I / O系统很慢所以需要这么多时间吗? 谢谢。
答案 0 :(得分:0)
桌子是MyISAM吗?如果是这样,试试
delete quick from contacts...
其次是
optimize table contacts
使用quick没有数据库在删除期间合并索引。然后优化回收未使用的空间对表进行排除。