Documentation Home
MySQL 9.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 41.2Mb
PDF (A4) - 41.3Mb
Man Pages (TGZ) - 262.8Kb
Man Pages (Zip) - 368.8Kb
Info (Gzip) - 4.1Mb
Info (Zip) - 4.1Mb


MySQL 9.4 Reference Manual  / ...  / Optimization  / Optimizing for MyISAM Tables  /  Bulk Data Loading for MyISAM Tables

10.6.2 Bulk Data Loading for MyISAM Tables

These performance tips supplement the general guidelines for fast inserts inSection 10.2.5.1, “Optimizing INSERT Statements”.

  • For aMyISAM table, you can use concurrent inserts to add rows at the same time thatSELECT statements are running, if there are no deleted rows in middle of the data file. SeeSection 10.11.3, “Concurrent Inserts”.

  • With some extra work, it is possible to makeLOAD DATA run even faster for aMyISAM table when the table has many indexes. Use the following procedure:

    1. Execute aFLUSH TABLES statement or amysqladmin flush-tables command.

    2. Usemyisamchk --keys-used=0 -rq/path/to/db/tbl_name to remove all use of indexes for the table.

    3. Insert data into the table withLOAD DATA. This does not update any indexes and therefore is very fast.

    4. If you intend only to read from the table in the future, usemyisampack to compress it. SeeSection 18.2.3.3, “Compressed Table Characteristics”.

    5. Re-create the indexes withmyisamchk -rq/path/to/db/tbl_name. This creates the index tree in memory before writing it to disk, which is much faster than updating the index duringLOAD DATA because it avoids lots of disk seeks. The resulting index tree is also perfectly balanced.

    6. Execute aFLUSH TABLES statement or amysqladmin flush-tables command.

    LOAD DATA performs the preceding optimization automatically if theMyISAM table into which you insert data is empty. The main difference between automatic optimization and using the procedure explicitly is that you can letmyisamchk allocate much more temporary memory for the index creation than you might want the server to allocate for index re-creation when it executes theLOAD DATA statement.

    You can also disable or enable the nonunique indexes for aMyISAM table by using the following statements rather thanmyisamchk. If you use these statements, you can skip theFLUSH TABLES operations:

    ALTER TABLEtbl_name DISABLE KEYS;ALTER TABLEtbl_name ENABLE KEYS;
  • To speed upINSERT operations that are performed with multiple statements for nontransactional tables, lock your tables:

    LOCK TABLES a WRITE;INSERT INTO a VALUES (1,23),(2,34),(4,33);INSERT INTO a VALUES (8,26),(6,29);...UNLOCK TABLES;

    This benefits performance because the index buffer is flushed to disk only once, after allINSERT statements have completed. Normally, there would be as many index buffer flushes as there areINSERT statements. Explicit locking statements are not needed if you can insert all rows with a singleINSERT.

    Locking also lowers the total time for multiple-connection tests, although the maximum wait time for individual connections might go up because they wait for locks. Suppose that five clients attempt to perform inserts simultaneously as follows:

    • Connection 1 does 1000 inserts

    • Connections 2, 3, and 4 do 1 insert

    • Connection 5 does 1000 inserts

    If you do not use locking, connections 2, 3, and 4 finish before 1 and 5. If you use locking, connections 2, 3, and 4 probably do not finish before 1 or 5, but the total time should be about 40% faster.

    INSERT,UPDATE, andDELETE operations are very fast in MySQL, but you can obtain better overall performance by adding locks around everything that does more than about five successive inserts or updates. If you do very many successive inserts, you could do aLOCK TABLES followed by anUNLOCK TABLES once in a while (each 1,000 rows or so) to permit other threads to access table. This would still result in a nice performance gain.

    INSERT is still much slower for loading data thanLOAD DATA, even when using the strategies just outlined.

  • To increase performance forMyISAM tables, for bothLOAD DATA andINSERT, enlarge the key cache by increasing thekey_buffer_size system variable. SeeSection 7.1.1, “Configuring the Server”.