it-swarm-eu.dev

Mysql: Vložte výkon INNODB vs. MYISAM

Vkládám se do jednoduché malé tabulky s 5 atributy a 1000 řádky.

Pozoroval jsem, když je motor INNODB, každá vložka trvá 0,03 - 0,05 sekundy. Změnil jsem motor na MYISAM, pak jsou vložky rychlejší. trvá 0,001 - 0,003.

Co je za problém. innodb_flush_log_trx_commit = 1 ve výchozím nastavení. Byl jsem toto nastavení tak, jak je. Zde jsou moje nastavení innodb.

innodb_log_buffer_size : 1MB
innodb_log_file_size   : 5MB
innodb_buffer_pool_size: 8MB
innodb_flush_log_trx_commit = 1

mysql> desc table ;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(10) | YES  |     | NULL    |       |
| count | int(10) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

Proměnné

mysql> show variables like 'innodb%' ;
+-----------------------------------------+------------------------+
| Variable_name                           | Value                  |
+-----------------------------------------+------------------------+
| innodb_adaptive_hash_index              | ON                     |
| innodb_additional_mem_pool_size         | 1048576                |
| innodb_autoextend_increment             | 8                      |
| innodb_autoinc_lock_mode                | 1                      |
| innodb_buffer_pool_size                 | 8388608                |
| innodb_checksums                        | ON                     |
| innodb_commit_concurrency               | 0                      |
| innodb_concurrency_tickets              | 500                    |
| innodb_data_file_path                   | ibdata1:10M:autoextend |
| innodb_data_home_dir                    |                        |
| innodb_doublewrite                      | ON                     |
| innodb_fast_shutdown                    | 1                      |
| innodb_file_io_threads                  | 4                      |
| innodb_file_per_table                   | OFF                    |
| innodb_flush_log_at_trx_commit          | 1                      |
| innodb_flush_method                     |                        |
| innodb_force_recovery                   | 0                      |
| innodb_lock_wait_timeout                | 50                     |
| innodb_locks_unsafe_for_binlog          | OFF                    |
| innodb_log_buffer_size                  | 2097152                |
| innodb_log_file_size                    | 5242880                |
| innodb_log_files_in_group               | 2                      |
| innodb_log_group_home_dir               | ./                     |
| innodb_max_dirty_pages_pct              | 90                     |
| innodb_max_purge_lag                    | 0                      |
| innodb_mirrored_log_groups              | 1                      |
| innodb_open_files                       | 300                    |
| innodb_rollback_on_timeout              | OFF                    |
| innodb_stats_method                     | nulls_equal            |
| innodb_stats_on_metadata                | ON                     |
| innodb_support_xa                       | ON                     |
| innodb_sync_spin_loops                  | 20                     |
| innodb_table_locks                      | ON                     |
| innodb_thread_concurrency               | 8                      |
| innodb_thread_sleep_delay               | 10000                  |
| innodb_use_legacy_cardinality_algorithm | ON                     |

+ ----------------------------------------- + ------- ----------------- + 36 řádků v sadě (0,00 s)

Nedokázal jsem přijít na to, co se s tím stalo. Díky předem. S pozdravem, UDAY

9
Uday

Důvod je velmi jednoduchý. Když do MyISAM vložíte řádek, vloží jej do paměti serveru a doufá, že jej server v budoucnu vyprázdní na disk. Hodně štěstí, pokud server havaruje.

Když do InnoDB vložíte řádek, bude transakce trvale synchronizována s diskem, což vyžaduje vyčkávání, než se disk roztočí. Udělejte matematiku ve vašem systému a uvidíte, jak dlouho to trvá.

To můžete zlepšit relaxací innodb_flush_log_at_trx_commit nebo dáváním řádků v rámci transakce namísto provádění jedné transakce na řádek.

Velmi doporučuji číst High Performance MySQL 3rd Edition (jsem autor).

21
Baron Schwartz

InnoDB bude o něco pomalejší, protože je kompatibilní s ACID, má MVCC a dělá užitečné věci, jako je kontrola cizích klíčů atd.

Jako příklad, vlastní whitepaper Oracle pro MyISAM vs InnoDB ve skutečnosti říkají

Tato měřítka byla spuštěna s uvolněnými omezeními ACID, aby poskytla srovnatelnější analýzu s MyISAM ...

Další, od Perconyho " Měli byste se přestěhovat z MyISAMu do Innodbu?" (můj tučný)

Výkon

... zatímco na straně nevýhod vidíme výrazně velkou velikost tabulky (zejména pokud je velikost dat blízko velikosti paměti), obecně pomalejší zápisy , pomalejší blob manipulace, problémy s souběžností, problémy s velmi velkým počtem tabulek, pomalé načítání dat a ALTER TABLE a další. Dalším velkým je COUNT (*), bez něhož se klauzule, která je pro ně často zátkou, pohybuje, dokud se neobjeví.

Nemůžete porovnat rychlost zápisu typu „za rád“ ...

2
gbn

Pokud používáte InnoDB, máte zámek na úrovni řádku a v MyISAMu máte zámek na úrovni tabulky. Což nedává smysl v benchmarku pouze s 1 připojením k DB. Ale pokud spustíte 100 simulativních skriptů, které chcete vložit, bude rozdíl zřejmý.

Také mějte na paměti, že InnoDB ukládá data phisically v pořadí podle primárního klíče. Pokud se nejedná o autoinkrement a vložky produkují nějaké náhodné hodnoty pro primární klíč, zasáhnete I/O limity kvůli náhodným zápisům. To je viditelné v benchmarku, když je velikost tabulky větší než fond vyrovnávacích pamětí.

1

MyISAM ve většině případů bude rychlejší než InnoDB pro běh frézovací práce. Výběr, aktualizace a vkládání jsou za běžných okolností velmi rychlé. InnoDB je přísnější v integritě dat, zatímco MyISAM je volná. MyISAM má index fulltextového vyhledávání, zatímco InnoDB nikoli.

Výhody MyISAM:

  • Jednodušší je navrhnout a vytvořit, tedy lépe pro začátečníky. Žádné obavy ohledně zahraničních vztahů mezi tabulkami.

  • Rychleji než InnoDB jako celek v důsledku jednodušší struktury, tedy mnohem nižších nákladů na prostředky serveru. Fulltextové indexování.

  • Obzvláště dobré pro tabulky náročné na čtení (výběr).

MySIAM Pomalejší než InnoDB pro tabulky, které se často vkládají nebo aktualizují, protože celá tabulka je uzamčena pro všechny vložení nebo aktualizaci.

Výhody Innodb:

  • InnoDB by se měl použít tam, kde je integrita dat prioritou, protože se o ně přirozeně stará pomocí omezení vztahů a transakcí.
  • Rychlejší v tabulkách náročných na zápis (vkládání, aktualizace), protože využívá zamykání na úrovni řádku a pouze přidržuje změny na stejném řádku, který se vkládá nebo aktualizuje.

Souhlas: Srovnání je docela jednoduché. InnoDB je vhodnější pro kritické situace, které vyžadují časté vkládání a aktualizace. Na druhé straně MyISAM funguje lépe s aplikacemi, které nejsou zcela závislé na integritě dat a většinou pouze vybírají a zobrazují data.

http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/

0
Mahesh Patil

Mezi motory jsou jemné rozdíly v INDEXingu. Dokud to nezkontrolujete, můžete mít záhadné případy, kdy je jeden motor rychlejší než druhý - v obou směrech. I po kontrole indexů se vyskytnou případy, kdy je jeden rychlejší než ostatní. To zahrnuje všechny případy, o kterých vím: http://mysql.rjweb.org/doc.php/myisam2innodb

Jak již říkali ostatní, motor nalaďte. Viz http://mysql.rjweb.org/doc.php/memory

0
Rick James