Search code examples
mysqlsqllinuxwikipediadatabase-performance

MYSQL Huge SQL Files Insertion | MyISAM speed suddenly slow down for Insertions (strange issue)


I'm facing very strange problem, I've asked the question here about speed up the insertion in MYSql, especially about the insertion of Huge SQL files multiple GB in size. They suggested me to use MyISAM engine. I did the following:

  • ALTER TABLE revision ENGINE=MyISAM;
  • Use ALTER TABLE .. DISABLE KEYS .
  • (MyISAM only) Set bulk_insert_buffer_size to 500M.
  • (MyISAM only) Set unique_checks = 0 . not checked.
  • SET autocommit=0; ... SQL import statements ... COMMIT;
  • SET foreign_key_checks=0;

It Speed up the process to 5 minutes that previously took 2 hours and I'm impressed. But now when i tried the same thing with other tables then there is no speed up and it takes several hours again:(...

When initially i got success than my CPU usage is around 90% and insertion took only 5 minute, but now following the same procedure my CPU usage is around 5% at max. It shows something wrong..

I've also verified that My table engine is MyISAM by following:

SHOW TABLE STATUS WHERE Name = 'xxx';

Note : I'm using Wikipedia database schema.I got success on Categorylinks table from Wikipedia data set. I've no sucess (Very slow insertion speed) at revision, page and text table.

Please help me on this strange issue.


Solution

  • I've not found the ideal reason, behind the problem. But when i drill down i found that it low perofrmance ususally with tables which have enrich in relation. Although i've disable the keys.. But i still beileve that following settings are best for huge file insertions as the following setting give best performance on majority tables:

     - ALTER TABLE revision ENGINE=MyISAM;
     - Use ALTER TABLE .. DISABLE KEYS .
     - (MyISAM only) Set bulk_insert_buffer_size to 500M.
     - (MyISAM only) Set unique_checks = 0 . not checked. 
     - SET autocommit=0; ... SQL import
     - statements ... COMMIT;
     - SET foreign_key_checks=0;
    

    Other tweaks regarding the perofmance tunings are following: Please see the complete my.cnf file..

    #
    # The MySQL database server configuration file.
    #
    # You can copy this to one of:
    # - "/etc/mysql/my.cnf" to set global options,
    # - "~/.my.cnf" to set user-specific options.
    # 
    # One can use all long options that the program supports.
    # Run program with --help to get a list of available options and with
    # --print-defaults to see which it would actually understand and use.
    #
    # For explanations see
    # http://dev.mysql.com/doc/mysql/en/server-system-variables.html
    
    # This will be passed to all mysql clients
    # It has been reported that passwords should be enclosed with ticks/quotes
    # escpecially if they contain "#" chars...
    # Remember to edit /etc/mysql/debian.cnf when changing the socket location.
    [client]
    port        = 3306
    socket      = /var/run/mysqld/mysqld.sock
    
    # Here is entries for some specific programs
    # The following values assume you have at least 32M ram
    
    # This was formally known as [safe_mysqld]. Both versions are currently parsed.
    [mysqld_safe]
    socket      = /var/run/mysqld/mysqld.sock
    nice        = 0
    
    [mysqld]
    #
    # * Basic Settings
    #
    user        = mysql
    pid-file    = /var/run/mysqld/mysqld.pid
    socket      = /var/run/mysqld/mysqld.sock
    port        = 3306
    basedir     = /usr
    datadir     = /var/lib/mysql
    tmpdir      = /tmp
    bulk_insert_buffer_size = 1G
    lc-messages-dir = /usr/share/mysql
    skip-grant-tables
    skip-networking
    skip-external-locking
    init_connect='SET autocommit=0'
    innodb_buffer_pool_size = 1G
    innodb_flush_log_at_trx_commit = 0
    max_allowed_packet = 500M
    table_open_cache = 512
    max_connections=100
    
    query_cache_size=32M
    
    table_cache=512
    
    tmp_table_size=64M
    
    thread_cache_size=8
    
    myisam_max_sort_file_size=100G
    
    myisam_sort_buffer_size=256M
    
    key_buffer_size=512M
    #
    # Instead of skip-networking the default is now to listen only on
    # localhost which is more compatible and is not less secure.
    bind-address        = 127.0.0.1
    #
    # * Fine Tuning
    #
    key_buffer      = 16M
    max_allowed_packet  = 16M
    thread_stack        = 192K
    thread_cache_size       = 8
    # This replaces the startup script and checks MyISAM tables if needed
    # the first time they are touched
    myisam-recover         = BACKUP
    #max_connections        = 100
    #table_cache            = 64
    #thread_concurrency     = 10
    #
    # * Query Cache Configuration
    #
    query_cache_limit   = 1M
    query_cache_size        = 16M
    #
    # * Logging and Replication
    #
    # Both location gets rotated by the cronjob.
    # Be aware that this log type is a performance killer.
    # As of 5.1 you can enable the log at runtime!
    #general_log_file        = /var/log/mysql/mysql.log
    general_log=0
    #
    # Error log - should be very few entries.
    #
    log_error = /var/log/mysql/error.log
    #
    # Here you can see queries with especially long duration
    #log_slow_queries   = /var/log/mysql/mysql-slow.log
    #long_query_time = 2
    #log-queries-not-using-indexes
    #
    # The following can be used as easy to replay backup logs or for replication.
    # note: if you are setting up a replication slave, see README.Debian about
    #       other settings you may need to change.
    #server-id      = 1
    #log_bin            = /var/log/mysql/mysql-bin.log
    expire_logs_days    = 10
    max_binlog_size         = 1G
    #binlog_do_db       = include_database_name
    #binlog_ignore_db   = include_database_name
    #
    # * InnoDB
    #
    # InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
    # Read the manual for more InnoDB related options. There are many!
    #
    # * Security Features
    #
    # Read the manual, too, if you want chroot!
    # chroot = /var/lib/mysql/
    #
    # For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
    #
    # ssl-ca=/etc/mysql/cacert.pem
    # ssl-cert=/etc/mysql/server-cert.pem
    # ssl-key=/etc/mysql/server-key.pem
    
    
    
    [mysqldump]
    quick
    quote-names
    max_allowed_packet  = 16M
    
    [mysql]
    #no-auto-rehash # faster start of mysql but no tab completition
    
    [isamchk]
    key_buffer      = 16M
    
    #
    # * IMPORTANT: Additional settings that can override those from this file!
    #   The files must end with '.cnf', otherwise they'll be ignored.
    #
    !includedir /etc/mysql/conf.d/
    

    So Overall these settings are recommended and you will get considerable performance edge.