《MYSQL教程innodb_flush_method取值方法(實(shí)例講解)》要點(diǎn):
本文介紹了MYSQL教程innodb_flush_method取值方法(實(shí)例講解),希望對您有用。如果有疑問,可以聯(lián)系我們。
innodb_flush_method的幾個(gè)典型取值MYSQL教程
fsync: InnoDB uses the fsync() system call to flush both the data and log files. fsync is the default setting. O_DSYNC: InnoDB uses O_SYNC to open and flush the log files, and fsync() to flush the data files. InnoDB does not use O_DSYNC directly because there have been problems with it on many varieties of Unix. O_DIRECT: InnoDB uses O_DIRECT (or directio() on Solaris) to open the data files, and uses fsync() to flush both the data and log files. This option is available on some GNU/Linux versions,FreeBSD, and Solaris.
如何取值,mysql官方文檔是這么建議的MYSQL教程
How each settings affects performance depends on hardware configuration and workload. Benchmark your particular configuration to decide which setting to use, or whether to keep the default setting. Examine the Innodb_data_fsyncs status variable to see the overall number of fsync() calls for each setting. The mix of read and write operations in your workload can affect how a setting performs. For example, on a system with a hardware RAID controller and battery-backed write cache, O_DIRECT can help to avoid double buffering between the InnoDB buffer pool and the operating system's file system cache. On some systems where InnoDB data and log files are located on a SAN, the default value or O_DSYNC might be faster for a read-heavy workload with mostly SELECT statements. Always test this parameter with hardware and workload that reflect your production environment
也就是說,具體的取值跟硬件配置和工作負(fù)載相關(guān),最好做一次壓測來決定.不過通常來說,linux環(huán)境下具有raid控制器和write-back寫策略,o_direct是比較好的選擇;如果存儲介質(zhì)是SAN,那么使用默認(rèn)fsync或者osync或許更好一些.MYSQL教程
通常來說,貌似絕大部分人都取值o_direct,底層有raid卡,讀寫策略設(shè)置為write-back.在使用sysbench壓測oltp類型時(shí),我發(fā)現(xiàn)o_direct確實(shí)比fsync性能優(yōu)秀一些,看來適用于大部分場景,但是最近碰到一個(gè)這樣的sql,客戶反饋很慢,而在相同內(nèi)存的情況下,它自己搭建的云主機(jī)執(zhí)行相對快很多,后來我發(fā)現(xiàn)主要就是innodb_flush_method的設(shè)置值不同帶來的巨大性能差異.MYSQL教程
測試場景1MYSQL教程
innodb_flush_method為默認(rèn)值,即fsync,緩存池512M,表數(shù)據(jù)量1.2G,排除緩存池影響,穩(wěn)定后的結(jié)果MYSQL教程
mysql> show variables like '%innodb_flush_me%'; +---------------------+-------+ | Variable_name | Value | +---------------------+-------+ | innodb_flush_method | | +---------------------+-------+ 1 row in set (0.00 sec) mysql> SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main'; +--------------------------+ | SUM(outcome)-SUM(income) | +--------------------------+ | -191010.51 | +--------------------------+ 1 row in set (1.22 sec) mysql> SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main'; +--------------------------+ | SUM(outcome)-SUM(income) | +--------------------------+ | -191010.51 | +--------------------------+ 1 row in set (1.22 sec) mysql> explain SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main'; +----+-------------+---------+------+---------------+------------+---------+-------+--------+-----------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------+------+---------------+------------+---------+-------+--------+-----------------------+ | 1 | SIMPLE | journal | ref | account_id | account_id | 62 | const | 161638 | Using index condition | +----+-------------+---------+------+---------------+------------+---------+-------+--------+-----------------------+ 1 row in set (0.03 sec)
測試場景2MYSQL教程
innodb_flush_method改為o_direct,排除緩存池影響,穩(wěn)定后的結(jié)果MYSQL教程
mysql> show variables like '%innodb_flush_me%'; +---------------------+----------+ | Variable_name | Value | +---------------------+----------+ | innodb_flush_method | O_DIRECT | +---------------------+----------+ 1 row in set (0.00 sec) mysql> SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main'; +--------------------------+ | SUM(outcome)-SUM(income) | +--------------------------+ | -191010.51 | +--------------------------+ 1 row in set (3.22 sec) mysql> SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main'; +--------------------------+ | SUM(outcome)-SUM(income) | +--------------------------+ | -191010.51 | +--------------------------+ 1 row in set (3.02 sec) mysql> explain SELECT sql_no_cache SUM(outcome)-SUM(income) FROM journal where account_id = '1c6ab4e7-main'; +----+-------------+---------+------+---------------+------------+---------+-------+--------+-----------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------+------+---------------+------------+---------+-------+--------+-----------------------+ | 1 | SIMPLE | journal | ref | account_id | account_id | 62 | const | 161638 | Using index condition | +----+-------------+---------+------+---------------+------------+---------+-------+--------+-----------------------+ 1 row in set (0.00 sec)
結(jié)果比較:MYSQL教程
兩者執(zhí)行計(jì)劃一摸一樣,性能卻差距很大.在數(shù)據(jù)庫第一次啟動(dòng)時(shí)的查詢結(jié)果也差距很大,o_direct也差很多(測試結(jié)果略).不是很懂為啥這種情況下多了一層操作系統(tǒng)緩存,讀取效率就高了很多,生產(chǎn)環(huán)境設(shè)置一定要以壓測結(jié)果為準(zhǔn),實(shí)際效果為準(zhǔn),不能盲目信任經(jīng)驗(yàn)值.MYSQL教程
改進(jìn)措施:MYSQL教程
不改變innodb_flush_method的情況下,其實(shí)這條sql還可以進(jìn)一步優(yōu)化,通過添加組合索引(account_id,outcome,income),使得走覆蓋索引掃描,可大大地減少響應(yīng)時(shí)間MYSQL教程
以上這篇innodb_flush_method取值方法(實(shí)例講解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持維易PHP.MYSQL教程
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/3295.html