主键删除需要永远的mysql

时间:2015-03-25 00:41:27

标签: mysql performance

我试图通过Table中的主键删除(300行),它占用最大查询执行时间,最后返回ERROR 2013: 2013: Lost connection to MySQL server during query。该表具有大表的外键(200k行)。可能是什么问题? 查询:DELETE FROM Table Where table_id=x
编辑:
没有与此DELETE语句关联的触发器。某些数据库表中的DELETE / INSERT / UPDATE语句工作得很慢,而整个数据库中的SELECT语句工作得很好 编辑#2:
来自innodb trx表的查询附加信息:
trx_lock_structs 429704
trx_lock_memmory_bytes 34698792
trx_rows_locked 214938
trx_isolation_level REPEATABLE READ trx_unique_checks 1
trx_foreign_key_checks 1
此查询删除1行并且没有子行,为什么锁定行值如此之高?

EDIT#3
进一步研究情况我已经确定具有慢插入/更新/删除操作的表是具有大表(200k)的外键的表。是否有必要删除此外键或数据完整性更重要?虽然200k行不是那么多,但这可能是造成这种缓慢操作的原因吗?

EDIT#4
SHOW CREATE TABLE:

CREATE TABLE `Table` (
`table_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`tableb_id` bigint(20) unsigned NOT NULL,
`tablec_id` bigint(20) unsigned DEFAULT NULL,
`bigtable_id` bigint(20) unsigned NOT NULL,
 PRIMARY KEY (`table_id`),
 KEY `fk_tableb_id_idx` (`tableb_id`),
 KEY `fk_bigtable_id_idx` (`bigtable_id`),
 KEY `fk_tablec_id_idx` (`tablec_id`),
 CONSTRAINT `fk_bigtable_id` FOREIGN KEY (`bigtable_id`) REFERENCES `Bigtable`  
 (`bigtable_id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `fk_tableb_id` FOREIGN KEY (`tableb_id`) REFERENCES `tablebs`  
 (`tableb_id`) ON DELETE CASCADE ON UPDATE NO ACTION,
 CONSTRAINT `fk_tablec_id` FOREIGN KEY (`tablec_id`) REFERENCES `tablecs`    
 (`tablec_id`) ON DELETE CASCADE ON UPDATE NO ACTION
 ) ENGINE=InnoDB AUTO_INCREMENT=271 DEFAULT CHARSET=utf8

BigTable是典型的用户表ID和附加信息 编辑#5
说明删除:
select_type:简单,
table:表,
type:范围,
possible_keys:主要,
key:PRIAMRY,
key_len:8,
ref:const,
rows:1,
Extra:使用

2 个答案:

答案 0 :(得分:2)

原因是在大桌上级联。你了解这个计算的复杂性吗?它不仅仅是300行的删除操作。它基本上是300行* 200k。每次删除都将通过大表并在相应的行上执行删除操作(基于id)。

只需按照以下步骤操作:

1) Remove the references of this primary id of this table from other tables (if any)
2) Alter this table and add NO ACTION to the UPDATE & CASCADE of big table foreign key 
   OR 
   remove all the foreign key contraints
3) delete from tableName

答案 1 :(得分:1)

我可能会建议采用经验方法......

删除对索引具有级联影响的操作,执行时间慢可能取决于精心设计fKey索引所需的时间,顺便说一下你的表格不是很大。你说你没有触发器,功能或程序,所以你必须对你的查询进行基准测试,以找出其中的部分需要花费这么多时间......
我假设您已经验证了索引的效率。

因此,要对您的删除查询进行基准测试,您应该方便地编写"内部删除"使用BENCHMARK()查询和评估每一个。

通过这种方式,您可以找到该删除的哪个部分花了这么长时间。

如果每个单个部分合理快速怎么办?

您的my.cnf中可能有一些配置错误,因此您可以尝试使用https://tools.percona.com/wizard建议进行检查... 也许你有一些内存分配限制或一些线程/内存限制。 您可以找到许多关于mysql优化的教程,如http://www.codingpedia.org/ama/optimizing-mysql-server-settings/

您还可以找到一些可以帮助您找到mysql优化的脚本。

在不了解您的体系结构,mysql配置和数据库结构的情况下,很难给出100%的解决方案,但我希望您能找到方法,我会很高兴看到您的发现。如果我想到更多的东西,我会告诉你。