实例详解mysql中innodb_flush_method方法
下面小编就为大家带来一篇innodb_flush_method取值方法(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
innodb_flush_method的几个典型取值
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官方文档是这么建议的
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
也就是说,具体的取值跟硬件配置和工作负载相关,最好做一次压测来决定。不过通常来说,linux环境下具有raid控制器和write-back写策略,o_direct是比较好的选择;如果存储介质是SAN,那么使用默认fsync或者osync或许更好一些。
通常来说,貌似绝大部分人都取值o_direct,底层有raid卡,读写策略设置为write-back。在使用sysbench压测oltp类型时,我发现o_direct确实比fsync性能优秀一些,看来适用于大部分场景,但是最近碰到一个这样的sql,客户反馈很慢,而在相同内存的情况下,它自己搭建的云主机执行相对快很多,后来我发现主要就是innodb_flush_method的设置值不同带来的巨大性能差异。
测试场景1
innodb_flush_method为默认值,即fsync,缓存池512M,表数据量1.2G,排除缓存池影响,稳定后的结果
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)
测试场景2
innodb_flush_method改为o_direct,排除缓存池影响,稳定后的结果
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)
结果比较:
两者执行计划一摸一样,性能却差距很大。在数据库第一次启动时的查询结果也差距很大,o_direct也差很多(测试结果略)。不是很懂为啥这种情况下多了一层操作系统缓存,读取效率就高了很多,生产环境设置一定要以压测结果为准,实际效果为准,不能盲目信任经验值。
改进措施:
不改变innodb_flush_method的情况下,其实这条sql还可以进一步优化,通过添加组合索引(account_id,outcome,income),使得走覆盖索引扫描,可大大地减少响应时间
【相关推荐】
1. Mysql免费视频教程
Atas ialah kandungan terperinci 实例详解mysql中innodb_flush_method方法. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Apabila menggunakan PHP untuk pembangunan aplikasi web, anda selalunya perlu menggunakan pangkalan data. Apabila menggunakan pangkalan data, mesej ralat adalah sangat biasa. Antaranya, PHPFatalerror: Calltoamemberfunctionfetch() ialah ralat yang agak biasa berlaku apabila menggunakan PDO untuk menanyakan pangkalan data. Jadi, apa yang menyebabkan ralat ini dan bagaimana untuk menyelesaikannya? Artikel ini akan menerangkannya secara terperinci untuk anda. 1. Punca kesilapan

InnoDB ialah salah satu enjin pangkalan data MySQL Ia kini merupakan enjin storan lalai MySQL dan salah satu piawaian untuk keluaran binari oleh MySQL AB InnoDB menggunakan sistem kebenaran dwi-trek, satu adalah keizinan GPL dan satu lagi adalah perisian proprietari kebenaran. InnoDB ialah enjin pilihan untuk pangkalan data transaksi dan menyokong jadual keselamatan transaksi (ACID);

InnoDB ialah enjin storan yang menyimpan data dalam jadual pada cakera, jadi data kami akan tetap wujud walaupun selepas ditutup dan dimulakan semula. Proses sebenar pemprosesan data berlaku dalam ingatan, jadi data dalam cakera perlu dimuatkan ke dalam memori Jika ia memproses permintaan tulis atau pengubahsuaian, kandungan dalam memori juga perlu dimuat semula ke cakera. Dan kita tahu bahawa kelajuan membaca dan menulis ke cakera adalah sangat perlahan, iaitu beberapa urutan magnitud yang berbeza daripada membaca dan menulis dalam ingatan Jadi apabila kita ingin mendapatkan rekod tertentu dari jadual, adakah enjin storan InnoDB perlu membaca rekod dari cakera satu demi satu? Kaedah yang digunakan oleh InnoDB adalah untuk membahagikan data kepada beberapa halaman, dan menggunakan halaman sebagai unit asas interaksi antara cakera dan memori Saiz halaman dalam InnoDB secara amnya 16

1. Gulung semula dan pasang semula mysql Untuk mengelakkan masalah mengimport data ini dari tempat lain, mula-mula buat sandaran fail pangkalan data perpustakaan semasa (/var/lib/mysql/location). Seterusnya, saya menyahpasang pakej Perconaserver5.7, memasang semula pakej 5.1.71 lama yang asal, memulakan perkhidmatan mysql, dan ia mendorong Unknown/unsupportedtabletype:innodb dan tidak boleh bermula seperti biasa. 11050912:04:27InnoDB:Initializingbufferpool,saiz=384.0M11050912:04:27InnoDB:Lengkap

1. Tahap pengasingan transaksi Mysql Empat tahap pengasingan ini, apabila terdapat konflik serentak transaksi, beberapa masalah bacaan kotor, bacaan tidak boleh berulang dan bacaan hantu mungkin berlaku, dan innoDB menyelesaikannya dalam mod tahap pengasingan berulang Masalah dengan bacaan hantu, 2. Apakah bacaan hantu bermaksud bahawa dalam transaksi yang sama, hasil yang diperoleh apabila menanya julat yang sama dua kali sebelum dan selepas adalah tidak konsisten seperti yang ditunjukkan dalam rajah, kami melaksanakan pertanyaan julat Pada masa ini, hanya terdapat satu data yang memenuhi syarat Dalam transaksi kedua, ia memasukkan baris data dan menyerahkannya Apabila pertanyaan transaksi pertama, hasil yang diperoleh adalah lebih daripada hasil pertanyaan pertama. Data, ambil perhatian bahawa pertanyaan pertama dan kedua bagi transaksi pertama adalah sama

Perbandingan pemilihan enjin storan MySQL: Penilaian indeks prestasi InnoDB, MyISAM dan Memori Pengenalan: Dalam pangkalan data MySQL, pilihan enjin storan memainkan peranan penting dalam prestasi sistem dan integriti data. MySQL menyediakan pelbagai enjin storan, enjin yang paling biasa digunakan termasuk InnoDB, MyISAM dan Memory. Artikel ini akan menilai penunjuk prestasi ketiga-tiga enjin storan ini dan membandingkannya melalui contoh kod. 1. Enjin InnoDB InnoDB adalah Saya

Keupayaan carian teks penuh InnoDB sangat kuat, yang dapat meningkatkan kecekapan pertanyaan pangkalan data dan keupayaan untuk memproses sejumlah besar data teks. 1) InnoDB melaksanakan carian teks penuh melalui pengindeksan terbalik, menyokong pertanyaan carian asas dan maju. 2) Gunakan perlawanan dan terhadap kata kunci untuk mencari, menyokong mod boolean dan carian frasa. 3) Kaedah pengoptimuman termasuk menggunakan teknologi segmentasi perkataan, membina semula indeks dan menyesuaikan saiz cache untuk meningkatkan prestasi dan ketepatan.

MySQL ialah sistem pengurusan pangkalan data yang digunakan secara meluas, dan enjin storan yang berbeza mempunyai kesan yang berbeza terhadap prestasi pangkalan data. MyISAM dan InnoDB ialah dua enjin storan yang paling biasa digunakan dalam MySQL Ia mempunyai ciri yang berbeza dan penggunaan yang tidak betul boleh menjejaskan prestasi pangkalan data. Artikel ini akan memperkenalkan cara menggunakan kedua-dua enjin storan ini untuk mengoptimumkan prestasi MySQL. 1. Enjin storan MyISAM MyISAM ialah enjin storan yang paling biasa digunakan untuk MySQL Kelebihannya ialah kelajuan yang pantas dan ruang storan yang kecil. MyISA
