1、MySQL Innodb data_free 清理
每当MySQL从你的列表中删除了一行内容,该段空间就会被留空。而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更大。留空空间过大会影响SQL的执行速度,可以通过 ALTER TABLE table_name ENGINE = Innodb; 回收表空间
查看碎片
SELECT table_name,ENGINE,table_rows,data_length+index_length LENGTH,DATA_FREE
FROM information_schema.tables WHERE TABLE_SCHEMA='database';
DATA_FREE表示碎片
回收空间
ALTER TABLE tablename ENGINE=InnoDB
2、innodb_flush_log_at_trx_commit InnoDB事务日志刷盘设置
0,在提交事务时,InnoDB不会立即触发将缓存日志写到磁盘文件的操作,而是每秒触发一次缓存日志回写磁盘操作,并调用操作系统fsync刷新IO缓存。
1,在每个事务提交时,InnoDB立即将缓存中的redo日志回写到日志文件,并调用操作系统fsync刷新IO缓存。
2,在每个事务提交时,InnoDB立即将缓存中的redo日志回写到日志文件,但并不马上调用fsync来刷新IO缓存,而是每秒只做一次磁盘IO缓存刷新操作。
安全1 > 2 > 0,速度0 > 2 > 1
查看配置
SELECT @@innodb_flush_log_at_trx_commit;
设置
SET GLOBAL innodb_flush_log_at_trx_commit=1;
3、transaction_isolation 事务隔离级别
MySQL默认为REPEATABLE-READ,它利用自身独有的Gap Lock解决了"幻读"。但也因为Gap Lock的缘故,相比于READ-COMMITTED级别的Record Lock,REPEATABLE-READ的事务并发插入性能受到很大的限制。如果不是金融、电信等事务级别要求很高的业务,完全可以设置成transaction_isolation=READ-COMMITTED。
查看配置
SELECT @@global.tx_isolation;
设置
SET GLOBAL tx_isolation='repeatable-read';