最近银行有个小项目的MYSQL从库应用非常慢
从库状态
SLAVE_SQL_RUNNINGE_STATE:Waiting for dependent transaction to commit;
seconds_Behind_Master:12868
Master_Retry_Count:86400
Retrieved_Gtid_Set:XXXX-XXX-XXX:52673573-53071808
Executed_Gtid_Set:XXXX-XXX-XXX:1-53012595
Master_Info_File:mysql.slave_master_info
从库线程列表
slave> show processlist;
id user host db command time statue
92 225732 waiting for master to send event
93 2430 waiting for dependent transaction to commit;
94 17657 Executing event
开启了4个并发应用线程 ,发现等待事务提交
查看事务
select information_schema.innodb_trx\G;
trx_id:118172095
trx_state:running
start:2019-11-25 13:53:48
requested_lock_id:null
waite_started:null
weight:107178
mysql_thread_id:94
tables_in_use:1
tables_locked:1
lock_structs:692
lock_memory_bytes:90320
rows_locked:212972
rows_modified:106486
concurrency_tickets:0
isolation_leve:read commited
unique_checks:1
foreign_key_checks:1
foreign_key_error:null
没有具体的语句trx_query 可锁定21万行,修改了10万记录
这个是大事务啊。前端应用不会发那么大的事务过来。后来咨询到有本地作业定时删数据。并且根据某个非主键字段作为条件来删除数据的。
我们的BINLOG设置的ROW格式。每一行的变化要应用下SQL,也就是删除语句。主库删除1万条,只要执行一次DELETE TABLE WHER。。而从库要执行1万次。并且主库不根据主键来执行DELTET 是要锁定整个表的。
请各位注意这两个要点,听说水手公司JAVA开发人员很任性,就是要DML二级索引,DML必须根据主键ID来DML, 不能根据二级索引来,一方面造成死锁,另一方面造成锁表。MYSQL的锁会升级的,这个跟ORACLE不一样。MYSQL属于菜鸟级别!