Spec-Zone .ru
спецификации, руководства, описания, API
|
These performance tips supplement the general guidelines for fast inserts in Section
8.2.2.1, "Speed of INSERT
Statements".
To improve performance when multiple clients insert a lot of rows, use the INSERT DELAYED
statement. See Section
13.2.5.2, "INSERT DELAYED
Syntax". This technique works for MyISAM
and some other storage engines, but not InnoDB
.
As of MySQL 5.6.6, INSERT
DELAYED
is deprecated, and will be removed in a future release. Use INSERT
(without DELAYED
) instead.
For a MyISAM
table, you can use concurrent inserts to
add rows at the same time that SELECT
statements are running, if there are no deleted rows in middle of the data file. See Section
8.10.3, "Concurrent Inserts".
With some extra work, it is possible to make LOAD DATA INFILE
run even faster for a MyISAM
table when the table has many indexes. Use the following procedure:
Execute a FLUSH
TABLES
statement or a mysqladmin flush-tables command.
Use myisamchk --keys-used=0 -rq /path/to/db/tbl_name
to remove all use of indexes for the table.
Insert data into the table with LOAD DATA INFILE
. This does not update any indexes and
therefore is very fast.
If you intend only to read from the table in the future, use myisampack to compress it. See Section 14.3.3.3, "Compressed Table Characteristics".
Re-create the indexes with myisamchk -rq /path/to/db/tbl_name
. This
creates the index tree in memory before writing it to disk, which is much faster that
updating the index during LOAD
DATA INFILE
because it avoids lots of disk seeks. The resulting index tree is
also perfectly balanced.
Execute a FLUSH
TABLES
statement or a mysqladmin flush-tables command.
LOAD DATA INFILE
performs the preceding optimization automatically if
the MyISAM
table into which you insert data is empty. The main
difference between automatic optimization and using the procedure explicitly is that you can let myisamchk
allocate much more temporary memory for the index creation than you might want the server to
allocate for index re-creation when it executes the LOAD DATA INFILE
statement.
You can also disable or enable the nonunique indexes for a MyISAM
table
by using the following statements rather than myisamchk. If you use these statements, you can
skip the FLUSH TABLE
operations:
ALTER TABLEtbl_name
DISABLE KEYS;ALTER TABLEtbl_name
ENABLE KEYS;
To speed up INSERT
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 all INSERT
statements have completed. Normally, there would be as many index buffer flushes as there are INSERT
statements. Explicit locking statements are not needed if
you can insert all rows with a single INSERT
.
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
,
and DELETE
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 a LOCK
TABLES
followed by an UNLOCK 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 than LOAD DATA INFILE
, even when using the strategies just outlined.
To increase performance for MyISAM
tables, for both LOAD DATA INFILE
and INSERT
, enlarge the key cache by increasing the key_buffer_size
system variable. See Section
8.11.2, "Tuning Server Parameters".