innodbÖÐÎIJο¼Ö®ÐÔÄÜÓÅ»¯
ÖÐÎIJο¼µØÖ·£º [url]http://man.lupaworld.com/content/database/mysql/inonodb_zh/[/url]£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½
9 ÐÔÄܵ÷Õû¼¼ÇÉ(Performance tuning tips)
1. Èç¹û Unix top »ò Windows ÈÎÎñ¹ÜÀíÆ÷(Task Manager) ÏÔʾ·þÎñµÄ CPU Õ¼ÓÃÂÊСÓÚ 70%£¬(shows that the CPU usage percentage with your workload is less than 70 %,£©ÄãµÄϵͳƿ¾±¿ÉÄÜÔÚ´ÅÅ̶ÁдÉÏ¡£»òÐíÄãÌá½»ÁË´óÁ¿µÄÊÂÎñ£¬»òÕßÊÇ»º³å³Ø(buffer pool)̫СÁË¡£½«»º³å³ØÉè´óµã»áÓÐËù°ïÖú£¬µ«Ò»¶¨Òª×¢Òâ²»ÄÜ´óÓÚÎïÀíÄÚ´æµÄ 80%¡£
2. ÔÚÒ»¸öÊÂÎñÖаüº¬¼¸¸öÐ޸ġ£Èç¹ûÊÂÎñ¶ÔÊý¾Ý¿â½øÐÐÁËÐ޸ģ¬ÄÇôÔÚÕâ¸öÊÂÎñÌύʱ InnoDB ±ØÐëË¢ÐÂÈÕÖ¾µ½´ÅÅÌÉÏ¡£ÒòΪӲÅ̵ÄÐýתËÙ¶Èͨ³£ÖÁ¶àΪ 167 ת/Ã룬ÄÇôֻҪ´ÅÅ̲»ÆÛƲÙ×÷ϵͳ£¬Ìá½»µÄÊÂÎñÊýÄ¿ÏÞֹҲͬÑùΪ 167 ´Î/Ãë?Óû§¡£
3. Èç¹ûµôʧ×î½üµÄ¼¸¸öÊÂÎñÎÞËùνµÄ»°£¬¿ÉÒÔÔÚ my.cnf ÎļþÖн«²ÎÊý innodb_flush_log_at_trx_commit ÉèÖÃΪ 0¡£InnoDB ÎÞÂÛÈçºÎ×ÜÊdz¢ÊÔÒ»ÃëË¢ÐÂ(flush)Ò»´ÎÈÕÖ¾£¬¾¡¹Üˢв¢²»Äܵõ½±£Ö¤¡£
4. ½«ÈÕÖ¾Îļþ(log files)Éè´óÒ»µã£¬Ê¹ÈÕÖ¾ÎļþµÄ×ܺÍÕýºÃÓ뻺³å³Ø(buffer pool)Ò»Ñù´ó¡£µ± InnoDB ÓùâÈÕÖ¾ÎļþµÄ¿Õ¼äʱ£¬Ëü²»µÃ²»ÔÚÒ»¸öʱ¼äµãÉϽ«»º³å³ØÄÚÐ޸ĹýµÄÄÚÈÝдµ½´ÅÅÌÉÏ¡£ СµÄÈÕÖ¾Îļþ¿ÉÄÜÒýÆð²»±ØÒªµÄ´ÅÅÌд²Ù×÷¡£µ«ÊÇ´óµÄÈÕÖ¾ÎļþµÄȱµã¾ÍÊÇÔÚÊý¾Ý»Ö¸´Ê±½«Õ¼Óýϳ¤µÄʱ¼ä¡£
5. ͬÑù log buffer ¾¡Á¿Éè´óµã£¬±ÈÈç˵ 8 MB¡£
6. Èç¹ûÒª´æ´¢±ä³¤µÄ×Ö·û´®»ò×ֶοÉÄÜ»á°üº¬´óÁ¿µÄ NULLs£¬ÇëʹÓà VARCHAR ÐÍ×ֶδúÌæ CHAR ¡£Ò»¸ö CHAR(n) ×Ö¶Î×ÜÊÇʹÓà n bytes À´´æ´¢Êý¾Ý£¬¼´Ê¹Õâ¸ö×Ö·û´®ºÜ¶Ì»òÊÇÒ»¸ö NULL Öµ¡£½ÏСµÄ±í¸ü¼ÓÊʺϻº³å³ØÍ¬Ê±Äܹ»¼õÉÙ´ÅÅÌ I/O ¡£
7. (ÊÊºÏ´Ó 3.23.41 ÒÔÉϰ汾) ÔÚijЩ°æ±¾µÄ Linux ºÍ Unixes ÖУ¬Ê¹Óà Unix fsync »òÆäËüÀàËÆµÄ·½·¨½«Îļþˢе½´ÅÅÌÊÇÒì³£µØÂýµÄ¡£InnoDB ĬÈϵķ½·¨¾ÍÊÇ fsync ¡£Èç¹ûÄã¶ÔÊý¾Ý¿âϵͳµÄ´ÅÅÌдÐÔÄܲ»Äܸе½ÂúÒ⣬Äã¿ÉÒÔ³¢ÊÔÔÚ my.cnf Öн« innodb_flush_method ÉèÖÃΪ O_DSYNC£¬¾¡¹Ü O_DSYNC Ñ¡ÏîÔÚ¶àÊýµÄϵͳÉÏ¿´ÆðÀ´±È½ÏÂý¡£
8. ÔÚÏò InnoDB µ¼ÈëÊý¾Ýʱ£¬ÇëÈ·ÈÏ MySQL ûÓдò¿ª autocommit=1 ¡£·ñÔòÿ¸ö²åÈëÓï¾ä¶¼Òª½« log ˢе½´ÅÅÌ¡£ÔÚÄãµÄ SQL µ¼ÈëÎļþµÄµÚÒ»ÐмÓÈë
set autocommit=0;
²¢ÔÚ×îºóÒ»ÐмÓÈë
commit;
¡¡
Èç¹ûʹÓà mysqldump Ñ¡Ïî --opt£¬Ä㽫»áµÃµ½Ò»¸ö¿ìËÙµ¼Èë InnoDB ±íµÄת´¢(dump)Îļþ£¬ÉõÖÁ¿ÉÒÔ²»ÔÙʹÓÃÉÏÃæËùÌáµÄ set autocommit=0; ... commit; ¡£
9. СÐÄ insert ¼¯È«µÄ´ó»Ø¹ö(roolback)£ºÔÚ²åÈëʱ InnoDB ʹÓòåÈ뻺³åÀ´¼õÉÙ´ÅÅÌ I/O£¬µ«ÔÚÏàÓ¦µÄ»Ø¹öÖÐȴûÓÐʹÓÃÕâÑùµÄ»úÖÆ¡£Ò»¸ö disk-bound rollback ¿ÉÄܻỨ·ÑÏàÓ¦²åÈëʱ¼äµÄ 30 ±¶¡£Èç¹û·¢ÉúÒ»¸öʧ¿ØµÄ»Ø¹ö£¬Äã¿ÉÒԲ鿴µÚ 6.1 Õ½ڵļ¼ÇÉÀ´Í£Ö¹Ëü¡£
10. ͬÑùҲҪСÐÄÒ»¸ö´óµÄ disk-bound µÄ²Ù×÷¡£Ê¹Óà DROP TABLE »ò TRUNCATE (´Ó MySQL-4.0 ÒÔÉÏ) À´Çå¿ÕÒ»¸ö±í£¬¶ø²»ÒªÊ¹Óà DELETE FROM yourtable¡£
11. Èç¹ûÐèÒª²åÈë´óÁ¿¼Ç¼ÐпÉÒÔʹÓöàÐÐ(multi-line)µÄ INSERT À´¼õÉÙ¿Í»§¶ËÓë·þÎñÆ÷¶ËµÄͨÐÅ¿ªÏú£º
INSERT INTO yourtable VALUES (1, 2), (5, 5);
Õâ¸ö¼¼ÇɶԲåÈëÈκαí¾ùÓÐЧ£¬¶ø²»½ö½öÊÇ InnoDB¡£
12. Èç¹ûÔÚ¸¨¼üÉÏÓÐ UNIQUE Ô¼Êø£¬´Ó 3.23.52 ºÍ 4.0.3 ¿ªÊ¼£¬¿ÉÒÔͨ¹ýÔÚÒ»¸öµ¼Èë»á»°Öн«Î¨Ò»¼ü¼ì²é(uniqueness check)¹Ø±ÕÀ´Ìá¸ßÊý¾Ýµ¼ÈëËÙ¶È£º
SET UNIQUE_CHECKS=0;
Ò»¸ö´óµÄ±íµ¼ÈëÕ⽫¼õÉÙ´óÁ¿µÄ´ÅÅÌ I/O£¬ÒòΪÕâʱ InnoDB ¿ÉÄÜʹÓÃ×ÔÉíµÄ²åÈ뻺³åÀ´·ÖÅúµØ¼Ç¼¸¨ÖúË÷Òý¡£
¡¡
13. Èç¹ûÔÚ±íÖÐÓÐÒ»¸ö×Ó FOREIGN KEY Ô¼Êø£¬´Ó 3.23.52 ºÍ 4.0.3 ¿ªÊ¼£¬¿ÉÒÔͨ¹ýÔÚÒ»¸öµ¼Èë»á»°Öн«Íâ¼ü¼ì²é(foreign key check)¹Ø±ÕÀ´Ìá¸ßÊý¾Ýµ¼ÈëËÙ¶È£º
SET FOREIGN_KEY_CHECKS=0;
¶ÔÒ»¸ö´óµÄ±íµ¼ÈëÕ⽫¼õÉÙ´óÁ¿µÄ´ÅÅÌ I/O¡£
9.1 InnoDB ¼àÊÓÆ÷(Monitors)
´Ó°æ±¾ 3.23.42 ¿ªÊ¼£¬InnoDB ÖоͰüº¬ÁË InnoDB Monitors£¬Ëü¿ÉÒÔÏÔʾ³ö InnoDB µÄÄÚ²¿×´Ì¬¡£´Ó°æ±¾ 3.23.52 ºÍ 4.0.3 ¿ªÊ¼£¬Äã¿ÉÒÔʹÓÃÒ»¸öÐ嵀 SQL ÃüÁî
SHOW INNODB STATUS
À´¶ÁÈ¡±ê×¼ InnoDB Monitor ¸ø SQL client µÄÊä³öÐÅÏ¢¡£ÕâЩÐÅÏ¢¶ÔÐÔÄܵ÷ÕûÓÐÒæ¡£
¡¡
ÁíÍâÒ»¸öʹÓà InnoDB Monitors ·½·¨¾ÍÊÇÈÃËüÔÚ·þÎñ³ÌÐò mysqld µÄ±ê×¼Êä³öÉϳÖÐøµØÐ´³öÐÅÏ¢¡£µ±¿ª¹Ø´ò¿ªÊ±£¬InnoDB Monitors ´óԼÿ 15 ÃëÏÔʾһ´ÎÊý¾Ý(×¢Ò⣺MySQL µÄ¿Í»§¶Ë²¢²»»áÏÔʾÈκζ«Î÷)¡£Ò»¸ö¼òµ¥µØÊ¹ÓÃËüµÄ·½·¨¾ÍÊÇÒÔÒ»¸öÃüÁîÐз½Ê½Ö´ÐÐ mysqld ¡£·ñÔòÊä³ö½«»á¶¨Ïòµ½ MySQL ·þÎñ´íÎóÈÕÖ¾(error log file)ÖÐ 'yourhostname'.err (ÔÚ Windows ÏÂΪ mysql.err)£¬ÔÚ Windows ϵͳÖбØÐëÔÚ MS-DOS ʹÓÃÌáʾ·ûÏÂÒÔ --console Ñ¡ÏîÔËÐÐ mysqld-max À´Ö¸ÁîÐÅÏ¢Êä³öÔÚÃüÁîÌáʾ·û´°¿ÚÉÏ¡£
ÏÔʾµÄÐÅÏ¢°üº¬ÏÂÁÐÐÅÏ¢£º
* ÿһ¸ö»î¶¯µÄÊÂÎñ(active transaction)±£³ÖµÄ±íºÍ¼ÇÂ¼Ëø¶¨
* ÊÂÎñµÄËøµÈ´ý (lock waits of a transactions)
* Ï̵߳ÄÐźÅÁ¿µÈ´ý (semaphore waits of threads)
* Îļþ I/O µÄµÈ´ýÇëÇó (pending file i/o requests)
* »º³å³Ø(buffer pool)µÄͳ¼ÆÐÅÏ¢
* InnoDB Ö÷Ïß³ÌµÄ purge buffer ºÍ insert buffer ¹é²¢»î¶¯(merge activity)
¡¡
ͨ¹ýÏÂÁÐµÄ SQL ÃüÁ¿ÉÒÔʹ±ê×¼µÄ InnoDB Monitor ¼Ç¼µ½±ê×¼µÄ mysqld µÄÊä³öÉÏ£º
CREATE TABLE innodb_monitor(a int) type = innodb;
ͨ¹ýËüÀ´Í£Ö¹£º
DROP TABLE innodb_monitor;
CREATE TABLE ¾ä·¨Ö»²»¹ýÊÇΪÁËͨ¹ý MySQL SQL Óï·¨·ÖÎö¶øÌṩ¸ø InnoDB ÒýÇæÃüÁîµÄÒ»ÖÖ·½Ê½£ºÄǸö±»´´½¨µÄ±í¸ù±¾Óë InnoDB Monitor ÎÞÈκιØÏµ¡£Èç¹ûÄãÔÚ¼àÊÓÆ÷ÔËÐÐ×ŵÄ״̬ϹرÕÊý¾Ý¿â£¬²¢ÇÒÄãÐèÒªÔÙ´ÎÆô¶¯¼àÊÓÆ÷£¬ ÄÇôÄã²»µÃ²»ÔÚ·¢³öÒ»¸öÐ嵀 CREATE TABLE À´Æô¶¯¼àÊÓÆ÷֮ǰÏÈÒÆ³ý(drop)Õâ¸ö±í¡£
¡¡
ÓëÖ®ÏàÀàËÆµÄ£¬Äã¿ÉÒÔÆô¶¯ innodb_lock_monitor £¬ËüÔÚijЩ·½ÃæÓë innodb_monitor Ò»Ö£¬µ«ÊÇËü»áÏÔʾ¸ü¶àµÄËø¶¨ÐÅÏ¢¡£Ò»¸öµ¥¶ÀµÄ innodb_tablespace_monitor ½«ÏÔʾÔÚÏÖÓбí¿Õ¼äÄÚËù½¨Á¢µÄÎļþ¶ÎÁбíÒÔ¼°¿ÉÒÔ·ÖÅäÊý¾Ý½á¹¹µÄÓÐЧ±í¿Õ¼ä¡£´Ó 3.23.44 ¿ªÊ¼£¬ÌṩÁË innodb_table_monitor £¬Í¨¹ýËü¿ÉÒÔ»ñµÃ InnoDB ÄÚ²¿Êý¾Ý×ÖµäµÄÐÅÏ¢¡£
3.23.52 ÖÐ InnoDB Êä³öµÄʾÀý£º
=====================================
020805 22:07:41 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 3 seconds
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 194, signal count 193
--Thread 7176 has waited at ../include/btr0btr.ic line 28 for 0.00 seconds the s
emaphore:
X-lock on RW-latch at 44d980bc created in file buf0buf.c line 354
a writer (thread id 7176) has reserved it in mode wait exclusive
number of readers 1, waiters flag 1
Last time read locked in file ../include/btr0btr.ic line 28
Last time write locked in file ../include/btr0btr.ic line 28
Mutex spin waits 0, rounds 0, OS waits 0
RW-shared spins 77, OS waits 33; RW-excl spins 188, OS waits 161
------------
TRANSACTIONS
------------
Trx id counter 0 657853517
Purge done for trx's n:o < 0 657853429 undo n:o < 0 80
Total number of lock structs in row lock hash table 22
020805 22:07:36 LATEST DETECTED DEADLOCK:
*** (1) TRANSACTION:
TRANSACTION 0 657853503, ACTIVE 0 sec, OS thread id 15373 inserting
LOCK WAIT 3 lock struct(s), heap size 336
MySQL thread id 6, query id 3741 localhost heikki update
insert into ibtest11b (D, B, C) values (5, 'khdkkkk' ,'khdkkkk')
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 104865 n bits 208 table test/ibtest11b index PRI
MARY trx id 0 657853503 lock_mode X waiting
Record lock, heap no 1 RECORD: info bits 0 0: len 9; hex 73757072656d756d00; asc
supremum.;;
*** (2) TRANSACTION:
TRANSACTION 0 657853500, ACTIVE 0 sec, OS thread id 11275 setting auto-inc lock
19 lock struct(s), heap size 2672, undo log entries 5
MySQL thread id 2, query id 3750 localhost heikki update
insert into ibtest11b (D, B, C) values (5, 'khD' ,'khD')
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 104865 n bits 200 table test/ibtest11b index PRI
MARY trx id 0 657853500 lock_mode X
Record lock, heap no 1 RECORD: info bits 0 0: len 9; hex 73757072656d756d00; asc
supremum.;;
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
TABLE LOCK table test/ibtest11b trx id 0 657853500 lock_mode AUTO-INC waiting
*** WE ROLL BACK TRANSACTION (2)
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 657853516, ACTIVE 5 sec, OS thread id 15373 setting auto-inc lo
ck
LOCK WAIT 1 lock struct(s), heap size 336
MySQL thread id 6, query id 3895 localhost heikki update
insert into ibtest11b (D, B, C) values (5, 'khdkkkk' ,'khdkkkk')
------- TRX HAS BEEN WAITING 5 SEC FOR THIS LOCK TO BE GRANTED:
TABLE LOCK table test/ibtest11b trx id 0 657853516 lock_mode AUTO-INC waiting
------------------
---TRANSACTION 0 657853514, ACTIVE 5 sec, OS thread id 11275 inserting
LOCK WAIT 13 lock struct(s), heap size 2672, undo log entries 2
MySQL thread id 2, query id 3898 localhost heikki update
insert into ibtest11d (D, B, C) values (5, 'khdkkkk' ,'khdkkkk')
------- TRX HAS BEEN WAITING 5 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 104879 n bits 384 table test/ibtest11d index B t
rx id 0 657853514 lock_mode X gap type lock waiting
Record lock, heap no 130 RECORD: info bits 32 0: len 9; hex 6b48646b6b6b6b6b6b;
asc kHdkkkkkk;; 1:
------------------
---TRANSACTION 0 657853512, ACTIVE 5 sec, OS thread id 14348 updating or deletin
g
20 lock struct(s), heap size 2672, undo log entries 175
MySQL thread id 5, query id 3874 localhost heikki updating
delete from ibtest11a where A = 215
--------
FILE I/O
--------
I/O thread 0 state: waiting for i/o request
I/O thread 1 state: waiting for i/o request
I/O thread 2 state: waiting for i/o request
I/O thread 3 state: waiting for i/o request
Pending normal aio reads: 0, aio writes: 0,
ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
Pending flushes (fsync) log: 0; buffer pool: 0
272 OS file reads, 56 OS file writes, 29 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf for space 0: size 1, free list len 5, seg size 7,
0 inserts, 0 merged recs, 0 merges
Hash table size 124633, used cells 1530, node heap has 4 buffer(s)
2895.70 hash searches/s, 126.62 non-hash searches/s
---
LOG
---
Log sequence number 19 3267291494
Log flushed up to 19 3267283711
Last checkpoint at 19 3266545677
0 pending log writes, 0 pending chkp writes
30 log i/o's done, 0.00 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 82593970; in additional pool allocated 1406336
Buffer pool size 1920
Free buffers 1711
Database pages 205
Modified db pages 39
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages read 178, created 27, written 50
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
Buffer pool hit rate 1000 / 1000
--------------
ROW OPERATIONS
--------------
1 queries inside InnoDB, 0 queries in queue; main thread: purging
Number of rows inserted 2008, updated 264, deleted 162, read 9
0.00 inserts/s, 0.00 updates/s, 14.66 deletes/s, 0.00 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================
Êä³öÐÅÏ¢µÄijЩעÒâµã£º
* Èç¹û TRANSACTIONS ²¿·Ö±¨¸æËø¶¨µÈ´ý(lock waits)£¬ÄÇôÄãµÄÓ¦ÓóÌÐò¿ÉÄÜÓÐËøÕùÓÃ(lock contention)¡£Êä³öÐÅÏ¢¿ÉÒÔ°ïÖú¸ú×ÙÊÂÎñËÀËøµÄÔÒò¡£
* SEMAPHORES ²¿·Ö±¨¸æÏ̵߳ȴýÐźÅÁ¿ÒÔ¼°Í³¼Æ³öÏß³ÌÐèÒªÐýת(spin)»òµÈ´ý(wait)Ò»¸ö»¥³â(mutex)»ò rw-lock ÐźÅÁ¿µÄ´ÎÊý¡£Ò»¸ö½Ï´óµÄÏ̵߳ȴýÐźÅÁ¿µÄ´ÎÊý¿ÉÄÜÊÇÓÉÓÚ´ÅÅÌ I/O ÒýÆð£¬»ò InnoDB ÄÚ²¿µÄÕùÓÃÎÊÌâ(contention problems)¡£ÕùÓÃ(Contention)¿ÉÄÜÊÇÓÉÓڱȽϷ±ÖصIJ¢·¢ÐÔ²éѯ£¬»ò²Ù×÷ϵͳµÄÏ̵߳÷¶ÈµÄÎÊÌâ¡£ ÔÚÕâÖÖÇéÐÎÏ£¬¿É½« innodb_thread_concurrency ÉèÖõØÐ¡ÓÚĬÈ쵀 8 ¡£
* FILE I/O ²¿·ÖÁгöÁËÎļþ I/O µÄµÈ´ýÇëÇó¡£¹ý´óµÄÖµ¾ÍÒâζ×Å´ÅÅÌ I/O Æ¿¾±¡£
* BUFFER POOL AND MEMORY ²¿·Ö¸ø³öÁËÒ³Ãæ¶ÁдµÄͳ¼Æ¡£Í¨¹ýÕâЩֵ¿ÉÒÔ¼ÆËã³öÄãµÄ²éѯͨ³£ËùÐèµÄÊý¾ÝÎļþ I/O Á¿¡£
mysql Lock table
ÎÒÃǵÄϵͳÊÇlinux<WBR>£«mysql+resin,ϵͳÀϳöÏÖLock wait timeoutexceeded; try restarting transaction]; nested exception is
java.sql.SQLException: Lock wait timeout exceeded; try restarting
transactionÕâÑùµÄ´íÎ󡣵ȱíËÀËø¶àÁË<WBR>£¬mysql¾Í»á×Ô¼ºÍ£ÁË¡£ÎÒÊÔןÄÁ˼¸¸ö²ÎÊý£¬µ«¶¼Ã»ÓÐʲôЧ<WBR>¹û£ºinnodb_table_locks
= 0£¬
innodb_lock_wait_timeout = 50ÔÀ´50¸Ä³É10¡£ºÃÏñ¶¼Ã»ÓÐЧ¹û¡£ÇëÎÊÊÇʲôÔÒòÄØ£¿
¼±ÅÎÄúµÄ»Ø¸´£¬Ð»Ð»£¡
Ò³:
[1]