Postgres̽Ë÷֮·

×÷Õß: Ronny 2017-11-08 13:05:07
µ¼¶Á ÔÚ Citus ¹«Ë¾£¬ÎªÈÃÊÂÇé×öµÄ¸üºÃ£¬ÎÒÃÇÓë¿Í»§Ò»ÆðÔÚÊý¾Ý½¨Ä£¡¢ÓÅ»¯²éѯ¡¢ºÍÔö¼Ó Ë÷ÒýÉÏ»¨·ÑÁËÐí¶àʱ¼ä¡£ÎÒµÄÄ¿±êÊÇΪ¿Í»§µÄÐèÇóÌṩ¸üºÃµÄ·þÎñ£¬´Ó¶ø´´Ôì³É¹¦¡£ÎÒÃÇËù×öµÄÆäÖÐÒ»²¿·Ö¹¤×÷ÊdzÖÐøΪÄãµÄ Citus ¼¯Èº±£³ÖÁ¼ºÃµÄÓÅ»¯ºÍ ¸ßÐÔÄÜ£»ÁíÍâÒ»²¿·ÖÊÇ°ïÄãÁ˽â¹ØÓÚ Postgres ºÍ Citus ÄãËùÐèÒªÖªµÀµÄÒ»ÇС£±Ï¾¹£¬Ò»¸ö½¡¿µºÍ¸ßÐÔÄܵÄÊý¾Ý¿âÒâζ×Å app Ö´Ðеĸü¿ì£¬²¢ÇÒË­²»Ô¸ÒâÕâÑùÄØ£¿ ½ñÌ죬ÎÒÃǼò»¯Ò»Ð©ÄÚÈÝ£¬Óë¿Í»§·ÖÏíһЩ¹ØÓÚ Postgres Ë÷ÒýµÄÐÅÏ¢¡£
Postgres Óм¸ÖÖË÷ÒýÀàÐÍ£¬ ²¢ÇÒÿ¸öа汾¶¼ËƺõÔö¼ÓһЩеÄË÷ÒýÀàÐÍ¡£Ã¿¸öË÷ÒýÀàÐͶ¼ÊÇÓÐÓõģ¬µ«ÊǾßÌåʹÓÃÄÄÖÖÀàÐÍÈ¡¾öÓÚ£¨1£©Êý¾ÝÀàÐÍ£¬ÓÐʱÊÇ£¨2£©±íÖеĵײãÊý¾ÝºÍ£¨3£©Ö´ÐеIJéÕÒÀàÐÍ¡£½ÓÏÂÀ´µÄÄÚÈÝÎÒÃǽ«½éÉÜÔÚ Postgres ÖÐÄã¿ÉÒÔʹÓõÄË÷ÒýÀàÐÍ£¬ÒÔ¼°ÄãºÎʱ¸ÃʹÓúÎÖÖË÷ÒýÀàÐÍ¡£ÔÚ¿ªÊ¼Ö®Ç°£¬ÕâÀïÓÐÒ»¸öÎÒÃǽ«´øÄãÇ×ÀúµÄË÷ÒýÀàÐÍÁÐ±í£º

B-Tree
µ¹ÅÅË÷ÒýGeneralized Inverted Index (GIN)
µ¹ÅÅËÑË÷Ê÷Generalized Inverted Seach Tree (GiST)
¿Õ¼ä·ÖÇøµÄSpace partitioned GiST (SP-GiST)
¿é·¶Î§Ë÷ÒýBlock Range Index (BRIN)
Hash
ÏÖÔÚ¿ªÊ¼½éÉÜË÷Òý¡£

ÔÚ Postgres ÖУ¬B-Tree Ë÷ÒýÊÇÄãʹÓõÄ×îÆÕ±éµÄË÷Òý
Èç¹ûÄãÓÐÒ»¸ö¼ÆËã»ú¿ÆѧµÄѧ룬ÄÇô B-Tree Ë÷Òý¿ÉÄÜÊÇÄãѧ»áµÄµÚÒ»¸öË÷Òý¡£B-tree Ë÷Òý »á´´½¨Ò»¸öʼÖÕ±£³Ö×ÔÉíƽºâµÄÒ»¿ÃÊ÷¡£µ±Ëü¸ù¾ÝË÷ÒýÈ¥²éÕÒij¸ö¶«Î÷ʱ£¬Ëü»á±éÀúÕâ¿ÃÊ÷È¥ÕÒµ½¼ü£¬È»ºó·µ»ØÄãÒª²éÕÒµÄÊý¾Ý¡£Ê¹ÓÃË÷ÒýÊÇ´ó´ó¿ìÓÚ˳ÐòɨÃèµÄ£¬ÒòΪÏà¶ÔÓÚ˳ÐòɨÃè³ÉǧÉÏÍòµÄ¼Ç¼£¬Ëü¿ÉÒÔ½öÐèÒª¶Á¼¸¸ö Ò³ (µ±Äã½ö·µ»Ø¼¸¸ö¼Ç¼ʱ)¡£

Èç¹ûÄãÔËÐÐÒ»¸ö±ê×¼µÄ CREATE INDEX Óï¾ä£¬Ëü½«ÎªÄã´´½¨Ò»¸ö B-tree Ë÷Òý¡£ B-tree Ë÷ÒýÔÚ´ó¶àÊýµÄÊý¾ÝÀàÐÍÉÏÊǺÜÓмÛÖµµÄ£¬±ÈÈçÎı¾¡¢Êý×ÖºÍʱ¼ä´Á¡£Èç¹ûÄã¸Õ¿ªÊ¼ÔÚÄãµÄÊý¾Ý¿âÖÐʹÓÃË÷Òý£¬²¢ÇÒ²»ÔÚÄãµÄÊý¾Ý¿âÉÏʹÓÃÌ«¶àµÄ Postgres µÄ¸ß¼¶ÌØÐÔ£¬Ê¹Óñê×¼µÄ B-Tree Ë÷Òý¿ÉÄÜÊÇÄã×îºÃµÄÑ¡Ôñ¡£

GIN Ë÷Òý£¬ÓÃÓÚ¶àÖµÁÐ
µ¹ÅÅË÷ÒýGeneralized Inverted Index£¬Ò»°ã³ÆΪ GIN£¬´ó¶àÊÊÓÃÓÚµ±µ¥¸öÁÐÖаüº¬¶à¸öÖµµÄÊý¾ÝÀàÐÍ¡£

¾Ý Postgres Îĵµ£º

¡°GIN Éè¼ÆÓÃÓÚ´¦Àí±»Ë÷ÒýµÄÌõÄ¿ÊǸ´ºÏÖµµÄÇé¿ö£¬²¢ÇÒÓÉË÷Òý´¦ÀíµÄ²éѯÐèÒªËÑË÷ÔÚ¸´ºÏÌõÄ¿ÖгöÏÖµÄÖµ¡£ÀýÈ磬Õâ¸öÌõÄ¿¿ÉÄÜÊÇÎĵµ£¬²éѯ¿ÉÒÔËÑË÷ÎĵµÖаüº¬µÄÖ¸¶¨×Ö·û¡£¡±

°üº¬ÔÚÕâ¸ö·¶Î§ÄÚµÄ×î³£¼ûµÄÊý¾ÝÀàÐÍÓУº

hStore
Array
Range
JSONB
¹ØÓÚ GIN Ë÷ÒýÖÐ×îÈÃÈËÂúÒâµÄÒ»¼þÊÂÊÇ£¬ËüÃÇÄܹ»Àí½â´æ´¢ÔÚ¸´ºÏÖµÖеÄÊý¾Ý¡£µ«ÊÇ£¬ÒòΪһ¸ö GIN Ë÷ÒýÐèÒªÓÐÿ¸ö±»Ìí¼ÓµÄµ¥¶ÀÀàÐ͵ÄÊý¾Ý½á¹¹µÄÌض¨ÖªÊ¶£¬Òò´Ë£¬GIN Ë÷Òý²¢²»ÊÇÖ§³ÖËùÓеÄÊý¾ÝÀàÐÍ¡£

GiST Ë÷Òý£¬ ÓÃÓÚÓÐÖصþÖµµÄÐÐ
µ¹ÅÅËÑË÷Ê÷Generalized Inverted Seach Tree£¨GiST£©Ë÷Òý¶àÊÊÓÃÓÚµ±ÄãµÄÊý¾ÝÓëͬһÁеÄÆäËüÐÐÊý¾ÝÖصþʱ¡£GiST Ë÷Òý×îºÃµÄÓô¦ÊÇ£ºÈç¹ûÄãÉùÃ÷Ò»¸ö¼¸ºÎÊý¾ÝÀàÐÍ£¬²¢ÇÒÄãÏ£ÍûÖªµÀÁ½¸ö¶à±ßÐÍÊÇ·ñ°üº¬Ò»Ð©µãʱ¡£ÔÚÒ»ÖÖÇé¿öÖÐÒ»¸öÌض¨µÄµã¿ÉÄܱ»°üº¬ÔÚÒ»¸öºÐ×ÓÖУ¬¶øÓë´Ëͬʱ£¬ÆäËüµÄµã½ö´æÔÚÓÚÒ»¸ö¶à±ßÐÎÖС£Ê¹Óà GiST Ë÷ÒýµÄ³£¼ûÊý¾ÝÀàÐÍÓУº

¼¸ºÎÀàÐÍ
ÐèÒª½øÐÐÈ«ÎÄËÑË÷µÄÎı¾ÀàÐÍ
GiST Ë÷ÒýÔÚ´óСÉÏÓкܶàµÄ¹Ì¶¨ÏÞÖÆ£¬·ñÔò£¬GiST Ë÷Òý¿ÉÄÜ»á±äµÄÌرð´ó¡£×÷ΪÆä´ú¼Û£¬GiST Ë÷ÒýÊÇÓÐËðµÄ£¨²»¾«È·µÄ£©¡£

¾Ý¹Ù·½Îĵµ£º

¡°GiST Ë÷ÒýÊÇÓÐËðµÄ£¬ÕâÒâζ×ÅË÷Òý¿ÉÄܲúÉúÐé¼ÙÆ¥Å䣬ËùÒÔÐèҪȥ¼ì²éÕæʵµÄ±íÐÐÈ¥Ïû³ýÐé¼ÙÆ¥Åä¡£ (µ±ÐèҪʱ PostgreSQL »á×Ô¶¯Ö´ÐÐÕâ¸ö¶¯×÷)¡±

Õâ²¢²»Òâζ×ÅÄã»áµÃµ½Ò»¸ö´íÎó½á¹û£¬ËüÖ»ÊÇ˵Ã÷ÁËÔÚ Postgres ¸øÄã·µ»ØÊý¾Ý֮ǰ£¬»á×öÁËÒ»¸öºÜСµÄ¶îÍ⹤×÷À´¹ýÂËÕâЩÐé¼Ù½á¹û¡£

ÌرðÌáʾ£ºÍ¬Ò»¸öÊý¾ÝÀàÐÍÉÏ GIN ºÍ GiST Ë÷ÒýÍùÍù¶¼¿ÉÒÔʹÓá£Í¨³£Ò»¸öÓкܺõÄÐÔÄܱíÏÖ£¬µ«»áÕ¼ÓúܴóµÄ´ÅÅ̿ռ䣬·´Ö®ÒàÈ»¡£Ëµµ½ GIN Óë GiST µÄ±È½Ï£¬²¢Ã»ÓÐij¸öÍêÃÀµÄ·½°¸¿ÉÒÔÊÊÓÃËùÓÐÇé¿ö£¬µ«ÊÇ£¬ÒÔÉϹæÔòÓ¦ÓÃÓڴ󲿷ֳ£¼ûÇé¿ö¡£

SP-GiST Ë÷Òý£¬ÓÃÓÚ¸ü´óµÄÊý¾Ý
¿Õ¼ä·ÖÇø GiST £¨SP-GiST£©Ë÷Òý²ÉÓÃÀ´×Ô Purdue Ñо¿µÄ¿Õ¼ä·ÖÇøÊ÷¡£ SP-GiST Ë÷Òý¾­³£ÓÃÓÚµ±ÄãµÄÊý¾ÝÓÐÒ»¸öÌìÈ»µÄ¾Û¼¯ÒòËØ£¬²¢ÇÒ²»ÊÇÒ»¸öƽºâÊ÷µÄʱºò¡£ µç»°ºÅÂëÊÇÒ»¸ö·Ç³£ºÃµÄÀý×Ó (ÖÁÉÙ US µÄµç»°ºÅÂëÊÇ)¡£ ËüÃÇÓÐÈçϵĸñʽ£º

3 λÊý×ÖµÄÇøÓòºÅ
3 λÊý×ÖµÄǰ׺ºÅ (ÓëÒÔÇ°µÄµç»°½»»»»úÓйØ)
4 λµÄÏß·ºÅ
ÕâÒâζ×ŵÚÒ»×éÇ°Èýλ´¦ÓÐÒ»¸öÌìÈ»µÄ¾Û¼¯ÒòËØ£¬½Ó×ÅÊǵڶþ×éÈýλ£¬È»ºóµÄÊý×Ö²ÅÊÇÒ»¸ö¾ùÔȵķֲ¼¡£µ«ÊÇ£¬Ôڵ绰ºÅÂëµÄһЩÇøÓòºÅÖУ¬´æÔÚÒ»¸ö±ÈÆäËüÇøÓòºÅ¸ü¸ßµÄ±¥ºÏ״̬¡£½á¹û¿ÉÄܵ¼ÖÂÊ÷·Ç³£µÄ²»Æ½ºâ¡£ÒòΪǰÃæÓÐÒ»¸öÌìÈ»µÄ¾Û¼¯ÒòËØ£¬²¢ÇÒÊý¾Ý²»¶ÔµÈ·Ö²¼£¬Ïñµç»°ºÅÂëÒ»ÑùµÄÊý¾Ý¿ÉÄÜ»áÊÇ SP-GiST µÄÒ»¸öºÜºÃµÄ°¸Àý¡£

BRIN Ë÷Òý£¬ ÓÃÓÚ¸ü´óµÄÊý¾Ý
¿é·¶Î§Ë÷Òý£¨BRIN£©×¨×¢ÓÚһЩÀàËÆ SP-GiST µÄÇéÐΣ¬ËüÃÇ×îºÃÓÃÔÚµ±Êý¾ÝÓÐһЩ×ÔÈ»ÅÅÐò£¬²¢ÇÒÍùÍùÊý¾ÝÁ¿ºÜ´óʱ¡£Èç¹ûÓÐÒ»¸öÒÔʱ¼äΪÐòµÄ 10 ÒÚÌõµÄ¼Ç¼£¬BRIN Ò²Ðí¾ÍÄÜÅÉÉÏÓó¡¡£Èç¹ûÄãÕýÔÚ²éѯһ×éºÜ´óµÄÓÐ×ÔÈ»·Ö×éµÄÊý¾Ý£¬ÈçÓм¸¸öÓʱàµÄÊý¾Ý£¬BRIN ÄÜ°ïÄãÈ·±£Ïà½üµÄÓʱà´æ´¢ÔÚ´ÅÅÌÉÏÏà½üµÄµØ·½¡£

µ±ÄãÓÐÒ»¸ö·Ç³£´óµÄ±ÈÈçÒÔÈÕÆÚ»òÓʱàÅÅÐòµÄÊý¾Ý¿â£¬ BRIN Ë÷Òý¿ÉÒÔÈÃÄã·Ç³£¿ìµÄÌø¹ý»òÅųýһЩ²»ÐèÒªµÄÊý¾Ý¡£´ËÍ⣬ÓëÕûÌåÊý¾ÝÁ¿´óСÏà±È£¬BRIN Ë÷ÒýÏà¶Ô½ÏС£¬Òò´Ë£¬µ±ÄãÓÐÒ»¸ö´óµÄÊý¾Ý¼¯Ê±£¬BRIN Ë÷Òý¾Í¿ÉÒÔ±íÏÖ³ö½ÏºÃµÄÐÔÄÜ¡£

Hash Ë÷Òý£¬ ×ÜË㲻űÀÀ£ÁË
Hash Ë÷ÒýÔÚ Postgres ÖÐÒѾ­´æÔÚ¶àÄêÁË£¬µ«ÊÇ£¬ÔÚ Postgres 10 ·¢²¼Ö®Ç°£¬¶ÔËüÃǵÄʹÓÃÒ»Ö±Óиö¾Þ´óµÄ¾¯¸æ£¬Ëü²»ÊÇ WAL-logged µÄ¡£ÕâÒâζ×ÅÈç¹ûÄãµÄ·þÎñÆ÷±ÀÀ££¬²¢ÇÒÄãÎÞ·¨Ê¹ÓÃÈç wal-g ¹ÊÕÏתÒƵ½±¸»ú»ò´Ó´æµµÖлָ´£¬ÄÇôÄ㽫¶ªÊ§ÄǸöË÷Òý£¬Ö±µ½ÄãÖؽ¨Ëü¡£ Ëæ×Å Postgres 10 ·¢²¼£¬ËüÃÇÏÖÔÚÊÇ WAL-logged µÄ£¬Òò´Ë£¬Äã¿ÉÒÔÔٴο¼ÂÇʹÓÃËüÃÇ £¬µ«ÊÇ£¬ÕæÕýµÄÎÊÌâÊÇ£¬ÄãÓ¦¸ÃÕâÑù×öÂð?

Hash Ë÷ÒýÓÐʱ»áÌṩ±È B-Tree Ë÷Òý¸ü¿ìµÄ²éÕÒ£¬²¢ÇÒ´´½¨Ò²ºÜ¿ì¡£×î´óµÄÎÊÌâÊÇËüÃDZ»ÏÞÖƽöÓÃÓÚ¡°ÏàµÈ¡±µÄ±È½Ï²Ù×÷£¬Òò´ËÄãÖ»ÄÜÓÃÓÚ¾«È·Æ¥ÅäµÄ²éÕÒ¡£ÕâʹµÃ hash Ë÷ÒýµÄÁé»îÐÔÔ¶²»¼°Í¨³£Ê¹ÓÃµÄ B-Tree Ë÷Òý£¬²¢ÇÒ£¬Äã²»ÄÜ°ÑËü¿´³ÉÊÇÒ»ÖÖÌæ´úÆ·£¬¶øÊÇÒ»ÖÖÓÃÓÚÌØÊâÇé¿öµÄË÷Òý¡£

Äã¸ÃʹÓÃÄĸö£¿
ÎÒÃǸղŽéÉÜÁ˺ܶ࣬Èç¹ûÄãÓе㱻Ïŵ½£¬Ò²ºÜÕý³£¡£ Èç¹ûÔÚÄãÖªµÀÕâЩ֮ǰ£¬ CREATE INDEX ½«Ê¼ÖÕΪÄã´´½¨Ê¹Óà B-Tree µÄË÷Òý£¬²¢ÇÒÓÐÒ»¸öºÃÏûÏ¢ÊÇ£¬¶ÔÓÚ´ó¶àÊýµÄÊý¾Ý¿â£¬ Postgres µÄÐÔÄܶ¼ºÜºÃ»ò·Ç³£ºÃ¡£ :) Èç¹ûÄ㿼ÂÇʹÓøü¶àµÄ Postgres ÌØÐÔ£¬ÏÂÃæÊÇÒ»¸öµ±ÄãʹÓÃÆäËü Postgres Ë÷ÒýÀàÐ͵ı¸ÍüÇåµ¥£º

B-Tree - ÊÊÓÃÓÚ´ó¶àÊýµÄÊý¾ÝÀàÐͺͲéѯ
GIN - ÊÊÓÃÓÚ JSONB/hstore/arrays
GiST - ÊÊÓÃÓÚÈ«ÎÄËÑË÷ºÍ¼¸ºÎÊý¾ÝÀàÐÍ
SP-GiST - ÊÊÓÃÓÚÓÐÌìÈ»µÄ¾Û¼¯ÒòËص«ÊÇ·Ö²¼²»¾ùÔȵĴóÊý¾Ý¼¯
BRIN - ÊÊÓÃÓÚÓÐ˳ÐòÅÅÁеÄÕæÕýµÄ´óÊý¾Ý¼¯
Hash - ÊÊÓÃÓÚÏàµÈ²Ù×÷£¬¶øÇÒ£¬Í¨³£Çé¿öÏ B-Tree Ë÷ÒýÈÔÈ»ÊÇÄãËùÐèÒªµÄ¡£
Èç¹ûÄãÓйØÓÚÕâƪÎÄÕµÄÈκÎÎÊÌâ»ò·´À¡£¬»¶Ó­¼ÓÈëÎÒÃÇµÄ slack channel¡£
±¾ÎÄתÔØ×Ô£ºhttp://www.linuxprobe.com/postgres-explore.html

Ãâ·ÑÌṩ×îÐÂLinux¼¼Êõ½Ì³ÌÊé¼®£¬Îª¿ªÔ´¼¼Êõ°®ºÃÕßŬÁ¦×öµÃ¸ü¶à¸üºÃ£¬¿ªÔ´Õ¾µã£ºhttp://www.linuxprobe.com/

Ïà¹Ø×ÊѶ