±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcsdn£¬±¾ÎÄÖжÔÓÚÊý¾Ý¿âµÄ½éÉÜÒÔ¼°Ñо¿¶¼ÊÇÔÚ
MySQL ÉϽøÐеģ¬Èç¹ûÉæ¼°µ½ÁËÆäËûÊý¾Ý¿âµÄÄÚÈÝ»òÕßʵÏÖ»áÔÚÎÄÖе¥¶ÀÖ¸³ö¡£ |
|
×÷ΪһÃû¿ª·¢ÈËÔ±£¬ÔÚÈÕ³£µÄ¹¤×÷ÖлáÄÑÒÔ±ÜÃâµØ½Ó´¥µ½Êý¾Ý¿â£¬ÎÞÂÛÊÇ»ùÓÚÎļþµÄ
sqlite »¹Êǹ¤³ÌÉÏʹÓ÷dz£¹ã·ºµÄ MySQL¡¢PostgreSQL£¬µ«ÊÇÒ»Ö±ÒÔÀ´Ò²Ã»ÓжÔÊý¾Ý¿âÓÐÒ»¸ö·Ç³£ÇåÎú²¢ÇÒ³ÉÌåϵµÄÈÏÖª£¬ËùÒÔ×î½üÁ½¸öÔµÄʱ¼ä¿´Á˼¸±¾Êý¾Ý¿âÏà¹ØµÄÊé¼®²¢ÇÒÔĶÁÁË
MySQL µÄ¹Ù·½Îĵµ£¬Ï£Íû¶Ô¸÷λÁ˽âÊý¾Ý¿âµÄ¡¢²»Á˽âÊý¾Ý¿âµÄÓÐËù°ïÖú¡£

Êý¾Ý¿âµÄ¶¨Òå
ºÜ¶à¿ª·¢ÕßÔÚ×ʼʱÆäʵ¶¼¶ÔÊý¾Ý¿âÓÐÒ»¸ö±È½ÏÄ£ºýµÄÈÏʶ£¬¾õµÃÊý¾Ý¿â¾ÍÊÇÒ»¶ÑÊý¾ÝµÄ¼¯ºÏ£¬µ«ÊÇʵ¼ÊÈ´±ÈÕ⸴ÔӵĶ࣬Êý¾Ý¿âÁìÓòÖÐÓÐÁ½¸ö´Ê·Ç³£ÈÝÒ×»ìÏý£¬Ò²¾ÍÊÇÊý¾Ý¿âºÍʵÀý£º
Êý¾Ý¿â£ºÎïÀí²Ù×÷Îļþϵͳ»òÆäËûÐÎʽÎļþÀàÐ͵ļ¯ºÏ£»
ʵÀý£ºMySQL Êý¾Ý¿âÓɺǫ́Ïß³ÌÒÔ¼°Ò»¸ö¹²ÏíÄÚ´æÇø×é³É£»
¶ÔÓÚÊý¾Ý¿âºÍʵÀýµÄ¶¨Òå¶¼À´×ÔÓÚ MySQL ¼¼ÊõÄÚÄ»£ºInnoDB ´æ´¢ÒýÇæ Ò»Ê飬ÏëÒªÁ˽â InnoDB
´æ´¢ÒýÇæµÄ¶ÁÕß¿ÉÒÔÔĶÁÕâ±¾Êé¼®¡£
Êý¾Ý¿âºÍʵÀý
ÔÚ MySQL ÖУ¬ÊµÀýºÍÊý¾Ý¿âÍùÍù¶¼ÊÇÒ»Ò»¶ÔÓ¦µÄ£¬¶øÎÒÃÇÒ²ÎÞ·¨Ö±½Ó²Ù×÷Êý¾Ý¿â£¬¶øÊÇҪͨ¹ýÊý¾Ý¿âʵÀýÀ´²Ù×÷Êý¾Ý¿âÎļþ£¬¿ÉÒÔÀí½âΪÊý¾Ý¿âʵÀýÊÇÊý¾Ý¿âΪÉϲãÌṩµÄÒ»¸öרÃÅÓÃÓÚ²Ù×÷µÄ½Ó¿Ú¡£

ÔÚ Unix ÉÏ£¬Æô¶¯Ò»¸ö MySQL ʵÀýÍùÍù»á²úÉúÁ½¸ö½ø³Ì£¬ mysqld ¾ÍÊÇÕæÕýµÄÊý¾Ý¿â·þÎñÊØ»¤½ø³Ì£¬¶ø
mysqld_safeÊÇÒ»¸öÓÃÓÚ¼ì²éºÍÉèÖà mysqld Æô¶¯µÄ¿ØÖƳÌÐò£¬Ëü¸ºÔð¼à¿Ø MySQL ½ø³ÌµÄÖ´ÐУ¬µ±
mysqld ·¢Éú´íÎóʱ£¬ mysqld_safe »á¶ÔÆä״̬½øÐмì²é²¢ÔÚºÏÊʵÄÌõ¼þÏÂÖØÆô¡£
MySQL µÄ¼Ü¹¹
MySQL ´ÓµÚÒ»¸ö°æ±¾·¢²¼µ½ÏÖÔÚÒѾÓÐÁË 20 ¶àÄêµÄÀúÊ·£¬ÔÚÕâô¶àÄêµÄ·¢Õ¹ºÍÑݱäÖУ¬Õû¸öÓ¦ÓõÄÌåϵ½á¹¹±äµÃÔ½À´Ô½¸´ÔÓ£º

×îÉϲãÓÃÓÚÁ¬½Ó¡¢Ï̴߳¦ÀíµÄ²¿·Ö²¢²»ÊÇ MySQL ¡º·¢Ã÷¡»µÄ£¬ºÜ¶à·þÎñ¶¼ÓÐÀàËÆµÄ×é³É²¿·Ö£»µÚ¶þ²ãÖаüº¬ÁË´ó¶àÊý
MySQL µÄºËÐÄ·þÎñ£¬°üÀ¨ÁË¶Ô SQL µÄ½âÎö¡¢·ÖÎö¡¢ÓÅ»¯ºÍ»º´æµÈ¹¦ÄÜ£¬´æ´¢¹ý³Ì¡¢´¥·¢Æ÷ºÍÊÓͼ¶¼ÊÇÔÚÕâÀïʵÏֵģ»¶øµÚÈý²ã¾ÍÊÇ
MySQL ÖÐÕæÕý¸ºÔðÊý¾ÝµÄ´æ´¢ºÍÌáÈ¡µÄ´æ´¢ÒýÇæ£¬ÀýÈ磺InnoDB¡¢MyISAM µÈ£¬ÎÄÖжԴ洢ÒýÇæµÄ½éÉܶ¼ÊǶÔ
InnoDB ʵÏֵķÖÎö¡£
Êý¾ÝµÄ´æ´¢
ÔÚÕû¸öÊý¾Ý¿âÌåϵ½á¹¹ÖУ¬ÎÒÃÇ¿ÉÒÔʹÓò»Í¬µÄ´æ´¢ÒýÇæÀ´´æ´¢Êý¾Ý£¬¶ø¾ø´ó¶àÊý´æ´¢ÒýÇæ¶¼ÒÔ¶þ½øÖƵÄÐÎʽ´æ´¢Êý¾Ý£»ÕâÒ»½Ú»á½éÉÜ
InnoDB ÖжÔÊý¾ÝÊÇÈçºÎ´æ´¢µÄ¡£
ÔÚ InnoDB ´æ´¢ÒýÇæÖУ¬ËùÓеÄÊý¾Ý¶¼±»Âß¼µØ´æ·ÅÔÚ±í¿Õ¼äÖУ¬±í¿Õ¼ä£¨tablespace£©ÊÇ´æ´¢ÒýÇæÖÐ×î¸ßµÄ´æ´¢Âß¼µ¥Î»£¬ÔÚ±í¿Õ¼äµÄÏÂÃæÓÖ°üÀ¨¶Î£¨segment£©¡¢Çø£¨extent£©¡¢Ò³£¨page£©£º

ͬһ¸öÊý¾Ý¿âʵÀýµÄËùÓбí¿Õ¼ä¶¼ÓÐÏàͬµÄÒ³´óС£»Ä¬ÈÏÇé¿öÏ£¬±í¿Õ¼äÖеÄÒ³´óС¶¼Îª 16KB£¬µ±È»Ò²¿ÉÒÔͨ¹ý¸Ä±ä
innodb_page_size Ñ¡Ïî¶ÔĬÈÏ´óС½øÐÐÐ޸ģ¬ÐèҪעÒâµÄÊDz»Í¬µÄÒ³´óС×îÖÕÒ²»áµ¼ÖÂÇø´óСµÄ²»Í¬£º

´ÓͼÖпÉÒÔ¿´³ö£¬ÔÚ InnoDB ´æ´¢ÒýÇæÖУ¬Ò»¸öÇøµÄ´óС×îСΪ 1MB£¬Ò³µÄÊýÁ¿×îÉÙΪ 64 ¸ö¡£
ÈçºÎ´æ´¢±í
MySQL ʹÓà InnoDB ´æ´¢±íʱ£¬»á½«±íµÄ¶¨ÒåºÍÊý¾ÝË÷ÒýµÈÐÅÏ¢·Ö¿ª´æ´¢£¬ÆäÖÐǰÕß´æ´¢ÔÚ .frmÎļþÖУ¬ºóÕß´æ´¢ÔÚ
.ibd ÎļþÖУ¬ÕâÒ»½Ú¾Í»á¶ÔÕâÁ½ÖÖ²»Í¬µÄÎļþ·Ö±ð½øÐнéÉÜ¡£

.frm Îļþ
ÎÞÂÛÔÚ MySQL ÖÐÑ¡ÔñÁËÄĸö´æ´¢ÒýÇæ£¬ËùÓÐµÄ MySQL ±í¶¼»áÔÚÓ²ÅÌÉÏ´´½¨Ò»¸ö
.frm ÎļþÓÃÀ´ÃèÊö±íµÄ¸ñʽ»òÕß˵¶¨Ò壻 .frm ÎļþµÄ¸ñʽÔÚ²»Í¬µÄƽ̨É϶¼ÊÇÏàͬµÄ¡£
ATE TABLE test_frm(
column1 CHAR(5), column2 INTEGER |
µ±ÎÒÃÇʹÓÃÉÏÃæµÄ´úÂë´´½¨±íʱ£¬»áÔÚ´ÅÅÌÉ쵀 datadirÎļþ¼ÐÖÐÉú³ÉÒ»¸ö test_frm.frm
µÄÎļþ£¬Õâ¸öÎļþÖоͰüº¬Á˱í½á¹¹Ïà¹ØµÄÐÅÏ¢£º

MySQL ¹Ù·½ÎĵµÖÐµÄ 11.1 MySQL .frm File Format Ò»ÎĶÔÓÚ .frm
Îļþ¸ñʽÖеĶþ½øÖƵÄÄÚÈÝÓÐ×ŷdz£ÏêϸµÄ±íÊö£¬ÔÚÕâÀï¾Í²»Õ¹¿ª½éÉÜÁË¡£
.ibd Îļþ
InnoDB ÖÐÓÃÓÚ´æ´¢Êý¾ÝµÄÎļþ×ܹ²ÓÐÁ½¸ö²¿·Ö£¬Ò»ÊÇϵͳ±í¿Õ¼äÎļþ£¬°üÀ¨ ibdata1¡¢ ibdata2
µÈÎļþ£¬ÆäÖд洢ÁË InnoDB ϵͳÐÅÏ¢ºÍÓû§Êý¾Ý¿â±íÊý¾ÝºÍË÷Òý£¬ÊÇËùÓÐ±í¹«Óõġ£
µ±´ò¿ª innodb_file_per_table Ñ¡Ïîʱ£¬ .ibd Îļþ¾ÍÊÇÿһ¸ö±í¶ÀÓеıí¿Õ¼ä£¬Îļþ´æ´¢Á˵±Ç°±íµÄÊý¾ÝºÍÏà¹ØµÄË÷ÒýÊý¾Ý¡£
ÈçºÎ´æ´¢¼Ç¼
ÓëÏÖÓеĴó¶àÊý´æ´¢ÒýÇæÒ»Ñù£¬InnoDB ʹÓÃÒ³×÷Ϊ´ÅÅ̹ÜÀíµÄ×îСµ¥Î»£»Êý¾ÝÔÚ InnoDB ´æ´¢ÒýÇæÖж¼Êǰ´Ðд洢µÄ£¬Ã¿¸ö
16KB ´óСµÄÒ³ÖпÉÒÔ´æ·Å 2-200 ÐеļǼ¡£
µ± InnoDB ´æ´¢Êý¾Ýʱ£¬Ëü¿ÉÒÔʹÓò»Í¬µÄÐиñʽ½øÐд洢£»MySQL 5.7 °æ±¾Ö§³ÖÒÔϸñʽµÄÐд洢·½Ê½£º

Antelope ÊÇ InnoDB ×ʼ֧³ÖµÄÎļþ¸ñʽ£¬Ëü°üº¬Á½ÖÖÐиñʽ Compact ºÍ Redundant£¬Ëü×ʼ²¢Ã»ÓÐÃû×Ö£»Antelope
µÄÃû×ÖÊÇÔÚеÄÎļþ¸ñʽ Barracuda ³öÏÖºó²ÅÆðµÄ£¬Barracuda µÄ³öÏÖÒýÈëÁËÁ½ÖÖеÄÐиñʽ
Compressed ºÍ Dynamic£»InnoDB ¶ÔÓÚÎļþ¸ñʽ¶¼»áÏòǰ¼æÈÝ£¬¶ø¹Ù·½ÎĵµÖÐÒ²¶ÔÖ®ºó»á³öÏÖµÄÐÂÎļþ¸ñʽԤÏȶ¨ÒåºÃÁËÃû×Ö£ºCheetah¡¢Dragon¡¢Elk
µÈµÈ¡£
Á½ÖÖÐмǼ¸ñʽ Compact ºÍ Redundant ÔÚ´ÅÅÌÉϰ´ÕÕÒÔÏ·½Ê½´æ´¢£º

Compact ºÍ Redundant ¸ñʽ×î´óµÄ²»Í¬¾ÍÊǼǼ¸ñʽµÄµÚÒ»¸ö²¿·Ö£»ÔÚ Compact
ÖУ¬ÐмǼµÄµÚÒ»²¿·Öµ¹Ðò´æ·ÅÁËÒ»ÐÐÊý¾ÝÖÐÁеij¤¶È£¨Length£©£¬¶ø Redundant ÖдæµÄÊÇÿһÁÐµÄÆ«ÒÆÁ¿£¨Offset£©£¬´Ó×ÜÌåÉÏÉÏ¿´£¬Compact
ÐмǼ¸ñʽÏà±È Redundant ¸ñʽÄܹ»¼õÉÙ 20% µÄ´æ´¢¿Õ¼ä¡£
ÐÐÒç³öÊý¾Ý
µ± InnoDB ʹÓà Compact »òÕß Redundant ¸ñʽ´æ´¢¼«³¤µÄ VARCHAR »òÕß
BLOB ÕâÀà´ó¶ÔÏóʱ£¬ÎÒÃDz¢²»»áÖ±½Ó½«ËùÓеÄÄÚÈݶ¼´æ·ÅÔÚÊý¾ÝÒ³½ÚµãÖУ¬¶øÊǽ«ÐÐÊý¾ÝÖеÄǰ 768
¸ö×Ö½Ú´æ´¢ÔÚÊý¾ÝÒ³ÖУ¬ºóÃæ»áͨ¹ýÆ«ÒÆÁ¿Ö¸ÏòÒç³öÒ³¡£

µ«Êǵ±ÎÒÃÇʹÓÃеÄÐмǼ¸ñʽ Compressed »òÕß Dynamic ʱ¶¼Ö»»áÔÚÐмǼÖб£´æ
20 ¸ö×Ö½ÚµÄÖ¸Õ룬ʵ¼ÊµÄÊý¾Ý¶¼»á´æ·ÅÔÚÒç³öÒ³ÃæÖС£

µ±È»ÔÚʵ¼Ê´æ´¢ÖУ¬¿ÉÄÜ»á¶Ô²»Í¬³¤¶ÈµÄ TEXT ºÍ BLOB ÁнøÐÐÓÅ»¯£¬²»¹ýÕâ¾Í²»ÊDZ¾ÎĹØ×¢µÄÖØµãÁË¡£
ÏëÒªÁ˽â¸ü¶àÓë InnoDB ´æ´¢ÒýÇæÖмǼµÄÊý¾Ý¸ñʽµÄÏà¹ØÐÅÏ¢£¬¿ÉÒÔÔĶÁ InnoDB Record
Structure
Êý¾ÝÒ³½á¹¹
Ò³ÊÇ InnoDB ´æ´¢ÒýÇæ¹ÜÀíÊý¾ÝµÄ×îС´ÅÅ̵¥Î»£¬¶ø B-Tree ½Úµã¾ÍÊÇʵ¼Ê´æ·Å±íÖÐÊý¾ÝµÄÒ³Ãæ£¬ÎÒÃÇÔÚÕâÀォҪ½éÉÜÒ³ÊÇÈçºÎ×éÖ¯ºÍ´æ´¢¼Ç¼µÄ£»Ê×ÏÈ£¬Ò»¸ö
InnoDB Ò³ÓÐÒÔÏÂÆß¸ö²¿·Ö£º

ÿһ¸öÒ³Öаüº¬ÁËÁ½¶Ô header/trailer£ºÄÚ²¿µÄ Page Header/Page Directory
¹ØÐĵÄÊÇÒ³µÄ״̬ÐÅÏ¢£¬¶ø Fil Header/Fil Trailer ¹ØÐĵÄÊǼǼҳµÄÍ·ÐÅÏ¢¡£
ÔÚÒ³µÄÍ·²¿ºÍβ²¿Ö®¼ä¾ÍÊÇÓû§¼Ç¼ºÍ¿ÕÏпռäÁË£¬Ã¿Ò»¸öÊý¾ÝÒ³Öж¼°üº¬ Infimum ºÍ Supremum
ÕâÁ½¸öÐéÄâµÄ¼Ç¼£¨¿ÉÒÔÀí½âΪռλ·û£©£¬Infimum ¼Ç¼ÊDZȸÃÒ³ÖÐÈκÎÖ÷¼üÖµ¶¼ÒªÐ¡µÄÖµ£¬Supremum
ÊǸÃÒ³ÖеÄ×î´óÖµ£º

User Records ¾ÍÊÇÕû¸öÒ³ÃæÖÐÕæÕýÓÃÓÚ´æ·ÅÐмǼµÄ²¿·Ö£¬¶ø Free Space ¾ÍÊÇ¿ÕÓà¿Õ¼äÁË£¬ËüÊÇÒ»¸öÁ´±íµÄÊý¾Ý½á¹¹£¬ÎªÁ˱£Ö¤²åÈëºÍɾ³ýµÄЧÂÊ£¬Õû¸öÒ³Ãæ²¢²»»á°´ÕÕÖ÷¼ü˳Ðò¶ÔËùÓмǼ½øÐÐÅÅÐò£¬Ëü»á×Ô¶¯´Ó×ó²àÏòÓÒѰÕÒ¿Õ°×½Úµã½øÐвåÈ룬ÐмǼÔÚÎïÀí´æ´¢Éϲ¢²»Êǰ´ÕÕ˳ÐòµÄ£¬ËüÃÇÖ®¼äµÄ˳ÐòÊÇÓÉ
next_record ÕâÒ»Ö¸Õë¿ØÖÆµÄ¡£
B+ Ê÷ÔÚ²éÕÒ¶ÔÓ¦µÄ¼Ç¼ʱ£¬²¢²»»áÖ±½Ó´ÓÊ÷ÖÐÕÒ³ö¶ÔÓ¦µÄÐмǼ£¬ËüÖ»ÄÜ»ñÈ¡¼Ç¼ËùÔÚµÄÒ³£¬½«Õû¸öÒ³¼ÓÔØµ½ÄÚ´æÖУ¬ÔÙͨ¹ý
Page Directory Öд洢µÄÏ¡ÊèË÷ÒýºÍ n_owned¡¢ next_record ÊôÐÔÈ¡³ö¶ÔÓ¦µÄ¼Ç¼£¬²»¹ýÒòΪÕâÒ»²Ù×÷ÊÇÔÚÄÚ´æÖнøÐеģ¬ËùÒÔͨ³£»áºöÂÔÕⲿ·Ö²éÕҵĺÄʱ¡£
InnoDB ´æ´¢ÒýÇæÖжÔÊý¾ÝµÄ´æ´¢ÊÇÒ»¸ö·Ç³£¸´ÔӵϰÌ⣬ÕâÒ»½ÚÖÐÒ²Ö»ÊÇ¶Ô±í¡¢ÐмǼÒÔ¼°Ò³ÃæµÄ´æ´¢½øÐÐÒ»¶¨µÄ·ÖÎöºÍ½éÉÜ£¬ËäÈ»×÷ÕßÏàÐÅÕⲿ·Ö֪ʶ¶ÔÓڴ󲿷ֿª·¢ÕßÒѾ×ã¹»ÁË£¬µ«ÊÇÏëÒªÕæÕýÏû»¯Õⲿ·ÖÄÚÈÝ»¹ÐèÒªºÜ¶àµÄŬÁ¦ºÍʵ¼ù¡£
Ë÷Òý
Ë÷ÒýÊÇÊý¾Ý¿âÖзdz£·Ç³£ÖØÒªµÄ¸ÅÄËüÊÇ´æ´¢ÒýÇæÄܹ»¿ìËÙ¶¨Î»¼Ç¼µÄÃØÃÜÎäÆ÷£¬¶ÔÓÚÌáÉýÊý¾Ý¿âµÄÐÔÄÜ¡¢¼õÇáÊý¾Ý¿â·þÎñÆ÷µÄ¸ºµ£ÓÐ×ŷdz£ÖØÒªµÄ×÷Óã»Ë÷ÒýÓÅ»¯ÊǶԲéѯÐÔÄÜÓÅ»¯µÄ×îÓÐЧÊֶΣ¬ËüÄܹ»ÇáËɵؽ«²éѯµÄÐÔÄÜÌá¸ß¼¸¸öÊýÁ¿¼¶¡£
Ë÷ÒýµÄÊý¾Ý½á¹¹
ÔÚÉÏÒ»½ÚÖУ¬ÎÒÃÇ̸ÁËÐмǼµÄ´æ´¢ºÍÒ³µÄ´æ´¢£¬ÔÚÕâÀïÎÒÃǾÍÒª´Ó¸ü¸ßµÄ²ãÃæ¿´ InnoDB ÖжÔÓÚÊý¾ÝÊÇÈçºÎ´æ´¢µÄ£»InnoDB
´æ´¢ÒýÇæÔÚ¾ø´ó¶àÊýÇé¿öÏÂʹÓà B+ Ê÷½¨Á¢Ë÷Òý£¬ÕâÊǹØÏµÐÍÊý¾Ý¿âÖвéÕÒ×îΪ³£ÓúÍÓÐЧµÄË÷Òý£¬µ«ÊÇ B+
Ê÷Ë÷Òý²¢²»ÄÜÕÒµ½Ò»¸ö¸ø¶¨¼ü¶ÔÓ¦µÄ¾ßÌåÖµ£¬ËüÖ»ÄÜÕÒµ½Êý¾ÝÐжÔÓ¦µÄÒ³£¬È»ºóÕýÈçÉÏÒ»½ÚËùÌáµ½µÄ£¬Êý¾Ý¿â°ÑÕû¸öÒ³¶ÁÈëµ½ÄÚ´æÖУ¬²¢ÔÚÄÚ´æÖвéÕÒ¾ßÌåµÄÊý¾ÝÐС£

B+ Ê÷ÊÇÆ½ºâÊ÷£¬Ëü²éÕÒÈÎÒâ½ÚµãËùºÄ·ÑµÄʱ¼ä¶¼ÊÇÍêÈ«ÏàͬµÄ£¬±È½ÏµÄ´ÎÊý¾ÍÊÇ B+ Ê÷µÄ¸ß¶È£»ÔÚÕâÀÎÒÃDz¢²»»áÉîÈë·ÖÎö»òÕß¶¯ÊÖʵÏÖÒ»¸ö
B+ Ê÷£¬Ö»ÊǶÔËüµÄÌØÐÔ½øÐмòµ¥µÄ½éÉÜ¡£
¾Û¼¯Ë÷ÒýºÍ¸¨ÖúË÷Òý
Êý¾Ý¿âÖÐµÄ B+ Ê÷Ë÷Òý¿ÉÒÔ·ÖΪ¾Û¼¯Ë÷Òý£¨clustered index£©ºÍ¸¨ÖúË÷Òý£¨secondary
index£©£¬ËüÃÇÖ®¼äµÄ×î´óÇø±ð¾ÍÊÇ£¬¾Û¼¯Ë÷ÒýÖдæ·Å×ÅÒ»ÌõÐмǼµÄÈ«²¿ÐÅÏ¢£¬¶ø¸¨ÖúË÷ÒýÖÐÖ»°üº¬Ë÷ÒýÁкÍÒ»¸öÓÃÓÚ²éÕÒ¶ÔÓ¦ÐмǼµÄ¡ºÊéÇ©¡»¡£
¾Û¼¯Ë÷Òý
InnoDB ´æ´¢ÒýÇæÖÐµÄ±í¶¼ÊÇʹÓÃË÷Òý×éÖ¯µÄ£¬Ò²¾ÍÊǰ´ÕÕ¼üµÄ˳Ðò´æ·Å£»¾Û¼¯Ë÷Òý¾ÍÊǰ´ÕÕ±íÖÐÖ÷¼üµÄ˳Ðò¹¹½¨Ò»¿Å
B+ Ê÷£¬²¢ÔÚÒ¶½ÚµãÖдæ·Å±íÖеÄÐмǼÊý¾Ý¡£
EATE TABLE users(
id INT NOT NULL, first_name VARCHAR(20) NOT NULL, last_name VARCHAR(20) NOT NULL, age INT NOT NULL, PRIMARY KEY(id), KEY(last_name, first_name, age) KEY(first_name)); |
Èç¹ûʹÓÃÉÏÃæµÄ SQL ÔÚÊý¾Ý¿âÖд´½¨Ò»ÕÅ±í£¬B+ Ê÷¾Í»áʹÓà id ×÷ΪË÷ÒýµÄ¼ü£¬²¢ÔÚÒ¶×Ó½ÚµãÖд洢һÌõ¼Ç¼ÖеÄËùÓÐÐÅÏ¢¡£

ͼÖÐ¶Ô B+ Ê÷µÄÃèÊöÓëÕæÊµÇé¿öÏ B+ Ê÷ÖеÄÊý¾Ý½á¹¹ÓÐһЩ²î±ð£¬²»¹ýÕâÀïÏëÒª±í´ïµÄÖ÷ÒªÒâ˼ÊÇ£º¾Û¼¯Ë÷ÒýÒ¶½ÚµãÖб£´æµÄÊÇÕûÌõÐмǼ£¬¶ø²»ÊÇÆäÖеÄÒ»²¿·Ö¡£
¾Û¼¯Ë÷ÒýÓë±íµÄÎïÀí´æ´¢·½Ê½ÓÐ×ŷdz£ÃÜÇеĹØÏµ£¬ËùÓÐÕý³£µÄ±íÓ¦¸ÃÓÐÇÒ½öÓÐÒ»¸ö¾Û¼¯Ë÷Òý£¨¾ø´ó¶àÊýÇé¿ö϶¼ÊÇÖ÷¼ü£©£¬±íÖеÄËùÓÐÐмǼÊý¾Ý¶¼Êǰ´ÕÕ¾Û¼¯Ë÷ÒýµÄ˳Ðò´æ·ÅµÄ¡£
µ±ÎÒÃÇʹÓþۼ¯Ë÷Òý¶Ô±íÖеÄÊý¾Ý½øÐмìË÷ʱ£¬¿ÉÒÔÖ±½Ó»ñµÃ¾Û¼¯Ë÷ÒýËù¶ÔÓ¦µÄÕûÌõÐмǼÊý¾ÝËùÔÚµÄÒ³£¬²»ÐèÒª½øÐеڶþ´Î²Ù×÷¡£
¸¨ÖúË÷Òý
Êý¾Ý¿â½«ËùÓеķǾۼ¯Ë÷Òý¶¼»®·ÖΪ¸¨ÖúË÷Òý£¬µ«ÊÇÕâ¸ö¸ÅÄî¶ÔÎÒÃÇÀí½â¸¨ÖúË÷Òý²¢Ã»ÓÐʲô°ïÖú£»¸¨ÖúË÷ÒýÒ²ÊÇͨ¹ý
B+ Ê÷ʵÏֵ쬵«ÊÇËüµÄÒ¶½Úµã²¢²»°üº¬ÐмǼµÄÈ«²¿Êý¾Ý£¬½ö°üº¬Ë÷ÒýÖеÄËùÓмüºÍÒ»¸öÓÃÓÚ²éÕÒ¶ÔÓ¦ÐмǼµÄ¡ºÊéÇ©¡»£¬ÔÚ
InnoDB ÖÐÕâ¸öÊéÇ©¾ÍÊǵ±Ç°¼Ç¼µÄÖ÷¼ü¡£
¸¨ÖúË÷ÒýµÄ´æÔÚ²¢²»»áÓ°Ïì¾Û¼¯Ë÷Òý£¬ÒòΪ¾Û¼¯Ë÷Òý¹¹³ÉµÄ B+ Ê÷ÊÇÊý¾Ýʵ¼Ê´æ´¢µÄÐÎʽ£¬¶ø¸¨ÖúË÷ÒýÖ»ÓÃÓÚ¼ÓËÙÊý¾ÝµÄ²éÕÒ£¬ËùÒÔÒ»ÕűíÉÏÍùÍùÓжà¸ö¸¨ÖúË÷ÒýÒÔ´ËÀ´ÌáÉýÊý¾Ý¿âµÄÐÔÄÜ¡£
Ò»ÕűíÒ»¶¨°üº¬Ò»¸ö¾Û¼¯Ë÷Òý¹¹³ÉµÄ B+ Ê÷ÒÔ¼°Èô¸É¸¨ÖúË÷ÒýµÄ¹¹³ÉµÄ B+ Ê÷¡£

Èç¹ûÔÚ±í users ÖдæÔÚÒ»¸ö¸¨ÖúË÷Òý (first_name,age)£¬ÄÇôËü¹¹³ÉµÄ B+ Ê÷´óÖ¾ÍÊÇÉÏͼÕâÑù£¬°´ÕÕ
(first_name,age) µÄ×Öĸ˳Ðò¶Ô±íÖеÄÊý¾Ý½øÐÐÅÅÐò£¬µ±²éÕÒµ½Ö÷¼üʱ£¬ÔÙͨ¹ý¾Û¼¯Ë÷Òý»ñÈ¡µ½ÕûÌõÐмǼ¡£

ÉÏͼչʾÁËÒ»¸öʹÓø¨ÖúË÷Òý²éÕÒÒ»Ìõ±í¼Ç¼µÄ¹ý³Ì£ºÍ¨¹ý¸¨ÖúË÷Òý²éÕÒµ½¶ÔÓ¦µÄÖ÷¼ü£¬×îºóÔÚ¾Û¼¯Ë÷ÒýÖÐʹÓÃÖ÷¼ü»ñÈ¡¶ÔÓ¦µÄÐмǼ£¬ÕâÒ²ÊÇͨ³£Çé¿öÏÂÐмǼµÄ²éÕÒ·½Ê½¡£
Ë÷ÒýµÄÉè¼Æ
Ë÷ÒýµÄÉè¼ÆÆäʵÊÇÒ»¸ö·Ç³£ÖØÒªµÄÄÚÈÝ£¬Í¬Ê±Ò²ÊÇÒ»¸ö·Ç³£¸´ÔÓµÄÄÚÈÝ£»Ë÷ÒýµÄÉè¼ÆÓë´´½¨¶ÔÓÚÌáÉýÊý¾Ý¿âµÄ²éѯÐÔÄÜÖÁ¹ØÖØÒª£¬²»¹ýÕâ²»ÊDZ¾ÎÄÏëÒª½éÉܵÄÄÚÈÝ£¬ÓйØË÷ÒýµÄÉè¼ÆÓëÓÅ»¯¿ÉÒÔÔĶÁ
Êý¾Ý¿âË÷ÒýÉè¼ÆÓëÓÅ»¯ Ò»Ê飬ÊéÖÐÌṩÁËÒ»Öַdz£¿ÆÑ§ºÏÀíµÄ·½·¨Äܹ»°ïÖúÎÒÃÇÔÚÊý¾Ý¿âÖн¨Á¢×îÊʺϵÄË÷Òý£¬µ±È»×÷ÕßÒ²¿ÉÄÜ»áÔÚÖ®ºóµÄÎÄÕÂÖжÔË÷ÒýµÄÉè¼Æ½øÐмòµ¥µÄ½éÉܺͷÖÎö¡£
Ëø
ÎÒÃǶ¼ÖªµÀËøµÄÖÖÀàÒ»°ã·ÖΪÀÖ¹ÛËøºÍ±¯¹ÛËøÁ½ÖÖ£¬InnoDB ´æ´¢ÒýÇæÖÐʹÓõľÍÊDZ¯¹ÛËø£¬¶ø°´ÕÕËøµÄÁ£¶È»®·Ö£¬Ò²¿ÉÒÔ·Ö³ÉÐÐËøºÍ±íËø¡£
²¢·¢¿ØÖÆ»úÖÆ
ÀÖ¹ÛËøºÍ±¯¹ÛËøÆäʵ¶¼ÊDz¢·¢¿ØÖƵĻúÖÆ£¬Í¬Ê±ËüÃÇÔÚÔÀíÉϾÍÓÐ×ű¾ÖʵIJî±ð£»
ÀÖ¹ÛËøÊÇÒ»ÖÖ˼Ï룬ËüÆäʵ²¢²»ÊÇÒ»ÖÖÕæÕýµÄ¡ºËø¡»£¬Ëü»áÏȳ¢ÊÔ¶Ô×ÊÔ´½øÐÐÐ޸ģ¬ÔÚд»ØÊ±ÅжÏ×ÊÔ´ÊÇ·ñ½øÐÐÁ˸ı䣬Èç¹ûûÓз¢Éú¸Ä±ä¾Í»áд»Ø£¬·ñÔò¾Í»á½øÐÐÖØÊÔ£¬ÔÚÕû¸öµÄÖ´Ðйý³ÌÖÐÆäʵ¶¼Ã»ÓжÔÊý¾Ý¿â½øÐмÓËø£»
±¯¹ÛËø¾ÍÊÇÒ»ÖÖÕæÕýµÄËøÁË£¬Ëü»áÔÚ»ñÈ¡×ÊԴǰ¶Ô×ÊÔ´½øÐмÓËø£¬È·±£Í¬Ò»Ê±¿ÌÖ»ÓÐÓÐÏÞµÄÏß³ÌÄܹ»·ÃÎʸÃ×ÊÔ´£¬ÆäËûÏëÒª³¢ÊÔ»ñÈ¡×ÊÔ´µÄ²Ù×÷¶¼»á½øÈëµÈ´ý״̬£¬Ö±µ½¸ÃÏß³ÌÍê³ÉÁ˶Ô×ÊÔ´µÄ²Ù×÷²¢ÇÒÊÍ·ÅÁËËøºó£¬ÆäËûÏ̲߳ÅÄÜÖØÐ²Ù×÷×ÊÔ´£»
ËäÈ»ÀÖ¹ÛËøºÍ±¯¹ÛËøÔÚ±¾ÖÊÉϲ¢²»ÊÇͬһÖÖ¶«Î÷£¬Ò»¸öÊÇÒ»ÖÖ˼Ï룬ÁíÒ»¸öÊÇÒ»ÖÖÕæÕýµÄËø£¬µ«ÊÇËüÃǶ¼ÊÇÒ»ÖÖ²¢·¢¿ØÖÆ»úÖÆ¡£

ÀÖ¹ÛËø²»»á´æÔÚËÀËøµÄÎÊÌ⣬µ«ÊÇÓÉÓÚ¸üкóÑéÖ¤£¬ËùÒÔµ±³åͻƵÂʺÍÖØÊԳɱ¾½Ï¸ßʱ¸üÍÆ¼öʹÓñ¯¹ÛËø£¬¶øÐèÒª·Ç³£¸ßµÄÏìÓ¦ËٶȲ¢ÇÒ²¢·¢Á¿·Ç³£´óµÄʱºòʹÓÃÀÖ¹ÛËø¾ÍÄܽϺõĽâ¾öÎÊÌ⣬ÔÚÕâʱʹÓñ¯¹ÛËø¾Í¿ÉÄܳöÏÖÑÏÖØµÄÐÔÄÜÎÊÌ⣻ÔÚÑ¡Ôñ²¢·¢¿ØÖÆ»úÖÆÊ±£¬ÐèÒª×ۺϿ¼ÂÇÉÏÃæµÄËĸö·½Ã棨³åͻƵÂÊ¡¢ÖØÊԳɱ¾¡¢ÏìÓ¦ËٶȺͲ¢·¢Á¿£©½øÐÐÑ¡Ôñ¡£
ËøµÄÖÖÀà
¶ÔÊý¾ÝµÄ²Ù×÷ÆäʵֻÓÐÁ½ÖÖ£¬Ò²¾ÍÊǶÁºÍд£¬¶øÊý¾Ý¿âÔÚʵÏÖËøÊ±£¬Ò²»á¶ÔÕâÁ½ÖÖ²Ù×÷ʹÓò»Í¬µÄËø£»InnoDB
ʵÏÖÁ˱ê×¼µÄÐм¶Ëø£¬Ò²¾ÍÊǹ²ÏíËø£¨Shared Lock£©ºÍ»¥³âËø£¨Exclusive Lock£©£»¹²ÏíËøºÍ»¥³âËøµÄ×÷ÓÃÆäʵ·Ç³£ºÃÀí½â£º
¹²ÏíËø£¨¶ÁËø£©£ºÔÊÐíÊÂÎñ¶ÔÒ»ÌõÐÐÊý¾Ý½øÐжÁÈ¡£»
»¥³âËø£¨Ð´Ëø£©£ºÔÊÐíÊÂÎñ¶ÔÒ»ÌõÐÐÊý¾Ý½øÐÐɾ³ý»ò¸üУ»
¶øËüÃǵÄÃû×ÖÒ²°µÊ¾×Ÿ÷×ÔµÄÁíÍâÒ»¸öÌØÐÔ£¬¹²ÏíËøÖ®¼äÊǼæÈݵ쬶ø»¥³âËøÓëÆäËûÈÎÒâËø¶¼²»¼æÈÝ£º

ÉÔ΢¶ÔËüÃǵÄʹÓýøÐÐ˼¿¼¾ÍÄÜÏëÃ÷°×ËüÃÇΪʲôҪÕâôÉè¼Æ£¬ÒòΪ¹²ÏíËø´ú±íÁ˶Á²Ù×÷¡¢»¥³âËø´ú±íÁËд²Ù×÷£¬ËùÒÔÎÒÃÇ¿ÉÒÔÔÚÊý¾Ý¿âÖв¢ÐжÁ£¬µ«ÊÇÖ»ÄÜ´®ÐÐд£¬Ö»ÓÐÕâÑù²ÅÄܱ£Ö¤²»»á·¢ÉúÏ߳̾ºÕù£¬ÊµÏÖḬ̈߳²È«¡£
ËøµÄÁ£¶È
ÎÞÂÛÊǹ²ÏíËø»¹ÊÇ»¥³âËøÆäʵ¶¼Ö»ÊǶÔijһ¸öÊý¾ÝÐнøÐмÓËø£¬InnoDB Ö§³Ö¶àÖÖÁ£¶ÈµÄËø£¬Ò²¾ÍÊÇÐÐËøºÍ±íËø£»ÎªÁËÖ§³Ö¶àÁ£¶ÈËø¶¨£¬InnoDB
´æ´¢ÒýÇæÒýÈëÁËÒâÏòËø£¨Intention Lock£©£¬ÒâÏòËø¾ÍÊÇÒ»ÖÖ±í¼¶Ëø¡£
ÓëÉÏÒ»½ÚÖÐÌáµ½µÄÁ½ÖÖËøµÄÖÖÀàÏàËÆµÄÊÇ£¬ÒâÏòËøÒ²·ÖΪÁ½ÖÖ£º
ÒâÏò¹²ÏíËø£ºÊÂÎñÏëÒªÔÚ»ñµÃ±íÖÐijЩ¼Ç¼µÄ¹²ÏíËø£¬ÐèÒªÔÚ±íÉÏÏȼÓÒâÏò¹²ÏíËø£»
ÒâÏò»¥³âËø£ºÊÂÎñÏëÒªÔÚ»ñµÃ±íÖÐijЩ¼Ç¼µÄ»¥³âËø£¬ÐèÒªÔÚ±íÉÏÏȼÓÒâÏò»¥³âËø£»
Ëæ×ÅÒâÏòËøµÄ¼ÓÈë£¬ËøÀàÐÍÖ®¼äµÄ¼æÈݾØÕóÒ²±äµÃÓú¼Ó¸´ÔÓ£º

ÒâÏòËøÆäʵ²»»á×èÈûÈ«±íɨÃèÖ®ÍâµÄÈκÎÇëÇó£¬ËüÃǵÄÖ÷ҪĿµÄÊÇΪÁ˱íʾÊÇ·ñÓÐÈËÇëÇóËø¶¨±íÖеÄijһÐÐÊý¾Ý¡£
ÓеÄÈË¿ÉÄÜ»á¶ÔÒâÏòËøµÄÄ¿µÄ²¢²»ÊÇÍêÈ«µÄÀí½â£¬ÎÒÃÇÔÚÕâÀï¿ÉÒÔ¾ÙÒ»¸öÀý×Ó£ºÈç¹ûûÓÐÒâÏòËø£¬µ±ÒѾÓÐÈËʹÓÃÐÐËø¶Ô±íÖеÄijһÐнøÐÐÐÞ¸Äʱ£¬Èç¹ûÁíÍâÒ»¸öÇëÇóÒª¶ÔÈ«±í½øÐÐÐ޸ģ¬ÄÇô¾ÍÐèÒª¶ÔËùÓеÄÐÐÊÇ·ñ±»Ëø¶¨½øÐÐɨÃ裬ÔÚÕâÖÖÇé¿öÏ£¬Ð§ÂÊÊǷdz£µÍµÄ£»²»¹ý£¬ÔÚÒýÈëÒâÏòËøÖ®ºó£¬µ±ÓÐÈËʹÓÃÐÐËø¶Ô±íÖеÄijһÐнøÐÐÐÞ¸Ä֮ǰ£¬»áÏÈΪ±íÌí¼ÓÒâÏò»¥³âËø£¨IX£©£¬ÔÙΪÐмǼÌí¼Ó»¥³âËø£¨X£©£¬ÔÚÕâʱÈç¹ûÓÐÈ˳¢ÊÔ¶ÔÈ«±í½øÐÐÐ޸ľͲ»ÐèÒªÅжϱíÖеÄÿһÐÐÊý¾ÝÊÇ·ñ±»¼ÓËøÁË£¬Ö»ÐèҪͨ¹ýµÈ´ýÒâÏò»¥³âËø±»ÊͷžͿÉÒÔÁË¡£
ËøµÄËã·¨
µ½Ä¿Ç°ÎªÖ¹ÒѾ¶Ô InnoDB ÖÐËøµÄÁ£¶ÈÓÐÒ»¶¨µÄÁ˽⣬ҲÇå³þÁËÔÚ¶ÔÊý¾Ý¿â½øÐжÁдʱ»á»ñÈ¡²»Í¬µÄËø£¬ÔÚÕâһС½Ú½«½éÉÜËøÊÇÈçºÎÌí¼Óµ½¶ÔÓ¦µÄÊý¾ÝÐÐÉϵģ¬ÎÒÃÇ»á·Ö±ð½éÉÜÈýÖÖËøµÄËã·¨£ºRecord
Lock¡¢Gap Lock ºÍ Next-Key Lock¡£
Record Lock
¼ÇÂ¼Ëø£¨Record Lock£©ÊǼӵ½Ë÷Òý¼Ç¼ÉϵÄËø£¬¼ÙÉèÎÒÃÇ´æÔÚÏÂÃæµÄÒ»Õűí users£º
CREATE TABLE
users(
id INT NOT NULL AUTO_INCREMENT, last_name VARCHAR(255) NOT NULL, first_name VARCHAR(255), age INT, PRIMARY KEY(id), KEY(last_name), KEY(age)); |
Èç¹ûÎÒÃÇʹÓà id »òÕß last_name ×÷Ϊ SQL ÖÐ WHERE Óï¾äµÄ¹ýÂËÌõ¼þ£¬ÄÇô
InnoDB ¾Í¿ÉÒÔͨ¹ýË÷Òý½¨Á¢µÄ B+ Ê÷ÕÒµ½ÐмǼ²¢Ìí¼ÓË÷Òý£¬µ«ÊÇÈç¹ûʹÓà first_name
×÷Ϊ¹ýÂËÌõ¼þʱ£¬ÓÉÓÚ InnoDB ²»ÖªµÀ´ýÐ޸ĵļǼ¾ßÌå´æ·ÅµÄλÖã¬Ò²ÎÞ·¨¶Ô½«ÒªÐÞ¸ÄÄÄÌõ¼Ç¼Ìáǰ×ö³öÅжϾͻáËø¶¨Õû¸ö±í¡£
Gap Lock
¼ÇÂ¼ËøÊÇÔÚ´æ´¢ÒýÇæÖÐ×îΪ³£¼ûµÄËø£¬³ýÁ˼ÇÂ¼ËøÖ®Í⣬InnoDB Öл¹´æÔÚ¼äÏ¶Ëø£¨Gap Lock£©£¬¼äÏ¶ËøÊǶÔË÷Òý¼Ç¼ÖеÄÒ»¶ÎÁ¬ÐøÇøÓòµÄËø£»µ±Ê¹ÓÃÀàËÆ
SELECT*FROM users WHERE id BETWEEN10AND20FOR UPDATE;µÄ
SQL Óï¾äʱ£¬¾Í»á×èÖ¹ÆäËûÊÂÎñÏò±íÖвåÈë id=15 µÄ¼Ç¼£¬ÒòΪÕû¸ö·¶Î§¶¼±»¼äÏ¶ËøËø¶¨ÁË¡£
¼äÏ¶ËøÊÇ´æ´¢ÒýÇæ¶ÔÓÚÐÔÄܺͲ¢·¢×ö³öµÄȨºâ£¬²¢ÇÒÖ»ÓÃÓÚijЩÊÂÎñ¸ôÀë¼¶±ð¡£
ËäÈ»¼äÏ¶ËøÖÐÒ²·ÖΪ¹²ÏíËøºÍ»¥³âËø£¬²»¹ýËüÃÇÖ®¼ä²¢²»ÊÇ»¥³âµÄ£¬Ò²¾ÍÊDz»Í¬µÄÊÂÎñ¿ÉÒÔͬʱ³ÖÓÐÒ»¶ÎÏàͬ·¶Î§µÄ¹²ÏíËøºÍ»¥³âËø£¬ËüΨһ×èÖ¹µÄ¾ÍÊÇÆäËûÊÂÎñÏòÕâ¸ö·¶Î§ÖÐÌí¼ÓеļǼ¡£
Next-Key Lock
Next-Key ËøÏà±ÈǰÁ½Õß¾ÍÉÔ΢ÓÐһЩ¸´ÔÓ£¬ËüÊǼÇÂ¼ËøºÍ¼Ç¼ǰµÄ¼äÏ¶ËøµÄ½áºÏ£¬ÔÚ users
±íÖÐÓÐÒÔϼǼ£º
-----+-------------+--------------+-------+
| id | last_name | first_name | age ||------+-------------+--------------+-------|| 4 | stark | tony | 21 || 1 | tom | hiddleston | 30 || 3 | morgan | freeman | 40 || 5 | jeff | dean | 50 || 2 | donald | trump | 80 |+------+-------------+--------------+-------+
|
Èç¹ûʹÓà Next-Key Ëø£¬ÄÇô Next-Key Ëø¾Í¿ÉÒÔÔÚÐèÒªµÄʱºòËø¶¨ÒÔϵķ¶Î§£º
, 21]
(21, 30](30, 40](40, 50](50, 80] |
¼ÈÈ»½Ð Next-Key Ëø£¬Ëø¶¨µÄÓ¦¸ÃÊǵ±Ç°ÖµºÍºóÃæµÄ·¶Î§£¬µ«ÊÇʵ¼ÊÉÏÈ´²»ÊÇ£¬Next-Key
ËøËø¶¨µÄÊǵ±Ç°ÖµºÍÇ°ÃæµÄ·¶Î§¡£
µ±ÎÒÃǸüÐÂÒ»Ìõ¼Ç¼£¬±ÈÈç SELECT*FROM users WHERE age=30FOR UPDATE;£¬InnoDB
²»½ö»áÔÚ·¶Î§ (21,30] ÉÏ¼Ó Next-Key Ëø£¬»¹»áÔÚÕâÌõ¼Ç¼ºóÃæµÄ·¶Î§ (30,40]
¼Ó¼äÏ¶Ëø£¬ËùÒÔ²åÈë (21,40]·¶Î§ÄڵļǼ¶¼»á±»Ëø¶¨¡£
Next-Key ËøµÄ×÷ÓÃÆäʵÊÇΪÁ˽â¾ö»Ã¶ÁµÄÎÊÌ⣬ÎÒÃÇ»áÔÚÏÂÒ»½Ú̸ÊÂÎñµÄʱºò¾ßÌå½éÉÜ¡£
ËÀËøµÄ·¢Éú
¼ÈÈ» InnoDB ÖÐʵÏÖµÄËøÊDZ¯¹ÛµÄ£¬ÄÇô²»Í¬ÊÂÎñÖ®¼ä¾Í¿ÉÄܻụÏàµÈ´ý¶Ô·½ÊÍ·ÅËøÔì³ÉËÀËø£¬×îÖÕµ¼ÖÂÊÂÎñ·¢Éú´íÎó£»ÏëÒªÔÚ
MySQL ÖÐÖÆÔìËÀËøµÄÎÊÌâÆäʵ·Ç³£ÈÝÒ×£º

Á½¸ö»á»°¶¼³ÖÓÐÒ»¸öËø£¬²¢ÇÒ³¢ÊÔ»ñÈ¡¶Ô·½µÄËøÊ±¾Í»á·¢ÉúËÀËø£¬²»¹ý MySQL Ò²ÄÜÔÚ·¢ÉúËÀËøÊ±¼°Ê±·¢ÏÖÎÊÌ⣬²¢±£Ö¤ÆäÖеÄÒ»¸öÊÂÎñÄܹ»Õý³£¹¤×÷£¬Õâ¶ÔÎÒÃÇÀ´ËµÒ²ÊÇÒ»¸öºÃÏûÏ¢¡£
ÊÂÎñÓë¸ôÀë¼¶±ð
ÔÚ½éÉÜÁËËøÖ®ºó£¬ÎÒÃÇÔÙÀ´Ì¸Ì¸Êý¾Ý¿âÖÐÒ»¸ö·Ç³£ÖØÒªµÄ¸ÅÄî ¡ª¡ª ÊÂÎñ£»ÏàÐÅÖ»ÒªÊÇÒ»¸öºÏ¸ñµÄÈí¼þ¹¤³Ìʦ¾Í¶ÔÊÂÎñµÄÌØÐÔÓÐËùÁ˽⣬ÆäÖб»È˾³£ÌáÆðµÄ¾ÍÊÇÊÂÎñµÄÔ×ÓÐÔ£¬ÔÚÊý¾ÝÌá½»¹¤×÷ʱ£¬ÒªÃ´±£Ö¤ËùÓеÄÐ޸ͼÄܹ»Ìá½»£¬ÒªÃ´¾ÍËùÓеÄÐÞ¸ÄÈ«²¿»Ø¹ö¡£
µ«ÊÇÊÂÎñ»¹×ñѰüÀ¨Ô×ÓÐÔÔÚÄÚµÄ ACID ËÄ´óÌØÐÔ£ºÔ×ÓÐÔ£¨Atomicity£©¡¢Ò»ÖÂÐÔ£¨Consistency£©¡¢¸ôÀëÐÔ£¨Isolation£©ºÍ³Ö¾ÃÐÔ£¨Durability£©£»ÎÄÕ²»»á¶ÔÕâËÄ´óÌØÐÔÈ«²¿Õ¹¿ª½øÐнéÉÜ£¬ÏàÐÅÄãÄܹ»Í¨¹ý
Google ºÍÊý¾Ý¿âÏà¹ØµÄÊé¼®ÇáËÉ»ñµÃÓйØËüÃǵĸÅÄ±¾ÎÄ×îºóÒª½éÉܵľÍÊÇÊÂÎñµÄËÄÖÖ¸ôÀë¼¶±ð¡£
¼¸ÖÖ¸ôÀë¼¶±ð
ÊÂÎñµÄ¸ôÀëÐÔÊÇÊý¾Ý¿â´¦ÀíÊý¾ÝµÄ¼¸´ó»ù´¡Ö®Ò»£¬¶ø¸ôÀë¼¶±ðÆäʵ¾ÍÊÇÌṩ¸øÓû§ÓÃÓÚÔÚÐÔÄܺͿɿ¿ÐÔ×ö³öÑ¡ÔñºÍȨºâµÄÅäÖÃÏî¡£
ISO ºÍ ANIS SQL ±ê×¼ÖÆ¶¨ÁËËÄÖÖÊÂÎñ¸ôÀë¼¶±ð£¬¶ø InnoDB ×ñÑÁË SQL:1992
±ê×¼ÖеÄËÄÖÖ¸ôÀë¼¶±ð£º READ UNCOMMITED¡¢ READ COMMITED¡¢ REPEATABLE
READºÍ SERIALIZABLE£»Ã¿¸öÊÂÎñµÄ¸ôÀë¼¶±ðÆäʵ¶¼±ÈÉÏÒ»¼¶¶à½â¾öÁËÒ»¸öÎÊÌ⣺
RAED UNCOMMITED£ºÊ¹ÓòéѯÓï¾ä²»»á¼ÓËø£¬¿ÉÄÜ»á¶Áµ½Î´Ìá½»µÄÐУ¨Dirty Read£©£»
READ COMMITED£ºÖ»¶Ô¼Ç¼¼Ó¼ÇÂ¼Ëø£¬¶ø²»»áÔڼǼ֮¼ä¼Ó¼äÏ¶Ëø£¬ËùÒÔÔÊÐíеļǼ²åÈëµ½±»Ëø¶¨¼Ç¼µÄ¸½½ü£¬ËùÒÔÔÙ¶à´ÎʹÓòéѯÓï¾äʱ£¬¿ÉÄܵõ½²»Í¬µÄ½á¹û£¨Non-Repeatable
Read£©£»
REPEATABLE READ£º¶à´Î¶Áȡͬһ·¶Î§µÄÊý¾Ý»á·µ»ØµÚÒ»´Î²éѯµÄ¿ìÕÕ£¬²»»á·µ»Ø²»Í¬µÄÊý¾ÝÐУ¬µ«ÊÇ¿ÉÄÜ·¢Éú»Ã¶Á£¨Phantom
Read£©£»
SERIALIZABLE£ºInnoDB ÒþʽµØ½«È«²¿µÄ²éѯÓï¾ä¼ÓÉϹ²ÏíËø£¬½â¾öÁ˻öÁµÄÎÊÌ⣻
MySQL ÖÐĬÈϵÄÊÂÎñ¸ôÀë¼¶±ð¾ÍÊÇ REPEATABLE READ£¬µ«ÊÇËüͨ¹ý Next-Key
ËøÒ²Äܹ»ÔÚijÖ̶ֳÈÉϽâ¾ö»Ã¶ÁµÄÎÊÌâ¡£

½ÓÏÂÀ´£¬ÎÒÃǽ«Êý¾Ý¿âÖд´½¨ÈçÏÂµÄ±í²¢Í¨¹ý¸öÀý×ÓÀ´Õ¹Ê¾ÔÚ²»Í¬µÄÊÂÎñ¸ôÀë¼¶±ð֮ϣ¬»á·¢ÉúʲôÑùµÄÎÊÌ⣺
CREATE TABLE
test(
id INT NOT NULL, UNIQUE(id)); |
Ôà¶Á
µ±ÊÂÎñµÄ¸ôÀë¼¶±ðΪ READ UNCOMMITED ʱ£¬ÎÒÃÇÔÚ SESSION2 ÖвåÈëµÄδÌá½»Êý¾ÝÔÚ
SESSION1 ÖÐÊÇ¿ÉÒÔ·ÃÎʵġ£

²»¿ÉÖØ¸´¶Á
µ±ÊÂÎñµÄ¸ôÀë¼¶±ðΪ READ COMMITED ʱ£¬ËäÈ»½â¾öÁËÔà¶ÁµÄÎÊÌ⣬µ«ÊÇÈç¹ûÔÚ SESSION1
ÏȲéѯÁËÒ»¸ö·¶Î§µÄÊý¾Ý£¬ÔÚÕâÖ®ºó SESSION2 ÖвåÈëÒ»ÌõÊý¾Ý²¢ÇÒÌá½»ÁËÐ޸ģ¬ÔÚÕâʱ£¬Èç¹û SESSION1
ÖÐÔÙ´ÎʹÓÃÏàͬµÄ²éѯÓï¾ä£¬¾Í»á·¢ÏÖÁ½´Î²éѯµÄ½á¹û²»Ò»Ñù¡£

²»¿ÉÖØ¸´¶ÁµÄÔÒò¾ÍÊÇ£¬ÔÚ READ COMMITED µÄ¸ôÀë¼¶±ðÏ£¬´æ´¢ÒýÇæ²»»áÔÚ²éѯ¼Ç¼ʱÌí¼Ó¼äÏ¶Ëø£¬Ëø¶¨
id<5 Õâ¸ö·¶Î§¡£
»Ã¶Á
ÖØÐ¿ªÆôÁËÁ½¸ö»á»° SESSION1 ºÍ SESSION2£¬ÔÚ SESSION1ÖÐÎÒÃDzéѯȫ±íµÄÐÅÏ¢£¬Ã»Óеõ½ÈκμǼ£»ÔÚ
SESSION2ÖÐÏò±íÖвåÈëÒ»ÌõÊý¾Ý²¢Ìá½»£»ÓÉÓÚ REPEATABLE READ µÄÔÒò£¬Ôٴβéѯȫ±íµÄÊý¾Ýʱ£¬ÎÒÃÇ»ñµÃµ½µÄÈÔÈ»Êǿռ¯£¬µ«ÊÇÔÚÏò±íÖвåÈëͬÑùµÄÊý¾ÝÈ´³öÏÖÁË´íÎó¡£

ÕâÖÖÏÖÏóÔÚÊý¾Ý¿âÖоͱ»³Æ×÷»Ã¶Á£¬ËäÈ»ÎÒÃÇʹÓòéѯÓï¾äµÃµ½ÁËÒ»¸ö¿ÕµÄ¼¯ºÏ£¬µ«ÊDzåÈëÊý¾ÝʱȴµÃµ½ÁË´íÎ󣬺ÃÏñ֮ǰµÄ²éѯÊǻþõÒ»Ñù¡£
ÔÚ±ê×¼µÄÊÂÎñ¸ôÀë¼¶±ðÖУ¬»Ã¶ÁÊÇÓɸü¸ßµÄ¸ôÀë¼¶±ð SERIALIZABLE ½â¾öµÄ£¬µ«ÊÇËüÒ²¿ÉÒÔͨ¹ý
MySQL ÌṩµÄ Next-Key Ëø½â¾ö£º

REPERATABLE READ ºÍ READ UNCOMMITED ÆäʵÊÇì¶ÜµÄ£¬Èç¹û±£Ö¤ÁËǰÕ߾Ϳ´²»µ½ÒѾÌá½»µÄÊÂÎñ£¬Èç¹û±£Ö¤Á˺óÕߣ¬¾Í»áµ¼ÖÂÁ½´Î²éѯµÄ½á¹û²»Í¬£¬MySQL
ΪÎÒÃÇÌṩÁËÒ»ÖÖÕÛÖеķ½Ê½£¬Äܹ»ÔÚ REPERATABLE READ ģʽϼÓËø·ÃÎÊÒѾÌá½»µÄÊý¾Ý£¬Æä±¾Éí²¢²»Äܽâ¾ö»Ã¶ÁµÄÎÊÌ⣬¶øÊÇͨ¹ýÎÄÕÂÇ°ÃæÌáµ½µÄ
Next-Key ËøÀ´½â¾ö¡£
|