我试图通过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
:使用
答案 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%的解决方案,但我希望您能找到方法,我会很高兴看到您的发现。如果我想到更多的东西,我会告诉你。