2011-07-15 2 views
1

I batch inséré à la table innoDB mysql en continu, le ratio insert par seconde est ralentie. Certains comportements sont - Si l'application d'insertion de données shutdown (java) est arrêtée, mysql effectue une opération d'E/S pendant un certain temps. - Ajouter un peu insérer puis arrêter le serveur mysql, la durée de l'opération d'arrêt est trop longue. Si démarrer et arrêter mysql sans aucune insertion, démarrer et arrêter l'opération si vite. - La vitesse d'insertion n'est pas (beaucoup) dépendante de la quantité de données sur la table. Si redémarrez le serveur mysql, l'insertion par seconde est similaire à la dernière insertion par seconde.InnoDB insérer compte ralentir

J'ai lu un commentaire sur le forum, ne pas ajouter continuellement, avoir un écart entre 2 insertions. Est-ce significatif? Pourquoi sql ralentit?

requête SHOW VARIABLES LIKE 'inno%' résultat est inférieur

innodb_adaptive_flushing = ON 
innodb_adaptive_hash_index = ON 
innodb_additional_mem_pool_size = 20971520 
innodb_autoextend_increment = 8 
innodb_autoinc_lock_mode = 1 
innodb_buffer_pool_instances = 1 
innodb_buffer_pool_size = 268435456 
innodb_change_buffering = all 
innodb_checksums = ON 
innodb_commit_concurrency = 0 
innodb_concurrency_tickets = 500 
innodb_data_file_path = ibdata1:50M:autoextend 
innodb_data_home_dir = 
innodb_doublewrite = ON 
innodb_fast_shutdown = 1 
innodb_file_format = Barracuda 
innodb_file_format_check = ON 
innodb_file_format_max = Antelope 
innodb_file_per_table = ON 
innodb_flush_log_at_trx_commit = 2 
innodb_flush_method = O_DSYNC 
innodb_force_recovery = 0 
innodb_io_capacity = 200 
innodb_lock_wait_timeout = 50 
innodb_locks_unsafe_for_binlog = OFF 
innodb_log_buffer_size = 8388608 
innodb_log_file_size = 268435456 
innodb_log_files_in_group = 2 
innodb_log_group_home_dir = ./ 
innodb_max_dirty_pages_pct = 75 
innodb_max_purge_lag = 0 
innodb_mirrored_log_groups = 1 
innodb_old_blocks_pct = 37 
innodb_old_blocks_time = 0 
innodb_open_files = 300 
innodb_purge_batch_size = 20 
innodb_purge_threads = 0 
innodb_read_ahead_threshold = 56 
innodb_read_io_threads = 4 
innodb_replication_delay = 0 
innodb_rollback_on_timeout = OFF 
innodb_spin_wait_delay = 6 
innodb_stats_on_metadata = ON 
innodb_stats_sample_pages = 8 
innodb_strict_mode = ON 
innodb_support_xa = ON 
innodb_sync_spin_loops = 30 
innodb_table_locks = ON 
innodb_thread_concurrency = 0 
innodb_thread_sleep_delay = 10000 
innodb_use_native_aio = OFF 
innodb_use_sys_malloc = ON 
innodb_version = 1.1.1 
innodb_write_io_threads = 4 

Merci

Répondre

0

Ralentissement de la raison est l'opération d'insertion stockée sur la mémoire cache (page sale) et le disque dur écrit périodiquement. Tant que la mémoire de page n'est pas saturée, les opérations d'insertion sont rapides, le cache est plein et le disque de goulot d'étranglement de la vitesse d'insertion est écrit (E/S). Vous pouvez utiliser ci-dessous sql pour montrer la taille page sale "pages modifiées db"

show engine innodb status 
0

InnoDB fonctionne par défaut en mode de validation automatique, ce qui signifie que chaque insertion nécessite l'écriture sur le disque deux fois. L'utilisation d'insertions étendues (c.-à-d. Des insertions à plusieurs rangées) et l'insertion de plusieurs insertions consécutives dans une transaction augmentent les performances.

+0

de mon code conn.setAutoCommit (false); –

+0

Mais commettez-vous après chaque commit unique, ou après un lot plus grand? – Mchl

+0

BTW: Le moyen le plus rapide pour télécharger en vrac une grande quantité de données est d'utiliser 'LOAD DATA INFILE' – Mchl