±à¼ÍƼö: |
±¾ÎÄ·ÖÎöÏÂ
InnoDBµÄÄÚ²¿ÊµÏÖ»úÖÆ£¬²¢¶ÔInnoDB ¼Ü¹¹,InnoDB ÄÚ´æÖеĽṹ´ÅÅÌÉϵĽṹ×öÁ˽éÉÜ,×îºó·ÖÎöÁËInnoDB
ºÍ ACID Ä£ÐÍ£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×Ô¼òÊ飬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
MySQL InnoDB ÒýÇæÏÖÔÚ¹ãΪʹÓã¬ËüÌṩÁËÊÂÎñ£¬ÐÐËø£¬ÈÕÖ¾µÈһϵÁÐÌØÐÔ£¬±¾ÎÄ·ÖÎöÏÂ
InnoDBµÄÄÚ²¿ÊµÏÖ»úÖÆ£¬MySQL °æ±¾Îª 5.7.24£¬²Ù×÷ϵͳΪ Debian 9¡£MySQL
InnoDB µÄʵÏַdz£¸´ÔÓ£¬±¾ÎÄÖ»ÊÇ×ܽáÁËһЩƤ룬ϣÍûÒÔºóÄܹ»Ñо¿µÄ¸ü¼ÓÉîÈëЩ¡£
1 InnoDB ¼Ü¹¹
InnoDB µÄ¼Ü¹¹·ÖΪÁ½¿é£ºÄÚ´æÖеĽṹºÍ´ÅÅÌÉϵĽṹ¡£InnoDB ʹÓÃÈÕÖ¾ÏÈÐвßÂÔ£¬½«Êý¾ÝÐÞ¸ÄÏÈÔÚÄÚ´æÖÐÍê³É£¬²¢ÇÒ½«ÊÂÎñ¼Ç¼³ÉÖØ×öÈÕÖ¾(Redo
Log)£¬×ª»»ÎªË³ÐòIO¸ßЧµÄÌá½»ÊÂÎñ¡£ÕâÀïÈÕÖ¾ÏÈÐУ¬ËµµÄÊÇÈÕÖ¾¼Ç¼µ½Êý¾Ý¿âÒԺ󣬶ÔÓ¦µÄÊÂÎñ¾Í¿ÉÒÔ·µ»Ø¸øÓû§£¬±íʾÊÂÎñÍê³É¡£µ«ÊÇʵ¼ÊÉÏ£¬Õâ¸öÊý¾Ý¿ÉÄÜ»¹Ö»ÔÚÄÚ´æÖÐÐÞ¸ÄÍ꣬²¢Ã»ÓÐË¢µ½´ÅÅÌÉÏÈ¥¡£ÄÚ´æÊÇÒ×ʧµÄ£¬Èç¹ûÔÚÊý¾ÝÂäµØÇ°£¬»úÆ÷¹ÒÁË£¬ÄÇôÕⲿ·ÖÊý¾Ý¾Í¶ªÊ§ÁË¡£
InnoDB ͨ¹ý redo ÈÕÖ¾À´±£Ö¤Êý¾ÝµÄÒ»ÖÂÐÔ¡£Èç¹û±£´æËùÓеÄÖØ×öÈÕÖ¾£¬ÏÔÈ»¿ÉÒÔÔÚϵͳ±ÀÀ£Ê±¸ù¾ÝÈÕÖ¾ÖØ½¨Êý¾Ý¡£µ±È»¼Ç¼ËùÓеÄÖØ×öÈÕÖ¾²»Ì«ÏÖʵ£¬ËùÒÔ
InnoDB ÒýÈëÁ˼ì²éµã»úÖÆ¡£¼´¶¨ÆÚ¼ì²é£¬±£Ö¤¼ì²éµã֮ǰµÄÈÕÖ¾¶¼ÒѾдµ½´ÅÅÌ£¬ÔòÏ´λָ´Ö»ÐèÒª´Ó¼ì²éµã¿ªÊ¼¡£
2 InnoDB ÄÚ´æÖеĽṹ
ÄÚ´æÖеĽṹÖ÷Òª°üÀ¨ Buffer Pool£¬Change Buffer¡¢Adaptive Hash
IndexÒÔ¼° Log Buffer ËIJ¿·Ö¡£Èç¹û´ÓÄÚ´æÉÏÀ´¿´£¬Change Buffer ºÍ Adaptive
Hash Index Õ¼ÓõÄÄÚ´æ¶¼ÊôÓÚ Buffer Pool£¬Log BufferÕ¼ÓõÄÄÚ´æÓë Buffer
Pool¶ÀÁ¢¡£
Buffer Pool
»º³å³Ø»º´æµÄÊý¾Ý°üÀ¨Page Cache¡¢Change Buffer¡¢Data Dictionary
CacheµÈ£¬Í¨³£ MySQL ·þÎñÆ÷µÄ 80% µÄÎïÀíÄÚ´æ»á·ÖÅ䏸 Buffer Pool¡£
»ùÓÚЧÂÊ¿¼ÂÇ£¬InnoDBÖÐÊý¾Ý¹ÜÀíµÄ×îСµ¥Î»ÎªÒ³£¬Ä¬ÈÏÿҳ´óСΪ16KB£¬Ã¿Ò³°üº¬Èô¸ÉÐÐÊý¾Ý¡£ÎªÁËÌá¸ß»º´æ¹ÜÀíЧÂÊ£¬InnoDBµÄ»º´æ³ØÍ¨¹ýÒ»¸öÒ³Á´±íʵÏÖ£¬ºÜÉÙ·ÃÎʵÄÒ³»áͨ¹ý»º´æ³ØµÄ
LRU Ëã·¨ÌÔ̳öÈ¥¡£InnoDB µÄ»º³å³ØÒ³Á´±í·ÖΪÁ½²¿·Ö£ºNew sublist(ĬÈÏÕ¼5/8»º´æ³Ø)
ºÍ Old sublist(ĬÈÏÕ¼3/8»º´æ³Ø£¬¿ÉÒÔͨ¹ý innodb_old_blocks_pctÐ޸ģ¬Ä¬ÈÏֵΪ
37)£¬ÆäÖÐжÁÈ¡µÄÒ³»á¼ÓÈëµ½ Old sublistµÄÍ·²¿£¬¶ø Old sublistÖеÄÒ³Èç¹û±»·ÃÎÊ£¬Ôò»áÒÆµ½
New sublistµÄÍ·²¿¡£»º³å³ØµÄʹÓÃÇé¿ö¿ÉÒÔͨ¹ý show engine innodb status
ÃüÁî²é¿´¡£ÆäÖÐһЩÖ÷ÒªÐÅÏ¢ÈçÏ£º
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137428992 # ·ÖÅ䏸InnoDB»º´æ³ØµÄÄÚ´æ(×Ö½Ú)
Dictionary memory allocated 102398 # ·ÖÅ䏸InnoDBÊý¾Ý×ÖµäµÄÄÚ´æ(×Ö½Ú)
Buffer pool size 8191 # »º´æ³ØµÄÒ³ÊýÄ¿
Free buffers 7893 # »º´æ³Ø¿ÕÏÐÁ´±íµÄÒ³ÊýÄ¿
Database pages 298 # »º´æ³ØLRUÁ´±íµÄÒ³ÊýÄ¿
Modified db pages 0 # Ð޸ĹýµÄÒ³ÊýÄ¿
...... |
Change Buffer
ͨ³£À´Ëµ£¬InnoDB¸¨ÖúË÷Òý²»Í¬ÓÚ¾Û¼¯Ë÷ÒýµÄ˳Ðò²åÈ룬Èç¹ûÿ´ÎÐ޸Ķþ¼¶Ë÷Òý¶¼Ö±½ÓдÈë´ÅÅÌ£¬Ôò»áÓдóÁ¿Æµ·±µÄËæ»úIO¡£Change
buffer µÄÖ÷ҪĿµÄÊǽ«¶Ô ·ÇΨһ ¸¨ÖúË÷ÒýÒ³µÄ²Ù×÷»º´æÏÂÀ´£¬ÒԴ˼õÉÙ¸¨ÖúË÷ÒýµÄËæ»úIO£¬²¢´ïµ½²Ù×÷ºÏ²¢µÄЧ¹û¡£Ëü»áÕ¼Óò¿·ÖBuffer
Pool µÄÄÚ´æ¿Õ¼ä¡£ÔÚ MySQL5.5 ֮ǰ Change BufferÆäʵ½Ð Insert Buffer£¬×î³õÖ»Ö§³Ö
insert ²Ù×÷µÄ»º´æ£¬Ëæ×ÅÖ§³Ö²Ù×÷ÀàÐ͵ÄÔö¼Ó£¬¸ÄÃûΪ Change Buffer¡£Èç¹û¸¨ÖúË÷ÒýÒ³ÒѾÔÚ»º³åÇøÁË£¬ÔòÖ±½ÓÐ޸ļ´¿É£»Èç¹û²»ÔÚ£¬ÔòÏȽ«Ð޸ı£´æµ½
Change Buffer¡£Change BufferµÄÊý¾ÝÔÚ¶ÔÓ¦¸¨ÖúË÷ÒýÒ³¶ÁÈ¡µ½»º³åÇøÊ±ºÏ²¢µ½ÕæÕýµÄ¸¨ÖúË÷ÒýÒ³ÖС£Change
Buffer ÄÚ²¿ÊµÏÖÒ²ÊÇʹÓÃµÄ B+ Ê÷¡£
¿ÉÒÔͨ¹ý innodb_change_buffering ÅäÖÃÊÇ·ñ»º´æ¸¨ÖúË÷ÒýÒ³µÄÐ޸ģ¬Ä¬ÈÏΪ
all£¬¼´»º´æ insert/delete-mark/purge ²Ù×÷(×¢£ºMySQL ɾ³ýÊý¾Ýͨ³£·ÖΪÁ½²½£¬µÚÒ»²½ÊÇdelete-mark£¬¼´Ö»±ê¼Ç£¬¶øpurge²ÅÊÇÕæÕýµÄɾ³ýÊý¾Ý)¡£
Change Buffer
²é¿´Change BufferÐÅÏ¢Ò²¿ÉÒÔͨ¹ý show engine
innodb status ÃüÁî¡£
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:
insert 0, delete mark 0, delete 0
discarded operations:
insert 0, delete mark 0, delete 0
Hash table size 34673, node heap has 0 buffer(s)
Hash table size 34673, node heap has 0 buffer(s)
Hash table size 34673, node heap has 0 buffer(s)
Hash table size 34673, node heap has 0 buffer(s)
Hash table size 34673, node heap has 0 buffer(s)
Hash table size 34673, node heap has 0 buffer(s)
Hash table size 34673, node heap has 0 buffer(s)
Hash table size 34673, node heap has 0 buffer(s) |
Adaptive Hash Index
×ÔÊÊÓ¦¹þÏ£Ë÷Òý(AHI)²éѯ·Ç³£¿ì£¬Ò»°ãʱ¼ä¸´ÔÓ¶ÈΪ O(1)£¬Ïà±È B+ Ê÷ͨ³£Òª²éѯ 3~4´Î£¬Ð§ÂÊ»áÓкܴóÌáÉý¡£innodb
ͨ¹ý¹Û²ìË÷ÒýÒ³ÉϵIJéѯ´ÎÊý£¬Èç¹û·¢ÏÖ½¨Á¢¹þÏ£Ë÷Òý¿ÉÒÔÌáÉý²éѯЧÂÊ£¬Ôò»á×Ô¶¯½¨Á¢¹þÏ£Ë÷Òý£¬³ÆÖ®Îª×ÔÊÊÓ¦¹þÏ£Ë÷Òý£¬²»ÐèÒªÈ˹¤¸ÉÔ¤£¬¿ÉÒÔͨ¹ý
innodb_adaptive_hash_index ¿ªÆô£¬MySQL5.7 ĬÈÏ¿ªÆô¡£
¿¼Âǵ½²»Í¬ÏµÍ³µÄ²îÒ죬ÓÐЩϵͳ¿ªÆô×ÔÊÊÓ¦¹þÏ£Ë÷Òý¿ÉÄܻᵼÖÂÐÔÄÜÌáÉý²»Ã÷ÏÔ£¬¶øÇÒΪ¼à¿ØË÷ÒýÒ³²éѯ´ÎÊýÔö¼ÓÁ˶àÓàµÄÐÔÄÜËðºÄ£¬
MySQL5.7 ¸ü¸ÄÁË AHI ʵÏÖ»úÖÆ£¬Ã¿¸ö AHI ¶¼·ÖÅäÁËרÃÅ·ÖÇø£¬Í¨¹ý innodb_adaptive_hash_index_partsÅäÖ÷ÖÇøÊýÄ¿£¬Ä¬ÈÏÊÇ8¸ö£¬Èçǰһ½ÚÃüÁîÁгöËùʾ¡£
Log Buffer
Log BufferÊÇ ÖØ×öÈÕÖ¾ÔÚÄÚ´æÖеĻº³åÇø£¬´óСÓÉ innodb_log_buffer_size
¶¨Ò壬ĬÈÏÊÇ 16M¡£Ò»¸ö´óµÄ Log Buffer¿ÉÒÔÈôóÊÂÎñÔÚÌύǰ²»±Ø½«ÈÕÖ¾ÖÐ;ˢµ½´ÅÅÌ£¬¿ÉÒÔÌá¸ßЧÂÊ¡£Èç¹ûÄãµÄϵͳÓкܶàÐ޸ĺܶàÐмǼµÄ´óÊÂÎñ£¬¿ÉÒÔÔö´ó¸ÃÖµ¡£
ÅäÖÃÏî innodb_flush_log_at_trx_commit ÓÃÓÚ¿ØÖÆ Log Buffer
ÈçºÎдÈëºÍË¢µ½´ÅÅÌ¡£×¢Ò⣬³ýÁË MySQL µÄ»º³åÇø£¬²Ù×÷ϵͳ±¾ÉíÒ²ÓÐÄں˻º³åÇø¡£
ĬÈÏΪ1£¬±íʾÿ´ÎÊÂÎñÌá½»¶¼»á½« Log Buffer дÈë²Ù×÷ϵͳ»º´æ£¬²¢µ÷ÓÃÅäÖÃµÄ "flush"
·½·¨½«Êý¾Ýдµ½´ÅÅÌ¡£ÉèÖÃΪ 1 ÒòΪƵ·±Ë¢´ÅÅÌЧÂÊ»áÆ«µÍ£¬µ«Êǰ²È«ÐԸߣ¬×î¶à¶ªÊ§ 1¸ö ÊÂÎñÊý¾Ý¡£¶øÉèÖÃΪ
0 ºÍ 2 Ôò¿ÉÄܶªÊ§ 1ÃëÒÔÉÏ µÄÊÂÎñÊý¾Ý¡£
Ϊ 0 Ôò±íʾÿÃë²Å½« Log Buffer дÈëÄں˻º³åÇø²¢µ÷Óà "flush"
·½·¨½«Êý¾Ýдµ½´ÅÅÌ¡£
Ϊ 2 ÔòÊÇÿ´ÎÊÂÎñÌá½»¶¼½« Log BufferдÈëÄں˻º³åÇø£¬µ«ÊÇÿÃë²Åµ÷Óà "flush"
½«Äں˻º³åÇøµÄÊý¾ÝË¢µ½´ÅÅÌ¡£
ÅäÖò»Í¬µÄֵЧ¹ûÈçÏÂͼËùʾ£º
innodb_flush_log_at_timeout ¿ÉÒÔÅäÖÃË¢ÐÂÈÕÖ¾»º´æµ½´ÅÅÌµÄÆµÂÊ£¬Ä¬ÈÏÊÇ1Ãë¡£×¢ÒâË¢´ÅÅÌµÄÆµÂʲ¢²»±£Ö¤¾ÍÕýºÃÊÇÕâ¸öʱ¼ä£¬¿ÉÄÜÒòΪMySQLµÄһЩ²Ù×÷µ¼ÖÂÍÆ³Ù»òÌáǰ¡£¶øÕâ¸ö
"flush" ·½·¨²¢²»ÊÇC±ê×¼¿âµÄ fflush ·½·¨(fflushÊǽ«C±ê×¼¿âµÄ»º³åдµ½Äں˻º³åÇø£¬²¢²»±£Ö¤Ë¢µ½´ÅÅÌ)£¬Ëüͨ¹ý
innodb_flush_method ÅäÖõģ¬Ä¬ÈÏÊÇ fsync£¬¼´ÈÕÖ¾ºÍÊý¾Ý¶¼Í¨¹ý fsync
ϵͳµ÷ÓÃË¢µ½´ÅÅÌ¡£
¿ÉÒÔ·¢ÏÖ£¬InnoDB »ù±¾Ã¿Ãë¶¼»á½« Log bufferÂäÅÌ¡£¶øInnoDBÖÐʹÓÃµÄ redo
log ºÍ undo log£¬ËüÃÇÊÇ·Ö¿ª´æ´¢µÄ¡£redo logÔÚÄÚ´æÖÐÓÐlog buffer£¬ÔÚ´ÅÅ̶ÔÓ¦ib_logfileÎļþ¡£¶øundo
logÊǼǼÔÚ±í¿Õ¼äibdÎļþÖеģ¬InnoDBΪundo log»áÉú³ÉundoÒ³£¬¶Ôundo log±¾ÉíµÄ²Ù×÷£¨±ÈÈçÏòundo
log²åÈëÒ»Ìõ¼Ç¼£©£¬Ò²»á¼Ç¼redo log£¬Òò´Ëundo log²¢²»ÐèÒªÂíÉÏÂäÅÌ¡£¶ø redo
logÔòͨ³£»á·ÖÅäÒ»¿éÁ¬ÐøµÄ´ÅÅ̿ռ䣬ȻºóÏÈдµ½log buffer£¬²¢Ã¿ÃëË¢Ò»´Î´ÅÅÌ¡£redo log±ØÐëÔÚÊý¾ÝÂäÅÌǰÏÈÂäÅÌ(Write
Ahead Log)£¬´Ó¶ø±£Ö¤Êý¾Ý³Ö¾ÃÐÔºÍÒ»ÖÂÐÔ¡£¶øÊý¾Ý±¾ÉíµÄÐ޸ĿÉÒÔÏÈפÁôÔÚÄڴ滺³å³ØÖУ¬ÔÙ¸ù¾ÝÌØ¶¨µÄ²ßÂÔ¶¨ÆÚË¢µ½´ÅÅÌ¡£
3 InnoDB ´ÅÅÌÉϵĽṹ
´ÅÅÌÖеĽṹ·ÖΪÁ½´óÀࣺ±í¿Õ¼äºÍÖØ×öÈÕÖ¾¡£
±í¿Õ¼ä£º·ÖΪϵͳ±í¿Õ¼ä(MySQL Ŀ¼µÄ ibdata1 Îļþ)£¬ÁÙʱ±í¿Õ¼ä£¬³£¹æ±í¿Õ¼ä£¬Undo
±í¿Õ¼äÒÔ¼° file-per-table ±í¿Õ¼ä(MySQL5.7ĬÈÏ´ò¿ªfile_per_table
ÅäÖã©¡£ÏµÍ³±í¿Õ¼äÓÖ°üÀ¨ÁËInnoDBÊý¾Ý×ֵ䣬˫д»º³åÇø(Doublewrite Buffer)£¬Ð޸Ļº´æ(Change
Buffer£©£¬UndoÈÕÖ¾µÈ¡£
RedoÈÕÖ¾£º´æ´¢µÄ¾ÍÊÇ Log Buffer Ë¢µ½´ÅÅ̵ÄÊý¾Ý¡£
ΪÁ˺óÃæ²âÊÔ·½±ã£¬ÎÒÃÇÏȽ¨Á¢Ò»¸ö²âÊÔÊý¾Ý¿â test£¬È»ºó½¨Á¢Ò»¸ö²âÊÔ±í t¡£
mysql> create
database test;
mysql> use test;
mysql> create table t (id int auto_increment
primary key, ch varchar(5000));
mysql> insert into t (ch) values('abc');
mysql> insert into t (ch) values('defgh'); |
½¨Á¢Íê³Éºó£¬¿ÉÒÔÔÚ MySQL Ŀ¼Öп´µ½ test Êý¾Ý¿âĿ¼£¬È»ºóÀïÃæÓÐ db.opt£¬ t.frm
ºÍ t.ibd 3¸öÎļþ¡£ÆäÖÐ db.opt ±£´æÁËÊý¾Ý¿âtestµÄĬÈÏ×Ö·û¼¯ utf8mb4 ºÍУÑé·½·¨
utf8mb4_general_ci£¬t.frm ÊDZíµÄÊý¾Ý×ÖµäÐÅÏ¢(InnoDBÊý¾Ý×ÖµäÐÅÏ¢Ö÷ÒªÊÇ´æ´¢ÔÚϵͳ±í¿Õ¼äibdata1ÎļþÖУ¬ÓÉÓÚÀúÊ·ÔÒò²ÅÔÚ
t.frm ¶à±£ÁôÁËÒ»·Ý)£¬t.ibdÊDZíµÄÊý¾ÝºÍË÷Òý¡£
3.1 InnoDB ±í½á¹¹
InnoDB Óë MyISAM ²»Í¬£¬ËüÔÚϵͳ±í¿Õ¼ä´æ´¢Êý¾Ý×ÖµäÐÅÏ¢£¬Òò´ËËüµÄ±í²»ÄÜÏñ MyISAM
ÄÇÑùÖ±½Ó¿½±´Êý¾Ý±íÎļþÒÆ¶¯¡£MySQL5.7 ²ÉÓõÄÎļþ¸ñʽÊÇ Barracuda£¬ËüÖ§³Ö COMPACT
ºÍ DYNAMIC ÕâÁ½ÖÖеÄÐмǼ¸ñʽ¡£´´½¨±íʱ¿ÉÒÔͨ¹ý ROW_FORMAT Ö¸¶¨ÐмǼ¸ñʽ£¬Ä¬ÈÏÊÇ
DYNAMIC¡£¿ÉÒÔͨ¹ýÃüÁî SHOW TABLE STATUS ²é¿´±íÐÅÏ¢£¬´ËÍ⣬Ҳ¿ÉʹÓà SELECT
* FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE
NAME='test/t' ²é¿´¡£
mysql> SHOW
TABLE STATUS FROM test LIKE 't' \G
*************************** 1. row ***************************
Name: t
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 2
Avg_row_length: 8192
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: 3
Create_time: 2019-01-13 02:24:52
Update_time: 2019-01-13 02:28:16
Check_time: NULL
Collation: utf8mb4_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec) |
InnoDB±íʹÓÃÉÏÓÐһЩÏÞÖÆ£¬ÈçÒ»¸ö±í×î¶àÖ»ÄÜÓÐ64¸ö¸¨ÖúË÷Òý£¬Ò»ÐдóС²»Äܳ¬¹ý65535µÈ£¬×éºÏË÷Òý²»Äܳ¬¹ý16¸ö×ֶεȣ¬Ò»°ãÓ¦¸Ã²»»áÍ»ÆÆÏÞÖÆ£¬Ïêϸ¼û
innodb-restrictions¡£
3.2 InnoDB ±í¿Õ¼ä¸ÅÊö
±í¿Õ¼ä¸ù¾ÝÀàÐÍ¿ÉÒÔ·ÖΪϵͳ±í¿Õ¼ä£¬File-Per-Table ±í¿Õ¼ä£¬³£¹æ±í¿Õ¼ä£¬Undo±í¿Õ¼ä£¬ÁÙʱ±í¿Õ¼äµÈ¡£±¾½Ú·ÖÎö
File-Per-Table ±í¿Õ¼ä¡£
ϵͳ±í¿Õ¼ä£º°üº¬ÄÚÈÝÓÐÊý¾Ý×ֵ䣬˫д»º³å£¬Ð޸Ļº³åÒÔ¼°undoÈÕÖ¾£¬ÒÔ¼°ÔÚϵͳ±í¿Õ¼ä´´½¨µÄ±íµÄÊý¾ÝºÍË÷Òý¡£
³£¹æ±í¿Õ¼ä£ºÀàËÆÏµÍ³±í¿Õ¼ä£¬Ò²ÊÇÒ»ÖÖ¹²ÏíµÄ±í¿Õ¼ä£¬¿ÉÒÔͨ¹ý CREATE TABLESPACE ´´½¨³£¹æ±í¿Õ¼ä£¬¶à¸ö±í¿É¹²ÏíÒ»¸ö³£¹æ±í¿Õ¼ä£¬Ò²¿ÉÒÔÐ޸ıíµÄ±í¿Õ¼ä¡£×¢Ò⣺±ØÐëɾ³ý³£¹æ±í¿Õ¼äÖеıíºó²ÅÄÜɾ³ý³£¹æ±í¿Õ¼ä¡£
CREATE TABLESPACE
`ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;
CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE
ts1;
CREATE TABLE t2 (c2 INT PRIMARY KEY) TABLESPACE
ts1;
ALTER TABLE t2 TABLESPACE=innodb_file_per_table;
DROP TABLE t1;
DROP TABLESPACE ts1; |
File-Per-Table±í¿Õ¼ä£ºMySQL InnoDBа汾ÌṩÁË innodb_file_per_table
Ñ¡Ïÿ¸ö±í¿ÉÒÔÓе¥¶ÀµÄ±í¿Õ¼äÊý¾ÝÎļþ(.ibd)£¬¶ø²»ÊÇÈ«²¿·Åµ½ÏµÍ³±í¿Õ¼äÊý¾ÝÎļþ ibdata1
ÖС£ÔÚ MySQL5.7 ÖиÃÑ¡ÏîĬÈÏ¿ªÆô¡£
ÆäËû±í¿Õ¼ä£ºÆäËû±í¿Õ¼äÖÐUndo±í¿Õ¼ä´æ´¢µÄÊÇUndoÈÕÖ¾¡£³ýÁË´æ´¢ÔÚϵͳ±í¿Õ¼äÍ⣬UndoÈÕÖ¾Ò²¿ÉÒÔ´æ´¢ÔÚµ¥¶ÀµÄUndo±í¿Õ¼äÖС£ÁÙʱ±í¿Õ¼äÔòÊÇ·ÇѹËõµÄÁÙʱ±íµÄ´æ´¢¿Õ¼ä£¬Ä¬ÈÏÊÇÊý¾ÝĿ¼µÄ
ibtmp1 Îļþ£¬ËùÓÐÁÙʱ±í¹²Ïí£¬Ñ¹ËõµÄÁÙʱ±íÓõÄÊÇ File-Per-Table ±í¿Õ¼ä¡£
±í¿Õ¼äÎļþ½á¹¹ÉÏ·ÖΪ¶Î¡¢Çø¡¢Ò³¡£
¶Î(Segment)·ÖΪË÷Òý¶Î£¬Êý¾Ý¶Î£¬»Ø¹ö¶ÎµÈ¡£ÆäÖÐË÷Òý¶Î¾ÍÊÇ·ÇÒ¶×Ó½áµã²¿·Ö£¬¶øÊý¾Ý¶Î¾ÍÊÇÒ¶×Ó½áµã²¿·Ö£¬»Ø¹ö¶ÎÓÃÓÚÊý¾ÝµÄ»Ø¹öºÍ¶à°æ±¾¿ØÖÆ¡£Ò»¸ö¶Î°üº¬256¸öÇø(256M´óС)¡£
ÇøÊÇÒ³µÄ¼¯ºÏ£¬Ò»¸öÇø°üº¬64¸öÁ¬ÐøµÄÒ³£¬Ä¬ÈÏ´óСΪ 1MB (64*16K)¡£
Ò³ÊÇ InnoDB ¹ÜÀíµÄ×îСµ¥Î»£¬³£¼ûµÄÓÐ FSP_HDR£¬INODE, INDEX µÈÀàÐÍ¡£ËùÓÐÒ³µÄ½á¹¹¶¼ÊÇÒ»ÑùµÄ£¬·ÖΪÎļþÍ·(ǰ38×Ö½Ú)£¬Ò³Êý¾ÝºÍÎļþβ(ºó8×Ö½Ú)¡£Ò³Êý¾Ý¸ù¾ÝÒ³µÄÀàÐͲ»Í¬¶ø²»Ò»Ñù¡£
FILE_SPACE_HEADER Ò³£ºÓÃÓÚ´æ´¢ÇøµÄÔªÐÅÏ¢¡£ibdÎļþµÄµÚÒ»Ò³ FSP_HDR ҳͨ³£¾ÍÓÃÓÚ´æ´¢ÇøµÄÔªÐÅÏ¢£¬ÀïÃæµÄ256¸ö
XDES(extent descriptors) Ïî´æ´¢ÁË256¸öÇøµÄÔªÐÅÏ¢£¬°üÀ¨ÇøµÄʹÓÃÇé¿öºÍÇøÀïÃæÒ³µÄʹÓÃÇé¿ö¡£
IBUF_BITMAP Ò³£ºÓÃÓڼǼ change bufferµÄʹÓÃÇé¿ö¡£
INODE Ò³£ºÓÃÓڼǼÎļþ¶Î(FSEG)µÄÐÅÏ¢£¬Ã¿Ò³ÓÐ85¸öINODE entry£¬Ã¿¸öINODE
entryÕ¼ÓÃ192×Ö½Ú£¬ÓÃÓÚÃèÊöÒ»¸öÎļþ¶Î¡£Ã¿¸öINODE entry°üÀ¨Îļþ¶ÎID¡¢ÊôÓڸöεÄÇøµÄÐÅÏ¢ÒÔ¼°ËéÆ¬Ò³Êý×é¡£ÇøÐÅÏ¢°üÀ¨
FREE(ÍêÈ«¿ÕÏеÄÇø), NOT_FULL(ÖÁÉÙʹÓÃÁËÒ»¸öÒ³µÄÇø), FULL(û¿ÕÏÐÒ³µÄÇø)ÈýÖÖÀàÐ͵ÄÇøµÄList
Base Node(°üº¬Á´±í³¤¶ÈºÍͷβҳºÅºÍÆ«ÒÆµÄ½á¹¹Ìå)¡£ËéÆ¬Ò³Êý×éÔòÊDz»Í¬ÓÚ·ÖÅäÕû¸öÇøµÄµ¥¶À·ÖÅäµÄ32¸öÒ³¡£
INDEX Ò³£ºË÷ÒýÒ³µÄÒ¶×Ó½áµãµÄdata¾ÍÊÇÊý¾Ý£¬Èç¾Û¼¯Ë÷Òý´æ´¢µÄÐÐÊý¾Ý£¬¸¨ÖúË÷Òý´æ´¢µÄÖ÷¼üÖµ¡£
3.3 InnoDB File-Per-Table±í¿Õ¼ä
²ÉÓà File-Per-Table µÄÓÅȱµãÈçÏ£º
Óŵ㣺¿ÉÒÔ·½±ã»ØÊÕɾ³ý±íËùÕ¼µÄ´ÅÅ̿ռ䡣Èç¹ûʹÓÃϵͳ±í¿Õ¼äµÄ»°£¬É¾³ý±íºó¿ÕÏпռäÖ»Äܱ» InnoDB
Êý¾ÝʹÓá£TRUNCATE TABLE ²Ù×÷»á¸ü¿ì¡£¿ÉÒÔµ¥¶À¿½±´±í¿Õ¼äÊý¾Ýµ½ÆäËûÊý¾Ý¿â(ʹÓà transportable
tablespace ÌØÐÔ)£¬¿ÉÒÔ¸ü·½±ãµÄ¹Û²âÿ¸ö±í¿Õ¼äÊý¾ÝµÄ´óС¡£
ȱµã£ºfsync ²Ù×÷ÐèÒª×÷ÓõĶà¸ö±í¿Õ¼äÎļþ£¬±ÈÖ»¶Ôϵͳ±í¿Õ¼äÕâÒ»¸öÎļþ½øÐÐfsync²Ù×÷»á¶àһЩ
IO ²Ù×÷¡£´ËÍ⣬mysqldÐèҪά»¤¸ü¶àµÄÎļþÃèÊö·û¡£
±í¿Õ¼äÎļþ½á¹¹
InnoDB ±í¿Õ¼äÎļþ .ibd ³õʼ´óСΪ 96K£¬¶øInnoDBĬÈÏÒ³´óСΪ 16K£¬Ò³´óСҲ¿ÉÒÔͨ¹ý
innodb_page_size ÅäÖÃΪ 4K, 8K...64K µÈ¡£ÔÚibdÎļþÖУ¬0-16KBÆ«ÒÆÁ¿¼´Îª0ºÅÊý¾ÝÒ³£¬16KB-32KBµÄΪ1ºÅÊý¾ÝÒ³£¬ÒÔ´ËÀàÍÆ¡£Ò³µÄͷβ³ýÁËһЩԪÐÅÏ¢Í⣬»¹ÓÐChecksumУÑéÖµ£¬ÕâЩУÑéÖµÔÚдÈë´ÅÅÌǰ¼ÆËãµÃµ½£¬µ±´Ó´ÅÅÌÖжÁȡʱ£¬ÖØÐ¼ÆËãУÑéÖµ²¢ÓëÊý¾ÝÒ³Öд洢µÄ¶Ô±È£¬Èç¹û·¢ÏÖ²»Í¬£¬Ôò»áµ¼ÖÂ
MySQL ±ÀÀ£¡£
ibdÎļþ´æ´¢½á¹¹ÈçÏÂËùʾ£º
ibdÎļþ´æ´¢½á¹¹
InnoDBÒ³·ÖΪINDEXÒ³¡¢UndoÒ³¡¢ÏµÍ³Ò³£¬IBUF_BITMAPÒ³, INODEÒ³µÈ¶àÖÖ¡£
µÚ0Ò³ÊÇ FSP_HDR Ò³£¬Ö÷ÒªÓÃÓÚ¸ú×Ù±í¿Õ¼ä£¬¿ÕÏÐÁ´±í¡¢ËéÆ¬Ò³ÒÔ¼°ÇøµÈÐÅÏ¢¡£
µÚ1Ò³ÊÇ IBUF_BITMAP Ò³£¬±£´æChange BufferµÄλͼ¡£
µÚ2Ò³ÊÇ INODE Ò³£¬ÓÃÓÚ´æ´¢ÇøºÍµ¥¶À·ÖÅäµÄËéÆ¬Ò³ÐÅÏ¢£¬°üÀ¨FULL¡¢FREE¡¢NOT_FULL
µÈÒ³ÁбíµÄ»ù´¡½áµãÐÅÏ¢(»ù´¡½áµãÐÅÏ¢¼Ç¼ÁËÁбíµÄÆðʼºÍ½áÊøÒ³ºÅºÍÆ«ÒÆµÈ)£¬ÕâЩ½áµãÖ¸ÏòµÄÊÇ FSP_HDR
Ò³ÖеÄÏÓÃÓڼǼҳµÄʹÓÃÇé¿ö£¬ËüÃÇÖ®¼ä¹ØÏµÈçÏÂͼËùʾ¡£
µÚ3Ò³¿ªÊ¼ÊÇË÷ÒýÒ³ INDEX(B-tree node)£¬´Ó 0xc000(ÿҳ16K) ¿ªÊ¼£¬ºóÃæ»¹ÓÐЩ·ÖÅäµÄδʹÓõÄÒ³¡£
¿ÉÒÔÔÚ innodb_sys_tables ±íÖв鵽±ítµÄ±í¿Õ¼äIDΪ28£¬È»ºó¿ÉÒÔÔÚ innodb_buffer_page²éµ½ËùÓÐÒ³ÐÅÏ¢£¬Ò»¹²4¸öÒ³¡£·Ö±ðÊÇ
FSP_HDR, IBUF_BITMAP, INODE, INDEX¡£
select * from
information_schema.innodb_sys_tables where name='test/t';
select * from information_schema.innodb_buffer_page
where SPACE=28; |
Ë÷ÒýÒ³·ÖÎö
InnoDBÒýÇæË÷ÒýÒ³µÄ½á¹¹ÈçÏÂͼ£¬¿ÉÒÔÓà hexdump²é¿´ t.ibd
Îļþ£¬È»ºó¶ÔÕÕInnoDBÒ³µÄ½á¹¹·ÖÎöϸ÷¸öÒ³µÄ×ֶΡ£
# hexdump -C
t.ibd
0000c000 95 45 82 8a 00 00 00 03 ff ff ff ff ff
ff ff ff |.E..............|
0000c010 00 00 00 00 00 28 85 7c 45 bf 00 00 00
00 00 00 |.....(.|E.......|
0000c020 00 00 00 00 00 1c 00 02 00 b0 80 04 00
00 00 00 |................|
0000c030 00 9a 00 02 00 01 00 02 00 00 00 00 00
00 00 00 |................|
0000c040 00 00 00 00 00 00 00 00 00 2f 00 00 00
1c 00 00 |........./......|
0000c050 00 02 00 f2 00 00 00 1c 00 00 00 02 00
32 01 00 |.............2..|
0000c060 02 00 1c 69 6e 66 69 6d 75 6d 00 03 00
0b 00 00 |...infimum......|
0000c070 73 75 70 72 65 6d 75 6d 03 00 00 00 10
00 1b 80 |supremum........|
0000c080 00 00 01 00 00 00 00 05 68 d1 00 00 01
54 01 10 |........h....T..|
0000c090 61 62 63 05 00 00 00 18 ff d6 80 00 00
02 00 00 |abc.............|
0000c0a0 00 00 05 69 d2 00 00 01 55 01 10 64 65
66 67 68 |...i....U..defgh|
0000c0b0 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 |................|
*
0000fff0 00 00 00 00 00 70 00 63 95 45 82 8a 00
28 85 7c |.....p.c.E...(.||
00010000 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 |................| |
FIL Header£¨38×Ö½Ú): ¼Ç¼ÎļþÍ·ÐÅÏ¢¡£Ç°4×Ö½Ú 95 45 82 8a ÊÇ checksum£¬½Ó×Å
00 00 00 03 ÊÇÒ³Æ«ÒÆÖµ 3£¬¼´ÕâÊǵÚ3Ò³¡£½Ó×Å 4 ×Ö½ÚÊÇÉÏÒ»Ò³Æ«ÒÆÖµ£¬ÒòΪֻÓÐÒ»¸öÊý¾ÝÒ³£¬ËùÒÔÕâÀïΪ
ff ff ff ff£¬½Ó×Å 4 ×Ö½ÚÊÇÏÂÒ»Ò³Æ«ÒÆÖµ ff ff ff ff¡£È»ºó 8 ×Ö½Ú 00
00 00 00 00 28 85 7c ÊÇÈÕÖ¾ÐòÁкŠLSN¡£ËæºóµÄ 2 ×Ö½Ú 45 bfÊÇÒ³ÀàÐÍ£¬´ú±íÊÇ
INDEX Ò³¡£½Ó×Å 8 ×Ö½Ú 00 00 00 00 00 00 00 00±íʾ±»¸üе½µÄLSN£¬ÔÚ
File-Per-Table ±í¿Õ¼äÖж¼ÊÇ0¡£È»ºó 4 ×Ö½Ú 00 00 00 1c ±íʾ¸ÃÊý¾ÝÒ³ÊôÓڵıítµÄ±í¿Õ¼äIDÊÇ
0x1c(28)¡£
INDEX Header£¨36×Ö½Ú): ¼Ç¼µÄÊÇ INDEX Ò³µÄ״̬ÐÅÏ¢¡£Ç°2×Ö½Ú 00 02 ±íʾҳĿ¼µÄ
slot ÊýĿΪ2£»½Ó×Å2×Ö½Ú 00 b0 ÊÇÒ³ÖеÚÒ»¸ö¼Ç¼µÄÖ¸Õë¡£80 04ÊÇÕâÒ³µÄ¸ñʽΪDYNAMICºÍ¼Ç¼Êý4(°üÀ¨2ÌõSystem
RecordsÎÒÃDzåÈëµÄ2Ìõ¼Ç¼)¡£½Ó×Å 00 00ÊÇ¿ÉÖØÓÿռäÊ×Ö¸Õ룬ÔÙºóÃæ2×Ö½Ú00 00ÊÇÒÑɾ³ý¼Ç¼Êý£»00
9aÊÇ×îºó²åÈë¼Ç¼µÄλÖÃÆ«ÒÆ£¬¼´×îºó²åÈëλÖÃÊÇ 0xc09a£¬¼´µÚ2Ìõ¼Ç¼¿ªÊ¼µØÖ·¡£00 02 ÊÇ×îºó²åÈëµÄ·½Ïò£¬2
±íʾ PAGE_DIRECTION_RIGHT£¬¼´×ÔÔö³¤·½Ê½²åÈë¡£00 01 Ö¸Ò»¸ö·½ÏòÁ¬Ðø²åÈëµÄÊýÁ¿£¬ÕâÀïΪ1¡£½Ó×ŵÄ00
02ÊÇ INDEX Ò³ÖеÄÕæÊµ¼Ç¼Êý£¬ÎÒÃÇÖ»ÓÐ2Ìõ¼Ç¼¡£È»ºó8×Ö½Ú00...00ΪÐ޸ĸÃÒ³µÄ×î´óÊÂÎñID£¬Õâ¸öÖµÖ»ÔÚ¸¨ÖúË÷ÒýÖдæÔÚ£¬ÕâÀïΪ0¡£½Ó×Å2×Ö½Ú00
00ΪҳÔÚË÷ÒýÊ÷µÄ²ã¼¶£¬0±íʾҶ×Ó½áµã¡£×îºó8¸ö×Ö½Ú 00...2fΪË÷ÒýID 47(Ë÷ÒýID¿ÉÒÔÔÚinformation_schema.INNODB_SYS_INDEXES
Öвéѯ£¬¿ÉÒÔÈ·ÈÏ 47 ÕýºÃÊDZí t µÄÖ÷Ë÷Òý)¡£
FSEG Header£ºÕâÊÇINDEXÒ³Öеĸù½áµã²ÅÓеģ¬·Ç¸ù½áµãµÄΪ0¡£Ç°10×Ö½Ú
00 00 00 1c 00 00 00 02 00 f2 ÊÇÒ¶×Ó½áµãËùÔڶεÄsegment header£¬·Ö±ð¼Ç¼ÁËÒ¶×Ó½áµãµÄ±í¿Õ¼äID
0x1c£¬INODEÒ³µÄÒ³ºÅ 2 ºÍ INODEÏîÆ«ÒÆ 0xf2¡£¶øºó10×Ö½Ú 00 00 00 1c
00 00 00 02 00 32 ÊÇ·ÇÒ¶×Ó½áµãËùÔڶεÄsegment header£¬Æ«ÒÆ·Ö±ðÊÇ0xf2
ºÍ 0x32£¬¼´INODEÒ³µÄǰ2¸öEntry£¬Îļþ¶ÎID·Ö±ðÊÇ1ºÍ2¡£FSEG HeaderÖд洢Á˸Ã
INDEX Ò³µÄINODEÏINODEÏîÀïÃæÔò¼Ç¼Á˸ÃÒ³´æ´¢ËùÔÚµÄÎļþ¶ÎÒÔ¼°Îļþ¶ÎÒ³µÄʹÓÃÇé¿ö¡£¶ÔÓÚ
File-Per-TableÇé¿öÏ£¬Ã¿¸öµ¥¶ÀµÄ±í¿Õ¼äÎļþµÄ FSP_HDR Ò³¸ºÔð¹ÜÀíҳʹÓÃÇé¿ö¡£
System Records(26×Ö½Ú): ÿ¸ö INDEX Ò³¶¼ÓÐÁ½ÌõÐéÄâ¼Ç¼ infimum ºÍ
supremum£¬ÓÃÓÚÏÞ¶¨¼Ç¼µÄ±ß½ç£¬¸÷Õ¼ 13 ¸ö×Ö½Ú¡£ÆäÖмǼͷµÄ5¸ö×Ö½Ú·Ö±ð±êʶÁËÓµÓмǼµÄÊýÄ¿ºÍÀàÐÍ(ÓµÓмǼÊýÄ¿ÊǼ´ºóÃæÒ³Ä¿Â¼²¿·ÖµÄownedÖµ£¬µ±Ç°Ò³Ä¿Â¼Ö»ÓÐÁ½¸ö²Û£¬infimumÓµÓмǼÊýÖ»ÓÐËü×Ô¼ºÎª1£¬¶øsupremumÓµÓÐÎÒÃDzåÈëµÄ2Ìõ¼Ç¼ºÍËü×Ô¼º£¬¹ÊΪ3)¡¢ÏÂÒ»Ìõ¼Ç¼µÄÆ«ÒÆ
0x1c£¬¼´Î»ÖÃÊÇ 0xc07f£¬Õâ¾ÍÊÇÎÒÃÇʵ¼Ê¼Ç¼¿ªÊ¼Î»Ö᣺óÃæ8¸ö×Ö½ÚΪ infimum + ¿ÕÖµ£¬supremumÀàËÆ£¬Ö»ÊÇËüÏÂÒ»Ìõ¼ÇÂ¼Æ«ÒÆÎª0¡£
01 00 02 00 1c
69 6e 66 69 6d 75 6d 00 # infimum
03 00 0b 00 00 73 75 70 72 65 6d 75 6d # supermum |
User Records: ½ÓÏÂÀ´ÊÇ2ÌõÎÒÃDzåÈëµÄ¼Ç¼¡£µÚ1Ìõ¼ÇÂ¼Ç°Ãæ7×Ö½ÚÊǼǼͷ(Record
Header)£¬ÆäÖÐÇ°ÃæµÄ 1×ֽڼǼµÄÊǿɱä±äÁ¿µÄ³¤¶È03£¬ÒòΪÎÒÃǼǼÖÐcµÄÖµÊÇ abc¡£È»ºó1×ֽڼǼµÄÊÇ¿ÉΪNULLµÄ±äÁ¿ÊÇ·ñÊÇNULL£¬ÕâÀﲻΪ
NULL£¬¹ÊΪ0¡£½Ó×ŵÄ5×ֽڼǼÁ˲åÈë˳Ðò2(infimum²åÈë˳Ðò¹Ì¶¨ÊÇ0£¬supremum²åÈë˳ÐòÊÇ1£¬ÆäËû¼Ç¼ÔòÊÇ´Ó2¿ªÊ¼)£¬ÏÂÒ»¸ö¼Ç¼µÄÆ«ÒÆ
0x1b(¼´ÏÂÒ»¸ö¼Ç¼¿ªÊ¼Î»ÖÃÊÇ0xc078+0x1b=0xc093)£¬É¾³ý±ê¼ÇµÈ¡£ºóÃæ¾ÍÊǼǼÄÚÈÝ¡£µÚ2Ìõ¼Ç¼ͬÀí¡£ÕâÀïµÄÊÂÎñID¿ÉÒÔͨ¹ý
select * from information_schema.innodb_trx ½øÐÐÑéÖ¤¡£
03 00 00 00
10 00 1b # ¼Ç¼ͷ
80 00 00 01 # Ö÷¼üÖµ1
00 00 00 00 05 68 # ÊÂÎñID
d1 00 00 01 54 01 10 # »Ø¹öÖ¸Õë
61 62 63 # chµÄÖµ abc
05 00 00 00 18 ff d6 # µÚ2Ìõ¼Ç¼ͷ
80 00 00 02 # Ö÷¼üÖµ2
00 00 00 00 05 69 # ÊÂÎñID
d2 00 00 01 55 01 10 # »Ø¹öÖ¸Õë
64 65 66 67 68 # chµÄÖµ defgh |
Page Directory(4×Ö½Ú)£ºÒòΪҳĿ¼µÄslotÖ»ÓÐ2¸ö£¬Ã¿¸öslotÕ¼2×Ö½Ú£¬¹ÊҳĿ¼Ϊ
00 70 00 63 Õâ4×Ö½Ú£¬´æ´¢µÄÊÇÏà¶ÔÓÚ×î³õÐеÄλÖá£ÆäÖÐ 0xc063 ÕýºÃÊÇ infimum
¼Ç¼µÄ¿ªÊ¼Î»Ö㬶ø 0xc070 ÕýºÃÊÇ supremum ¼Ç¼µÄ¿ªÊ¼Î»Öá£Ê¹ÓÃҳĿ¼½øÐжþ·Ö²éÕÒ£¬¿ÉÒÔ¼ÓËÙ²éѯ£¬Ïêϸ¼ûºóÃæ·ÖÎö¡£
FIL Tail (8×Ö½Ú): ×îºó8×Ö½ÚΪ 95 45 82 8a 00 28 85 7c£¬ÆäÖÐ
95 45 82 8a Ϊ checknum£¬¸ú FIL HeaderµÄchecksumÒ»Ñù¡£ºó4×Ö½Ú00
28 85 7c Óë FIL HeaderµÄLSNµÄºó4¸ö×Ö½ÚÒ»Ö¡£
µ±È»£¬ÎÒÃÇÒ²¿ÉÒÔͨ¹ý innodb_ruby ¹¤¾ßÀ´·ÖÎö±í¿Õ¼äÎļþ¡£
root@stretch:/home/vagrant#
innodb_space -s /var/lib/mysql/ibdata1 -T test/t
space-page-type-regions
start end count type
0 0 1 FSP_HDR
1 1 1 IBUF_BITMAP
2 2 1 INODE
3 3 1 INDEX
4 5 2 FREE (ALLOCATED)
root@stretch:/home/vagrant# innodb_space -s /var/lib/mysql/ibdata1
-T test/t -p 3 page-records
Record 127: (id=1) ¡ú (ch="abc") Record
154: (id=2) ¡ú (ch="defgh") |
InnoDBÊý¾ÝÎļþ±¾Éí¾ÍÊÇË÷ÒýÎļþ£¬ÆäË÷Òý·Ö¾Û¼¯Ë÷ÒýºÍ¸¨ÖúË÷Òý£¬¾Û¼¯Ë÷ÒýµÄÒ¶½Úµã°üº¬ÁËÍêÕûµÄÊý¾Ý¼Ç¼£¬¸¨ÖúË÷ÒýÒ¶½ÚµãÊý¾Ý²¿·ÖÊÇÖ÷¼üµÄÖµ£¬³ýÁ˿ռäË÷ÒýÍ⣬InnoDBµÄË÷ÒýʵÏÖ»ù±¾¶¼ÊÇ
B+ Ê÷£¬ÈçͼËùʾ¡£ÆäÖзÇÒ¶×Ó½áµã´æ´¢µÄÊÇ×ÓÒ³µÄ×îСµÄ¼üÖµºÍ×ÓÒ³µÄÒ³ºÅ£¬Ò¶×Ó½áµã´æ´¢µÄÊÇÊý¾Ý£¬Êý¾Ý°´ÕÕË÷Òý¼üÅÅÐò¡£Í¬Ò»²ãµÄÒ³Ö®¼äÓÃË«ÏòÁ´±íÁ¬½Ó(Ç°ÃæÌáµ½µÄFIL
HeaderÖÐPREV PAGE ºÍ NEXT PAGE)£¬Í¬Ò»Ò³ÄڵļǼÓõ¥ÏòÁ´±íÁ¬½Ó(Record
HeaderÖмǼÁËÏÂÒ»Ìõ¼Ç¼µÄÆ«ÒÆ)¡£Ã¿Ò»Ò³ÉèÖÃÁËÁ½¸öÐéÄâ¼Ç¼InfimumºÍSupremumÓÃÓÚ±êʶҳµÄ¿ªÊ¼ºÍ½áÊø¡£
Ë÷Òý½á¹¹
ÔÚInnoDBÖиù¾Ý¸¨ÖúË÷Òý²éѯ£¬Èç¹û³ýÁËÖ÷¼üÍ⻹ÓÐÆäËû×ֶΣ¬ÔòÐèÒª²éѯÁ½±é£¬Ïȸù¾Ý¸¨ÖúË÷Òý²éѯÖ÷¼üµÄÖµ£¬È»ºóÔÙµ½Ö÷Ë÷ÒýÖвéѯµÃµ½¼Ç¼¡£´ËÍ⣬ÒòΪ¸¨ÖúË÷ÒýµÄÊý¾Ý²¿·ÖÊÇÖ÷¼üÖµ£¬Ö÷¼ü²»Äܹý´ó£¬·ñÔò»áµ¼Ö¸¨ÖúË÷ÒýÕ¼Óÿռä±ä´ó£¬ÓÃ×ÔÔöID×öÖ÷¼üÊǸö²»´íµÄÑ¡Ôñ¡£
mysql> create
table t2(id int auto_increment primary key, ch
varchar(10), key(ch));
mysql> insert into t2(ch) values('ab'); |
´´½¨Ò»¸öеIJâÊÔ±í t2£¬ÓÐÖ÷Ë÷Òý id ºÍ ¸¨ÖúË÷Òý ch£¬·ÖÎö t2.ibd Îļþ¿ÉÑéÖ¤£º
¶Ô±È±ít£¬±ít2¶àÒ»¸öINDEXÒ³£¬ÓÃÓÚ´æ´¢¸¨ÖúË÷ÒýµÄ¸ù½áµã¡£
¸¨ÖúË÷ÒýµÄINDEXÒ³Ò²ÓÐÁ½¸öϵͳ¼Ç¼ infimum ºÍ supremum¡£¶øÓû§¼Ç¼ÄÚÈݸñʽ¸úÇ°Ãæ·ÖÎö»ù±¾Ò»Ö£¬ÄÚÈÝΪ¸¨ÖúË÷Òý
ch ÁеÄÖµ ab ºÍ Ö÷¼üÖµ1¡£
ҳĿ¼
Ç°ÃæÌáµ½INDEXÒ³ÄڵļǼÊÇͨ¹ýµ¥ÏòÁ´±íÁ¬½ÓÔÚÒ»ÆðµÄ£¬±éÀúÁбíÐÔÄÜ»á±È½Ï²î£¬¶øINDEXÒ³µÄҳĿ¼¾ÍÊÇΪÁ˼ÓËټǼËÑË÷¡£±í
t2 ÖеÄҳĿ¼ֻÓÐÁ½Ï·Ö±ðÊÇ 0x63 ºÍ 0x70£¬¼´ 99 ºÍ 112¡£ÏÂÃæµÄownedkeyΪÕâ¸öҳĿ¼²ÛÓµÓеÄСÓÚµÈÓÚËüµÄ¼Ç¼ÊýÄ¿£¬ÏÔÈ»
infimum µÄownedkeyΪ 1£¬¼´Ö»ÓÐËü×Ô¼º£¬Ã»ÓÐkey»á±ÈinfimumС¡£¶ø supremum
µÄownedÊÇ3£¬·Ö±ðÊÇÎÒÃDzåÈëµÄÁ½Ìõ¼Ç¼ºÍËü×Ô¼º¡£
slot offset type
owned key
0 99 infimum 1
1 112 supremum 3 |
ÿ¸öҳĿ¼²Û×îÉÙÒª°üº¬4¸ö¼Ç¼£¬×î¶à°üº¬8¸ö¼Ç¼(°üÀ¨Ëü×Ô¼º)¡£Èç¹ûÎÒÃÇÔÚ±í t2 ÖÐÁíÍâ²åÈë 7
Ìõ¼Ç¼£¬Ôò»áÔö¼ÓÒ»¸öеÄslot£¬¼´ id Ϊ 4 µÄ¼Ç¼£¬ÈçÏ£º
slot offset type
owned key
0 99 infimum 1
1 207 conventional 4 (i=4)
2 112 supremum 5 |
ÏÂͼÊÇҳĿ¼½á¹¹Í¼£¬¿ÉÒÔͨ¹ýҳĿ¼µÄ¶þ·Ö²éÕÒÌá¸ßÒ³ÄÚÊý¾ÝµÄ²éѯÐÔÄÜ¡£
3.4 InnoDB ϵͳ±í¿Õ¼ä
ϵͳ±í¿Õ¼ä°üº¬ÄÚÈÝÓУºÊý¾Ý×ֵ䣬˫д»º³å£¬Ð޸Ļº³å£¬undoÈÕÖ¾£¬ÒÔ¼°ÔÚϵͳ±í¿Õ¼ä´´½¨µÄ±íµÄÊý¾ÝºÍË÷Òý¡£¿ÉÒÔ¿´µ½£¬³ýÁË·ÖÅäδʹÓõÄÒ³Í⣬
UNDO_LOG£¬SYS, INDEX Ò³Õ¼¾ÝÁ˲»ÉٵĿռ䡣UNDO_LOG Ò³´æ´¢µÄÊÇUndo log£¬SYS
Ò³´æ´¢µÄÊÇÊý¾Ý×ֵ䡢»Ø¹ö¶Î¡¢Ð޸Ļº´æµÈÐÅÏ¢£¬INDEX ÊÇË÷ÒýÒ³£¬TRX_SYS Ò³ÓÃÓÚInnoDBµÄÊÂÎñϵͳ¡£Êý¾Ý×Öµä¾ÍÊÇÊý¾Ý±íµÄÔªÐÅÏ¢£¬Ð޸Ļº³åÇ°ÃæÌáµ½ÊÇΪÁËÌá¸ßIOÐÔÄÜÒ²²»ÔÙ׸Êö£¬ÕâÀïÖ÷Òª·ÖÎöÏÂ
Undo ÈÕÖ¾ºÍ˫д»º³å¡£
root@stretch:/home/vagrant#
innodb_space -s /var/lib/mysql/ibdata1 space-page-type-summary
type count percent description
ALLOCATED 427 55.60 Freshly allocated
UNDO_LOG 125 16.28 Undo log
SYS 110 14.32 System internal
INDEX 71 9.24 B+Tree index
INODE 11 1.43 File segment inode
FSP_HDR 9 1.17 File space header
IBUF_BITMAP 8 1.04 Insert buffer bitmap
BLOB 5 0.65 Uncompressed BLOB
TRX_SYS 2 0.26 Transaction system header |
Undo ÈÕÖ¾
MySQLµÄMVCC(¶à°æ±¾²¢·¢¿ØÖÆ)ÒÀÀµUndo LogʵÏÖ¡£MySQLµÄ±í¿Õ¼äÎļþ t.ibd
´æ´¢µÄÊǼǼ×îÐÂÖµ£¬Ã¿¸ö¼Ç¼¶¼ÓÐÒ»¸ö»Ø¹öÖ¸Õë(¼ûÇ°ÃæÍ¼ÖеÄRoll Ptr)£¬Ö¸Ïò¸Ã¼Ç¼µÄ×î½üÒ»ÌõUndo¼Ç¼£¬¶øÃ¿ÌõUndo¼Ç¼¶¼»áÖ¸ÏòËüµÄǰһÌõUndo¼Ç¼£¬ÈçÏÂͼËùʾ¡£Ä¬ÈÏÇé¿öÏÂ
undo log´æ´¢ÔÚϵͳ±í¿Õ¼ä ibdata1 ÖС£
CREATE TABLE
`t3` (
`id` int(11) NOT NULL,
`a` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into t3 values(1, 'A');
update t3 set a='B' where id=1;
update t3 set a='C' where id=1; |
²åÈëÒ»ÌõÊý¾Ýºó£¬¿ÉÒÔ·¢ÏÖµ±Ç° t3.ibd ÎļþÖеļǼÊÇ (1, 'A')£¬¶ø Undo Log´ËʱÓÐÒ»Ìõ
insert µÄ¼Ç¼¡£ÈçÏ£º
root@stretch:/var/lib/mysql#
innodb_space -s ibdata1 -T test/t3 -p 3 -R 127
record-history
Transaction Type Undo record
(n/a) insert (id=1) ¡ú () |
Ö´ÐкóÃæµÄupdateÓï¾ä£¬¿ÉÒÔ¿´µ½ undo logÈçÏ£º
root@stretch:/var/lib/mysql#
innodb_space -s ibdata1 -T test/t3 -p 3 -R 127
record-history
Transaction Type Undo record
2333 update_existing (id=1) ¡ú (a="B")
2330 update_existing (id=1) ¡ú (a="A")
(n/a) insert (id=1) ¡ú () |
ÐèҪעÒâµÄÊÇ£¬Undo Log ÔÚÊÂÎñÖ´Ðйý³ÌÖоͻá²úÉú£¬ÊÂÎñÌá½»ºó²Å»á³Ö¾Ã»¯£¬Èç¹ûÊÂÎñ»Ø¹öÁËÔòUndo
LogÒ²»áɾ³ý¡£
ÁíÍ⣬ɾ³ý¼Ç¼²¢²»»áÁ¢¼´ÔÚ±í¿Õ¼äÖÐɾ³ý¸Ã¼Ç¼£¬¶øÖ»ÊÇ×ö¸ö±ê¼Ç(delete-mark)£¬ÕæÕýµÄɾ³ýÔòÊǵÈÓɺǫ́ÔËÐеÄ
purge ½ø³Ì´¦Àí¡£³ýÁËÿÌõ¼Ç¼ÓÐUndo LogµÄÁбíÍ⣬Õû¸öÊý¾Ý¿âÒ²»áÓÐÒ»¸öÀúÊ·ÁÐ±í£¬purge
½ø³Ì»á¸ù¾Ý¸ÃÀúÊ·ÁбíÕæÕýɾ³ýÒѾûÓÐÔÙ±»ÆäËûÊÂÎñʹÓÃµÄ delete-mark µÄ¼Ç¼¡£purge
½ø³Ì»áɾ³ý¸Ã¼Ç¼ÒÔ¼°¸Ã¼Ç¼µÄ Undo Log¡£
˫д»º³å
ÏȻعËÏÂInnoDBµÄ¼Ç¼¸üÐÂÁ÷³Ì£ºÏÈÔÚBuffer PoolÖиüУ¬²¢½«¸üмǼµ½ Redo Log
ÎļþÖУ¬Buffer PoolÖеļǼ»á±ê¼ÇΪÔàÊý¾Ý²¢¶¨ÆÚË¢µ½´ÅÅÌ¡£ÓÉÓÚInnoDBĬÈÏPage´óСÊÇ16KB£¬¶ø´ÅÅÌͨ³£ÒÔÉÈÇøÎªµ¥Î»Ð´È룬ÿ´ÎĬÈÏÖ»ÄÜдÈë512¸ö×Ö½Ú£¬ÎÞ·¨±£Ö¤16KÊý¾Ý¿ÉÒÔÔ×ÓµÄдÈë¡£Èç¹ûдÈë¹ý³Ì·¢Éú¹ÊÕÏ(±ÈÈç»úÆ÷µôµç»òÕß²Ù×÷ϵͳ±ÀÀ£)£¬»á³öÏÖÒ³µÄ²¿·ÖдÈë(partial
page writes)£¬µ¼ÖÂÄÑÒÔ»Ö¸´¡£ÒòΪ MySQL µÄÖØ×öÈÕÖ¾²ÉÓõÄÊÇÎïÀíÂß¼ÈÕÖ¾£¬¼´Ò³¼äÊÇÎïÀíÐÅÏ¢£¬¶øÒ³ÄÚÊÇÂß¼ÐÅÏ¢£¬ÔÚ·¢ÉúÒ³²¿·ÖдÈëʱ£¬ÎÞ·¨È·ÈÏÊý¾ÝÒ³µÄ¾ßÌåÐ޸Ķøµ¼ÖÂÄÑÒÔ»Ö¸´¡£
MySQL µÄÊý¾ÝÒ³ÔÚÕæÕýдÈëµ½±í¿Õ¼äÎļþǰ£¬»áÏÈдµ½ÏµÍ³±í¿Õ¼äÎļþµÄÒ»¶ÎÁ¬ÐøÇøÓò˫д»º³å(Double-Write
Buffer£¬Ä¬ÈÏ´óСΪ 2MB£¬128¸öÒ³)²¢ fsync ÂäÅÌ£¬µÈ˫д»º³åдÈë³É¹¦ºó²Å»á½«Êý¾Ýҳдµ½Êµ¼Ê±í¿Õ¼äµÄλÖá£ÒòΪ˫д»º³åºÍÊý¾ÝÒ³µÄдÈëʱ»ú²»Ò»Ö£¬Èç¹ûÔÚдÈë˫д»º³å³ö´í£¬¿ÉÒÔÖ±½Ó¶ªÆú¸Ã»º³åÒ³£¬¶øÈç¹ûÊÇдÈëÊý¾Ýҳʱ³ö´í£¬Ôò¿ÉÒÔ¸ù¾Ý˫д»º³åÇøÊý¾Ý»Ö¸´±í¿Õ¼äÎļþ¡£
4 InnoDB ÊÂÎñ¸ôÀë¼¶±ð
InnoDBµÄ¶à°æ±¾²¢·¢¿ØÖÆÊÇ»ùÓÚÊÂÎñ¸ôÀë¼¶±ðʵÏֵ쬶øÊÂÎñ¸ôÀë¼¶±ðÔòÊÇÒÀÍÐÇ°ÃæÌáµ½µÄ Undo Log
ʵÏֵġ£µ±¶Áȡһ¸öÊý¾Ý¼Ç¼ʱ£¬Ã¿¸öÊÂÎñ»áʹÓÃÒ»¸ö¶ÁÊÓͼ(Read View)£¬¶ÁÊÓͼÓÃÓÚ¿ØÖÆÊÂÎñÄܶÁÈ¡µ½µÄ¼Ç¼µÄ°æ±¾¡£
InnoDBµÄÊÂÎñ¸ôÀë¼¶±ð·ÖΪ£ºRead UnCommitted£¬Read Committed£¬Repeatable
ReadÒÔ¼°Serializable¡£ÆäÖÐSerializableÊÇ»ùÓÚËøÊµÏֵĴ®Ðл¯·½Ê½£¬ÑϸñÀ´Ëµ²»ÊÇÊÂÎñ¿É¼ûÐÔ·¶³ë¡£
Read Uncommitted£ºÎ´Ìá½»¶ÁÒ²³ÆÎªÔà¶Á£¬Ëü¶ÁÈ¡µÄÊǵ±Ç°×îÐÂÐ޸ĵļǼ£¬¼´±ãÕâ¸öÐÞ¸Ä×îºó²¢Î´ÉúЧ¡£
Read Committed£ºÌá½»¶Á¡£Ëü»ùÓÚµÄÊǵ±Ç°ÊÂÎñÄÚµÄÓï¾ä¿ªÊ¼Ö´ÐÐʱµÄ×î´óµÄÊÂÎñID¡£Èç¹ûÆäËûÊÂÎñÐÞ¸Äͬһ¸ö¼Ç¼£¬ÔÚûÓÐÌύǰ£¬Ôò¸ÃÓï¾ä¶ÁÈ¡µÄ¼Ç¼»¹ÊDz»»á±ä¡£µ«ÊÇÕâÖÖÇé¿ö»á²úÉú²»¿ÉÖØ¸´¶Á£¬¼´Ò»¸öÊÂÎñÄÚ¶à´Î¶ÁȡͬһÌõ¼Ç¼¿ÉÄܵõ½²»Í¬µÄ½á¹û(¸Ã¼Ç¼±»ÆäËûÊÂÎñÐ޸IJ¢Ìá½»ÁË)¡£
Repeatable Read£º¿ÉÖØ¸´¶Á¡£Ëü»ùÓÚµÄÊÇÊÂÎñ¿ªÊ¼Ê±µÄ¶ÁÊÓͼ£¬Ö±µ½ÊÂÎñ½áÊø¡£²»¶ÁÈ¡ÆäËûеÄÊÂÎñ¶Ô¸Ã¼Ç¼µÄÐ޸쬱£Ö¤Í¬Ò»¸öÊÂÎñÄڵĿÉÖØ¸´¶ÁÈ¡¡£InnoDBÌṩÁË
next-key lockÀ´½â¾ö»Ã¶ÁÎÊÌ⣬²»¹ýÔÚÒ»Ð©ÌØÊⳡ¾°Ï£¬¿ÉÖØ¸´¶Á»¹ÊÇ¿ÉÄܳöÏֻöÁµÄÇé¿ö¡£ÔÚʵ¼Ê¿ª·¢ÖÐÓ°Ïì²»´ó£¬¾Í²»×¸ÊöÁË¡£
5 InnoDB ºÍ ACID Ä£ÐÍ
ÊÂÎñÓÐ ACID ËĸöÊôÐÔ£¬ InnoDB ÊÇÖ§³ÖÊÂÎñµÄ£¬ËüʵÏÖ ACID µÄ»úÖÆÈçÏ£º
Atomicity
innodbµÄÔ×ÓÐÔÖ÷ÒªÊÇͨ¹ýÌṩµÄÊÂÎñ»úÖÆÊµÏÖ£¬ÓëÔ×ÓÐÔÏà¹ØµÄÌØÐÔÓУº
Autocommit ÉèÖá£
COMMIT ºÍ ROLLBACK Óï¾ä(ͨ¹ý Undo LogʵÏÖ)¡£
Consistency
innodbµÄÒ»ÖÂÐÔÖ÷ÒªÊÇÖ¸±£»¤Êý¾Ý²»ÊÜϵͳ±ÀÀ£Ó°Ï죬Ïà¹ØÌØÐÔ°üÀ¨£º
InnoDB µÄ˫д»º³åÇø(doublewrite buffer)¡£
InnoDB µÄ¹ÊÕϻָ´»úÖÆ(crash recovery)¡£
Isolation
innodbµÄ¸ôÀëÐÔÒ²ÊÇÖ÷Ҫͨ¹ýÊÂÎñ»úÖÆÊµÏÖ£¬ÌرðÊÇΪÊÂÎñÌṩµÄ¶àÖÖ¸ôÀë¼¶±ð£¬Ïà¹ØÌØÐÔ°üÀ¨£º
AutocommitÉèÖá£
SET ISOLATION LEVEL Óï¾ä¡£
InnoDB Ëø»úÖÆ¡£
Durability
innodbµÄ³Ö¾ÃÐÔÏà¹ØÌØÐÔ£º
Redo log¡£
˫д»º³å¹¦ÄÜ¡£¿ÉÒÔͨ¹ýÅäÖÃÏî innodb_doublewrite ¿ªÆô»òÕ߹رա£
ÅäÖà innodb_flush_log_at_trx_commit¡£ÓÃÓÚÅäÖÃinnodbÈçºÎдÈëºÍË¢ÐÂ
redo ÈÕÖ¾»º´æµ½´ÅÅÌ¡£Ä¬ÈÏΪ1£¬±íʾÿ´ÎÊÂÎñÌá½»¶¼»á½«ÈÕÖ¾»º´æÐ´È벢ˢµ½´ÅÅÌ¡£innodb_flush_log_at_timeout
¿ÉÒÔÅäÖÃË¢ÐÂÈÕÖ¾»º´æµ½´ÅÅÌµÄÆµÂÊ£¬Ä¬ÈÏÊÇ1Ãë¡£
ÅäÖà sync_binlog¡£ÓÃÓÚÉèÖÃͬ²½ binlog µ½´ÅÅÌµÄÆµÂÊ£¬Îª0±íʾ½ûÖ¹MySQLͬ²½binlogµ½´ÅÅÌ£¬binlogË¢µ½´ÅÅÌµÄÆµÂÊÓɲÙ×÷ϵͳ¾ö¶¨£¬ÐÔÄÜ×îºÃµ«ÊÇ×î²»°²È«¡£Îª1±íʾÿ´ÎÊÂÎñÌύǰͬ²½µ½´ÅÅÌ£¬ÐÔÄÜ×î²îµ«ÊÇ×ȫ¡£MySQLÎĵµÍƼöÊÇ
sync_binlog ºÍ innodb_flush_log_at_trx_commit ¶¼ÉèÖÃΪ
1¡£
²Ù×÷ϵͳµÄ fsync ϵͳµ÷Óá£
|