Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
һƪÎÄÕ´øÄã¶Á¶® MySQL ºÍ InnoDB
 
  2532  次浏览      27
 2019-8-15
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ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 ËøÀ´½â¾ö¡£

 

   
2532 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ