MySQL Status Not_flushed_delayed_rows 数据库状态作用意思及如何正确
本站中文解释
MySQL status 变量是MySQL 服务器状态及性能指标的重要参数,它可以帮助DBA监控MySQL的性能、跟踪问题和优化MySQL。下面针对MySQL status变量 Not_flushed_delayed_rows,对其进行详细说明及用途如何设置。
Not_flushed_delayed_rows变量表示还没有被刷新到硬盘上的延迟写入行(delayed write-rows)的总数。MySQL支持MyISAM表及ARIA表使用延迟写入(delayed write)来提高性能,延迟写入会将插入、更新和删除的数据暂时放在内存缓冲区中,而不是立即刷新到硬盘上。延迟写入能把对MyISAM表和ARIA表的写操作批量写入磁盘文件,从而节约磁盘IO,减少OS处理磁盘的开销,提升查询的效率。
Not_flushed_delayed_rows变量的用处十分重要,它是查看延迟写入的性能的一个参数。当这个变量的值持续持高时,就可能是延迟写入IO失去了作用;当这个变量值过高时,表明MySQL对硬盘的IO操作太多;当这个变量值为0时,表明MySQL没有使用延迟写入特性,这种时候很有可能MyISAM表或ARIA表并没有定义delayed_key_write选项。
要获得MySQL status变量 Not_flushed_delayed_rows的值,可以使用命令行工具SHOW GLOBAL STATUS:
SHOW GLOBAL STATUS LIKE ‘%not_flushed_delayed_rows%’;
因为不同的MySQL版本和存储引擎,MySQL的默认延迟写入设置会有一些不同:
MySQL 5.1及以前的版本:
仅支持MyISAM表使用delayed_key_write。如果你的MySQL版本低于5.1,那么可以通过在MyISAM表结构中设置delayed_prefix_write来启用延迟写入机制。
MySQL 5.2及以后的版本:
MySQL在5.2以后加入了ARIA存储引擎,它也可以使用延迟写入。在MySQL 5.2或以后的版本中,MyISAM表可以通过设置delayed_prefix_write,而ARIA表可以通过设置delayed_options来设置延迟写入。
通过设置延迟写入的属性可以有效的节省MySQL的IO开销。要想使MyISAM或ARIA表使用延迟写入,就必须在表的结构中启用其delayed_key_write或delayed_options属性:
1、MyISAM表:在CREATE TABLE或ALTER TABLE语句中加入:
DELAY_KEY_WRITE=1
2、ARIA表:在CREATE TABLE或ALTER TABLE语句中加入:
DELAY_OPTIONS=1
如果你想查看MyISAM或ARIA表中是否设置了延迟写入,可以使用如下语句:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE DELAY_KEY_WRITE = 1 OR DELAY_OPTIONS = 1;
不过要注意,虽然延迟写入有助于提升性能,但它也会造成MySQL损失数据的风险。所以当你的应用程序出现大量写入时,比较保险的做法是取消延迟写入。要取消延迟写入,你可以执行命令:
FLUSH TABLES tblName WITH READ WRITE;
总之,MySQL status变量 Not_flushed_delayed_rows代表还没有被刷新到硬盘上的延迟写入行(delayed write-rows)的总数,可以用来监控延迟写入的性能,以便调整设置保证MySQL的最佳性能,而且设置了延迟写入的属性,MyISAM表和ARIA表通过设置delayed_key_write和delayed_options属性可以实现延迟写入,从而节省MySQL的IO开销,但也要注意不要出现丢失数据的风险,所以当一定条件成立的时候,应该及时取消延迟写入。