MySQLË÷Òý±³ºóµÄÊý¾Ý½á¹¹¼°Ëã·¨ÔÀí
ÕªÒª
±¾ÎÄÒÔMySQLÊý¾Ý¿âΪÑо¿¶ÔÏó£¬ÌÖÂÛÓëÊý¾Ý¿âË÷ÒýÏà¹ØµÄһЩ»°Ìâ¡£ÌرðÐèҪ˵Ã÷µÄÊÇ£¬MySQLÖ§³ÖÖî¶à´æ´¢ÒýÇ棬¶ø¸÷ÖÖ´æ´¢ÒýÇæ¶ÔË÷ÒýµÄÖ§³ÖÒ²¸÷²»Ïàͬ£¬Òò´ËMySQLÊý¾Ý¿âÖ§³Ö¶àÖÖË÷ÒýÀàÐÍ£¬ÈçBTreeË÷Òý£¬¹þÏ£Ë÷Òý£¬È«ÎÄË÷ÒýµÈµÈ¡£ÎªÁ˱ÜÃâ»ìÂÒ£¬±¾ÎĽ«Ö»¹Ø×¢ÓÚBTreeË÷Òý£¬ÒòΪÕâÊÇƽ³£Ê¹ÓÃMySQLʱÖ÷Òª´ò½»µÀµÄË÷Òý£¬ÖÁÓÚ¹þÏ£Ë÷ÒýºÍÈ«ÎÄË÷Òý±¾ÎÄÔݲ»ÌÖÂÛ¡£
ÎÄÕÂÖ÷ÒªÄÚÈÝ·ÖΪÈý¸ö²¿·Ö¡£
µÚÒ»²¿·ÖÖ÷Òª´ÓÊý¾Ý½á¹¹¼°Ëã·¨ÀíÂÛ²ãÃæÌÖÂÛMySQLÊý¾Ý¿âË÷ÒýµÄÊýÀí»ù´¡¡£
µÚ¶þ²¿·Ö½áºÏMySQLÊý¾Ý¿âÖÐMyISAMºÍInnoDBÊý¾Ý´æ´¢ÒýÇæÖÐË÷ÒýµÄ¼Ü¹¹ÊµÏÖÌÖÂÛ¾Û¼¯Ë÷Òý¡¢·Ç¾Û¼¯Ë÷Òý¼°¸²¸ÇË÷ÒýµÈ»°Ìâ¡£
µÚÈý²¿·Ö¸ù¾ÝÉÏÃæµÄÀíÂÛ»ù´¡£¬ÌÖÂÛMySQLÖиßÐÔÄÜʹÓÃË÷ÒýµÄ²ßÂÔ¡£
MySQL¹Ù·½¶ÔË÷ÒýµÄ¶¨ÒåΪ£ºË÷Òý£¨Index£©ÊÇ°ïÖúMySQL¸ßЧ»ñÈ¡Êý¾ÝµÄÊý¾Ý½á¹¹¡£ÌáÈ¡¾ä×ÓÖ÷¸É£¬¾Í¿ÉÒԵõ½Ë÷ÒýµÄ±¾ÖÊ£ºË÷ÒýÊÇÊý¾Ý½á¹¹¡£
ÎÒÃÇÖªµÀ£¬Êý¾Ý¿â²éѯÊÇÊý¾Ý¿âµÄ×îÖ÷Òª¹¦ÄÜÖ®Ò»¡£ÎÒÃǶ¼Ï£Íû²éѯÊý¾ÝµÄËÙ¶ÈÄܾ¡¿ÉÄܵĿ죬Òò´ËÊý¾Ý¿âϵͳµÄÉè¼ÆÕß»á´Ó²éѯËã·¨µÄ½Ç¶È½øÐÐÓÅ»¯¡£×î»ù±¾µÄ²éѯËã·¨µ±È»ÊÇ˳Ðò²éÕÒ£¨linear search£©£¬ÕâÖÖ¸´ÔÓ¶ÈΪO(n)µÄËã·¨ÔÚÊý¾ÝÁ¿ºÜ´óʱÏÔÈ»ÊÇÔã¸âµÄ£¬ºÃÔÚ¼ÆËã»ú¿ÆѧµÄ·¢Õ¹ÌṩÁ˺ܶà¸üÓÅÐãµÄ²éÕÒËã·¨£¬ÀýÈç¶þ·Ö²éÕÒ£¨binary search£©¡¢¶þ²æÊ÷²éÕÒ£¨binary tree search£©µÈ¡£Èç¹ûÉÔ΢·ÖÎöһϻᷢÏÖ£¬Ã¿ÖÖ²éÕÒËã·¨¶¼Ö»ÄÜÓ¦ÓÃÓÚÌض¨µÄÊý¾Ý½á¹¹Ö®ÉÏ£¬ÀýÈç¶þ·Ö²éÕÒÒªÇó±»¼ìË÷Êý¾ÝÓÐÐò£¬¶ø¶þ²æÊ÷²éÕÒÖ»ÄÜÓ¦ÓÃÓÚ¶þ²æ²éÕÒÊ÷ÉÏ£¬µ«ÊÇÊý¾Ý±¾ÉíµÄ×éÖ¯½á¹¹²»¿ÉÄÜÍêÈ«Âú×ã¸÷ÖÖÊý¾Ý½á¹¹£¨ÀýÈ磬ÀíÂÛÉϲ»¿ÉÄÜͬʱ½«Á½Áж¼°´Ë³Ðò½øÐÐ×éÖ¯£©£¬ËùÒÔ£¬ÔÚÊý¾ÝÖ®Í⣬Êý¾Ý¿âϵͳ»¹Î¬»¤×ÅÂú×ãÌض¨²éÕÒËã·¨µÄÊý¾Ý½á¹¹£¬ÕâЩÊý¾Ý½á¹¹ÒÔijÖÖ·½Ê½ÒýÓã¨Ö¸Ïò£©Êý¾Ý£¬ÕâÑù¾Í¿ÉÒÔÔÚÕâЩÊý¾Ý½á¹¹ÉÏʵÏָ߼¶²éÕÒËã·¨¡£ÕâÖÖÊý¾Ý½á¹¹£¬¾ÍÊÇË÷Òý¡£
¿´Ò»¸öÀý×Ó£º
ͼ1
ͼ1չʾÁËÒ»ÖÖ¿ÉÄܵÄË÷Òý·½Ê½¡£×ó±ßÊÇÊý¾Ý±í£¬Ò»¹²ÓÐÁ½ÁÐÆßÌõ¼Ç¼£¬×î×ó±ßµÄÊÇÊý¾Ý¼Ç¼µÄÎïÀíµØÖ·£¨×¢ÒâÂß¼ÉÏÏàÁڵļǼÔÚ´ÅÅÌÉÏÒ²²¢²»ÊÇÒ»¶¨ÎïÀíÏàÁڵģ©¡£ÎªÁ˼ӿìCol2µÄ²éÕÒ£¬¿ÉÒÔά»¤Ò»¸öÓÒ±ßËùʾµÄ¶þ²æ²éÕÒÊ÷£¬Ã¿¸ö½Úµã·Ö±ð°üº¬Ë÷Òý¼üÖµºÍÒ»¸öÖ¸Ïò¶ÔÓ¦Êý¾Ý¼Ç¼ÎïÀíµØÖ·µÄÖ¸Õ룬ÕâÑù¾Í¿ÉÒÔÔËÓöþ²æ²éÕÒÔÚO(log2n)µÄ¸´ÔÓ¶ÈÄÚ»ñÈ¡µ½ÏàÓ¦Êý¾Ý¡£
ËäÈ»ÕâÊÇÒ»¸ö»õÕæ¼ÛʵµÄË÷Òý£¬µ«ÊÇʵ¼ÊµÄÊý¾Ý¿âϵͳ¼¸ºõûÓÐʹÓöþ²æ²éÕÒÊ÷»òÆä½ø»¯Æ·ÖÖºìºÚÊ÷£¨red-black tree£©ÊµÏֵģ¬ÔÒò»áÔÚÏÂÎĽéÉÜ¡£
Ä¿Ç°´ó²¿·ÖÊý¾Ý¿âϵͳ¼°Îļþϵͳ¶¼²ÉÓÃB-Tree»òÆä±äÖÖB+Tree×÷ΪË÷Òý½á¹¹£¬ÔÚ±¾ÎĵÄÏÂÒ»½Ú»á½áºÏ´æ´¢Æ÷ÔÀí¼°¼ÆËã»ú´æÈ¡ÔÀíÌÖÂÛΪʲôB-TreeºÍB+TreeÔÚ±»Èç´Ë¹ã·ºÓÃÓÚË÷Òý£¬ÕâÒ»½ÚÏȵ¥´¿´ÓÊý¾Ý½á¹¹½Ç¶ÈÃèÊöËüÃÇ¡£
B-Tree
ΪÁËÃèÊöB-Tree£¬Ê×Ïȶ¨ÒåÒ»ÌõÊý¾Ý¼Ç¼Ϊһ¸ö¶þÔª×é[key, data]£¬keyΪ¼Ç¼µÄ¼üÖµ£¬¶ÔÓÚ²»Í¬Êý¾Ý¼Ç¼£¬keyÊÇ»¥²»ÏàͬµÄ£»dataΪÊý¾Ý¼Ç¼³ýkeyÍâµÄÊý¾Ý¡£ÄÇôB-TreeÊÇÂú×ãÏÂÁÐÌõ¼þµÄÊý¾Ý½á¹¹£º
1. dΪ´óÓÚ1µÄÒ»¸öÕýÕûÊý£¬³ÆΪB-TreeµÄ¶È¡£
2. hΪһ¸öÕýÕûÊý£¬³ÆΪB-TreeµÄ¸ß¶È¡£
3. ÿ¸ö·ÇÒ¶×Ó½ÚµãÓÉn-1¸ökeyºÍn¸öÖ¸Õë×é³É£¬ÆäÖÐd<=n<=2d¡£
4. ÿ¸öÒ¶×Ó½Úµã×îÉÙ°üº¬Ò»¸ökeyºÍÁ½¸öÖ¸Õ룬×î¶à°üº¬2d-1¸ökeyºÍ2d¸öÖ¸Õ룬Ҷ½ÚµãµÄÖ¸Õë¾ùΪnull ¡£
5. ËùÓÐÒ¶½Úµã¾ßÓÐÏàͬµÄÉî¶È£¬µÈÓÚÊ÷¸ßh¡£
6. keyºÍÖ¸Õ뻥Ïà¼ä¸ô£¬½ÚµãÁ½¶ËÊÇÖ¸Õë¡£
7. Ò»¸ö½ÚµãÖеÄkey´Ó×óµ½ÓҷǵݼõÅÅÁС£
8. ËùÓнڵã×é³ÉÊ÷½á¹¹¡£
9. ÿ¸öÖ¸ÕëҪôΪnull£¬ÒªÃ´Ö¸ÏòÁíÍâÒ»¸ö½Úµã¡£
10. Èç¹ûij¸öÖ¸ÕëÔÚ½Úµãnode×î×ó±ßÇÒ²»Îªnull£¬ÔòÆäÖ¸Ïò½ÚµãµÄËùÓÐkeyСÓÚv(key1)£¬ÆäÖÐv(key1)ΪnodeµÄµÚÒ»¸ökeyµÄÖµ¡£
11. Èç¹ûij¸öÖ¸ÕëÔÚ½Úµãnode×îÓÒ±ßÇÒ²»Îªnull£¬ÔòÆäÖ¸Ïò½ÚµãµÄËùÓÐkey´óÓÚv(keym)£¬ÆäÖÐv(keym)ΪnodeµÄ×îºóÒ»¸ökeyµÄÖµ¡£
12. Èç¹ûij¸öÖ¸ÕëÔÚ½ÚµãnodeµÄ×óÓÒÏàÁÚkey·Ö±ðÊÇkeyiºÍkeyi+1ÇÒ²»Îªnull£¬ÔòÆäÖ¸Ïò½ÚµãµÄËùÓÐkeyСÓÚv(keyi+1)ÇÒ´óÓÚv(keyi)¡£
ͼ2ÊÇÒ»¸öd=2µÄB-TreeʾÒâͼ¡£
ͼ2
ÓÉÓÚB-TreeµÄÌØÐÔ£¬ÔÚB-TreeÖа´key¼ìË÷Êý¾ÝµÄËã·¨·Ç³£Ö±¹Û£ºÊ×ÏÈ´Ó¸ù½Úµã½øÐжþ·Ö²éÕÒ£¬Èç¹ûÕÒµ½Ôò·µ»Ø¶ÔÓ¦½ÚµãµÄdata£¬·ñÔò¶ÔÏàÓ¦Çø¼äµÄÖ¸ÕëÖ¸ÏòµÄ½ÚµãµÝ¹é½øÐвéÕÒ£¬Ö±µ½ÕÒµ½½Úµã»òÕÒµ½nullÖ¸Õ룬ǰÕß²éÕҳɹ¦£¬ºóÕß²éÕÒʧ°Ü¡£B-TreeÉϲéÕÒËã·¨µÄα´úÂëÈçÏ£º
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
BTree_Search(node, key) { if (node == null) return null; foreach(node.key) { if (node.key[i] == key) return node.data[i]; if (node.key[i] > key) return BTree_Search(point[i]->node); } return BTree_Search(point[i+1]->node); } data = BTree_Search(root, my_key); |
¹ØÓÚB-TreeÓÐһϵÁÐÓÐȤµÄÐÔÖÊ£¬ÀýÈçÒ»¸ö¶ÈΪdµÄB-Tree£¬ÉèÆäË÷ÒýN¸ökey£¬ÔòÆäÊ÷¸ßhµÄÉÏÏÞΪlogd((N+1)/2)£¬¼ìË÷Ò»¸ökey£¬Æä²éÕÒ½Úµã¸öÊýµÄ½¥½ø¸´ÔÓ¶ÈΪO(logdN)¡£´ÓÕâµã¿ÉÒÔ¿´³ö£¬B-TreeÊÇÒ»¸ö·Ç³£ÓÐЧÂʵÄË÷ÒýÊý¾Ý½á¹¹¡£
ÁíÍ⣬ÓÉÓÚ²åÈëɾ³ýеÄÊý¾Ý¼Ç¼»áÆÆ»µB-TreeµÄÐÔÖÊ£¬Òò´ËÔÚ²åÈëɾ³ýʱ£¬ÐèÒª¶ÔÊ÷½øÐÐÒ»¸ö·ÖÁÑ¡¢ºÏ²¢¡¢×ªÒƵȲÙ×÷ÒÔ±£³ÖB-TreeÐÔÖÊ£¬±¾ÎIJ»´òËãÍêÕûÌÖÂÛB-TreeÕâЩÄÚÈÝ£¬ÒòΪÒѾÓÐÐí¶à×ÊÁÏÏêϸ˵Ã÷ÁËB-TreeµÄÊýѧÐÔÖʼ°²åÈëɾ³ýËã·¨£¬ÓÐÐËȤµÄÅóÓÑ¿ÉÒÔÔÚ±¾ÎÄÄ©µÄ²Î¿¼ÎÄÏ×Ò»À¸ÕÒµ½ÏàÓ¦µÄ×ÊÁϽøÐÐÔĶÁ¡£
B+Tree
B-TreeÓÐÐí¶à±äÖÖ£¬ÆäÖÐ×î³£¼ûµÄÊÇB+Tree£¬ÀýÈçMySQL¾ÍÆÕ±éʹÓÃB+TreeʵÏÖÆäË÷Òý½á¹¹¡£
ÓëB-TreeÏà±È£¬B+TreeÓÐÒÔϲ»Í¬µã£º
1. ÿ¸ö½ÚµãµÄÖ¸ÕëÉÏÏÞΪ2d¶ø²»ÊÇ2d+1¡£
2. Äڽڵ㲻´æ´¢data£¬Ö»´æ´¢key£»Ò¶×ӽڵ㲻´æ´¢Ö¸Õë¡£
ͼ3ÊÇÒ»¸ö¼òµ¥µÄB+TreeʾÒâ¡£
ͼ3
ÓÉÓÚ²¢²»ÊÇËùÓнڵ㶼¾ßÓÐÏàͬµÄÓò£¬Òò´ËB+TreeÖÐÒ¶½ÚµãºÍÄÚ½ÚµãÒ»°ã´óС²»Í¬¡£ÕâµãÓëB-Tree²»Í¬£¬ËäÈ»B-TreeÖв»Í¬½Úµã´æ·ÅµÄkeyºÍÖ¸Õë¿ÉÄÜÊýÁ¿²»Ò»Ö£¬µ«ÊÇÿ¸ö½ÚµãµÄÓòºÍÉÏÏÞÊÇÒ»Öµģ¬ËùÒÔÔÚʵÏÖÖÐB-TreeÍùÍù¶Ôÿ¸ö½ÚµãÉêÇëͬµÈ´óСµÄ¿Õ¼ä¡£
Ò»°ãÀ´Ëµ£¬B+Tree±ÈB-Tree¸üÊʺÏʵÏÖÍâ´æ´¢Ë÷Òý½á¹¹£¬¾ßÌåÔÒòÓëÍâ´æ´¢Æ÷ÔÀí¼°¼ÆËã»ú´æÈ¡ÔÀíÓйأ¬½«ÔÚÏÂÃæÌÖÂÛ¡£
´øÓÐ˳Ðò·ÃÎÊÖ¸ÕëµÄB+Tree
Ò»°ãÔÚÊý¾Ý¿âϵͳ»òÎļþϵͳÖÐʹÓõÄB+Tree½á¹¹¶¼ÔÚ¾µäB+TreeµÄ»ù´¡ÉϽøÐÐÁËÓÅ»¯£¬Ôö¼ÓÁË˳Ðò·ÃÎÊÖ¸Õë¡£
ͼ4
Èçͼ4Ëùʾ£¬ÔÚB+TreeµÄÿ¸öÒ¶×Ó½ÚµãÔö¼ÓÒ»¸öÖ¸ÏòÏàÁÚÒ¶×Ó½ÚµãµÄÖ¸Õ룬¾ÍÐγÉÁË´øÓÐ˳Ðò·ÃÎÊÖ¸ÕëµÄB+Tree¡£×öÕâ¸öÓÅ»¯µÄÄ¿µÄÊÇΪÁËÌá¸ßÇø¼ä·ÃÎʵÄÐÔÄÜ£¬ÀýÈçͼ4ÖÐÈç¹ûÒª²éѯkeyΪ´Ó18µ½49µÄËùÓÐÊý¾Ý¼Ç¼£¬µ±ÕÒµ½18ºó£¬Ö»Ðè˳׎ڵãºÍÖ¸Õë˳Ðò±éÀú¾Í¿ÉÒÔÒ»´ÎÐÔ·ÃÎʵ½ËùÓÐÊý¾Ý½Úµã£¬¼«´óÌáµ½ÁËÇø¼ä²éѯЧÂÊ¡£
ÕâÒ»½Ú¶ÔB-TreeºÍB+Tree½øÐÐÁËÒ»¸ö¼òµ¥µÄ½éÉÜ£¬ÏÂÒ»½Ú½áºÏ´æ´¢Æ÷´æÈ¡ÔÀí½éÉÜΪʲôĿǰB+TreeÊÇÊý¾Ý¿âϵͳʵÏÖË÷ÒýµÄÊ×Ñ¡Êý¾Ý½á¹¹¡£
ÉÏÎÄ˵¹ý£¬ºìºÚÊ÷µÈÊý¾Ý½á¹¹Ò²¿ÉÒÔÓÃÀ´ÊµÏÖË÷Òý£¬µ«ÊÇÎļþϵͳ¼°Êý¾Ý¿âϵͳÆÕ±é²ÉÓÃB-/+Tree×÷ΪË÷Òý½á¹¹£¬ÕâÒ»½Ú½«½áºÏ¼ÆËã»ú×é³ÉÔÀíÏà¹Ø֪ʶÌÖÂÛB-/+Tree×÷ΪË÷ÒýµÄÀíÂÛ»ù´¡¡£
Ò»°ãÀ´Ëµ£¬Ë÷Òý±¾ÉíÒ²ºÜ´ó£¬²»¿ÉÄÜÈ«²¿´æ´¢ÔÚÄÚ´æÖУ¬Òò´ËË÷ÒýÍùÍùÒÔË÷ÒýÎļþµÄÐÎʽ´æ´¢µÄ´ÅÅÌÉÏ¡£ÕâÑùµÄ»°£¬Ë÷Òý²éÕÒ¹ý³ÌÖоÍÒª²úÉú´ÅÅÌI/OÏûºÄ£¬Ïà¶ÔÓÚÄÚ´æ´æÈ¡£¬I/O´æÈ¡µÄÏûºÄÒª¸ß¼¸¸öÊýÁ¿¼¶£¬ËùÒÔÆÀ¼ÛÒ»¸öÊý¾Ý½á¹¹×÷ΪË÷ÒýµÄÓÅÁÓ×îÖØÒªµÄÖ¸±ê¾ÍÊÇÔÚ²éÕÒ¹ý³ÌÖдÅÅÌI/O²Ù×÷´ÎÊýµÄ½¥½ø¸´ÔӶȡ£»»¾ä»°Ëµ£¬Ë÷ÒýµÄ½á¹¹×éÖ¯Òª¾¡Á¿¼õÉÙ²éÕÒ¹ý³ÌÖдÅÅÌI/OµÄ´æÈ¡´ÎÊý¡£ÏÂÃæÏȽéÉÜÄÚ´æºÍ´ÅÅÌ´æÈ¡ÔÀí£¬È»ºóÔÙ½áºÏÕâЩÔÀí·ÖÎöB-/+Tree×÷ΪË÷ÒýµÄЧÂÊ¡£
Ö÷´æ´æÈ¡ÔÀí
Ä¿Ç°¼ÆËã»úʹÓõÄÖ÷´æ»ù±¾¶¼ÊÇËæ»ú¶Áд´æ´¢Æ÷£¨RAM£©£¬ÏÖ´úRAMµÄ½á¹¹ºÍ´æÈ¡ÔÀí±È½Ï¸´ÔÓ£¬ÕâÀï±¾ÎÄÅ×È´¾ßÌå²î±ð£¬³éÏó³öÒ»¸öÊ®·Ö¼òµ¥µÄ´æÈ¡Ä£ÐÍÀ´ËµÃ÷RAMµÄ¹¤×÷ÔÀí¡£
ͼ5
´Ó³éÏó½Ç¶È¿´£¬Ö÷´æÊÇһϵÁеĴ洢µ¥Ôª×é³ÉµÄ¾ØÕó£¬Ã¿¸ö´æ´¢µ¥Ôª´æ´¢¹Ì¶¨´óСµÄÊý¾Ý¡£Ã¿¸ö´æ´¢µ¥ÔªÓÐΨһµÄµØÖ·£¬ÏÖ´úÖ÷´æµÄ±àÖ·¹æÔò±È½Ï¸´ÔÓ£¬ÕâÀォÆä¼ò»¯³ÉÒ»¸ö¶þάµØÖ·£ºÍ¨¹ýÒ»¸öÐеØÖ·ºÍÒ»¸öÁеØÖ·¿ÉÒÔΨһ¶¨Î»µ½Ò»¸ö´æ´¢µ¥Ôª¡£Í¼5չʾÁËÒ»¸ö4 x 4µÄÖ÷´æÄ£ÐÍ¡£
Ö÷´æµÄ´æÈ¡¹ý³ÌÈçÏ£º
µ±ÏµÍ³ÐèÒª¶ÁÈ¡Ö÷´æʱ£¬Ôò½«µØÖ·Ðźŷŵ½µØÖ·×ÜÏßÉÏ´«¸øÖ÷´æ£¬Ö÷´æ¶Áµ½µØÖ·Ðźź󣬽âÎöÐźŲ¢¶¨Î»µ½Ö¸¶¨´æ´¢µ¥Ôª£¬È»ºó½«´Ë´æ´¢µ¥ÔªÊý¾Ý·Åµ½Êý¾Ý×ÜÏßÉÏ£¬¹©ÆäËü²¿¼þ¶ÁÈ¡¡£
дÖ÷´æµÄ¹ý³ÌÀàËÆ£¬ÏµÍ³½«ÒªÐ´Èëµ¥ÔªµØÖ·ºÍÊý¾Ý·Ö±ð·ÅÔÚµØÖ·×ÜÏߺÍÊý¾Ý×ÜÏßÉÏ£¬Ö÷´æ¶ÁÈ¡Á½¸ö×ÜÏßµÄÄÚÈÝ£¬×öÏàÓ¦µÄд²Ù×÷¡£
ÕâÀï¿ÉÒÔ¿´³ö£¬Ö÷´æ´æÈ¡µÄʱ¼ä½öÓë´æÈ¡´ÎÊý³ÊÏßÐÔ¹Øϵ£¬ÒòΪ²»´æÔÚ»úе²Ù×÷£¬Á½´Î´æÈ¡µÄÊý¾ÝµÄ¡°¾àÀ롱²»»á¶Ôʱ¼äÓÐÈκÎÓ°Ï죬ÀýÈ磬ÏÈÈ¡A0ÔÙÈ¡A1ºÍÏÈÈ¡A0ÔÙÈ¡D3µÄʱ¼äÏûºÄÊÇÒ»ÑùµÄ¡£
´ÅÅÌ´æÈ¡ÔÀí
ÉÏÎÄ˵¹ý£¬Ë÷ÒýÒ»°ãÒÔÎļþÐÎʽ´æ´¢ÔÚ´ÅÅÌÉÏ£¬Ë÷Òý¼ìË÷ÐèÒª´ÅÅÌI/O²Ù×÷¡£ÓëÖ÷´æ²»Í¬£¬´ÅÅÌI/O´æÔÚ»úеÔ˶¯ºÄ·Ñ£¬Òò´Ë´ÅÅÌI/OµÄʱ¼äÏûºÄÊǾ޴óµÄ¡£
ͼ6ÊÇ´ÅÅ̵ÄÕûÌå½á¹¹Ê¾Òâͼ¡£
ͼ6
Ò»¸ö´ÅÅÌÓÉ´óСÏàͬÇÒͬÖáµÄÔ²ÐÎÅÌƬ×é³É£¬´ÅÅÌ¿ÉÒÔת¶¯£¨¸÷¸ö´ÅÅ̱ØÐëͬ²½×ª¶¯£©¡£ÔÚ´ÅÅ̵ÄÒ»²àÓдÅÍ·Ö§¼Ü£¬´ÅÍ·Ö§¼Ü¹Ì¶¨ÁËÒ»×é´ÅÍ·£¬Ã¿¸ö´ÅÍ·¸ºÔð´æÈ¡Ò»¸ö´ÅÅ̵ÄÄÚÈÝ¡£´ÅÍ·²»ÄÜת¶¯£¬µ«ÊÇ¿ÉÒÔÑØ´ÅÅ̰뾶·½ÏòÔ˶¯£¨Êµ¼ÊÊÇбÇÐÏòÔ˶¯£©£¬Ã¿¸ö´Åͷͬһʱ¿ÌÒ²±ØÐëÊÇͬÖáµÄ£¬¼´´ÓÕýÉÏ·½ÏòÏ¿´£¬ËùÓдÅÍ·ÈκÎʱºò¶¼ÊÇÖصþµÄ£¨²»¹ýÄ¿Ç°ÒѾÓжà´ÅÍ·¶ÀÁ¢¼¼Êõ£¬¿É²»ÊÜ´ËÏÞÖÆ£©¡£
ͼ7ÊÇ´ÅÅ̽ṹµÄʾÒâͼ¡£
ͼ7
ÅÌƬ±»»®·Ö³ÉһϵÁÐͬÐÄ»·£¬Ô²ÐÄÊÇÅÌƬÖÐÐÄ£¬Ã¿¸öͬÐÄ»·½Ð×öÒ»¸ö´ÅµÀ£¬ËùÓа뾶ÏàͬµÄ´ÅµÀ×é³ÉÒ»¸öÖùÃæ¡£´ÅµÀ±»Ñذ뾶Ïß»®·Ö³ÉÒ»¸ö¸öСµÄ¶Î£¬Ã¿¸ö¶Î½Ð×öÒ»¸öÉÈÇø£¬Ã¿¸öÉÈÇøÊÇ´ÅÅ̵Ä×îС´æ´¢µ¥Ôª¡£ÎªÁ˼òµ¥Æð¼û£¬ÎÒÃÇÏÂÃæ¼ÙÉè´ÅÅÌÖ»ÓÐÒ»¸öÅÌƬºÍÒ»¸ö´ÅÍ·¡£
µ±ÐèÒª´Ó´ÅÅ̶ÁÈ¡Êý¾Ýʱ£¬ÏµÍ³»á½«Êý¾ÝÂß¼µØÖ·´«¸ø´ÅÅÌ£¬´ÅÅ̵ĿØÖƵç·°´ÕÕÑ°Ö·Âß¼½«Âß¼µØÖ··Òë³ÉÎïÀíµØÖ·£¬¼´È·¶¨Òª¶ÁµÄÊý¾ÝÔÚÄĸö´ÅµÀ£¬ÄĸöÉÈÇø¡£ÎªÁ˶ÁÈ¡Õâ¸öÉÈÇøµÄÊý¾Ý£¬ÐèÒª½«´ÅÍ··Åµ½Õâ¸öÉÈÇøÉÏ·½£¬ÎªÁËʵÏÖÕâÒ»µã£¬´ÅÍ·ÐèÒªÒƶ¯¶Ô×¼ÏàÓ¦´ÅµÀ£¬Õâ¸ö¹ý³Ì½Ð×öÑ°µÀ£¬ËùºÄ·Ñʱ¼ä½Ð×öÑ°µÀʱ¼ä£¬È»ºó´ÅÅÌÐýת½«Ä¿±êÉÈÇøÐýתµ½´ÅÍ·Ï£¬Õâ¸ö¹ý³ÌºÄ·ÑµÄʱ¼ä½Ð×öÐýתʱ¼ä¡£
¾Ö²¿ÐÔÔÀíÓë´ÅÅÌÔ¤¶Á
ÓÉÓÚ´æ´¢½éÖʵÄÌØÐÔ£¬´ÅÅ̱¾Éí´æÈ¡¾Í±ÈÖ÷´æÂýºÜ¶à£¬ÔÙ¼ÓÉÏ»úеÔ˶¯ºÄ·Ñ£¬´ÅÅ̵ĴæÈ¡ËÙ¶ÈÍùÍùÊÇÖ÷´æµÄ¼¸°Ù·Ö·ÖÖ®Ò»£¬Òò´ËΪÁËÌá¸ßЧÂÊ£¬Òª¾¡Á¿¼õÉÙ´ÅÅÌI/O¡£ÎªÁË´ïµ½Õâ¸öÄ¿µÄ£¬´ÅÅÌÍùÍù²»ÊÇÑϸñ°´Ðè¶ÁÈ¡£¬¶øÊÇÿ´Î¶¼»áÔ¤¶Á£¬¼´Ê¹Ö»ÐèÒªÒ»¸ö×Ö½Ú£¬´ÅÅÌÒ²»á´ÓÕâ¸öλÖÿªÊ¼£¬Ë³ÐòÏòºó¶ÁÈ¡Ò»¶¨³¤¶ÈµÄÊý¾Ý·ÅÈëÄÚ´æ¡£ÕâÑù×öµÄÀíÂÛÒÀ¾ÝÊǼÆËã»ú¿ÆѧÖÐÖøÃûµÄ¾Ö²¿ÐÔÔÀí£º
µ±Ò»¸öÊý¾Ý±»Óõ½Ê±£¬Æ丽½üµÄÊý¾ÝҲͨ³£»áÂíÉϱ»Ê¹Óá£
³ÌÐòÔËÐÐÆÚ¼äËùÐèÒªµÄÊý¾Ýͨ³£±È½Ï¼¯ÖС£
ÓÉÓÚ´ÅÅÌ˳Ðò¶ÁÈ¡µÄЧÂʺܸߣ¨²»ÐèҪѰµÀʱ¼ä£¬Ö»ÐèºÜÉÙµÄÐýתʱ¼ä£©£¬Òò´Ë¶ÔÓÚ¾ßÓоֲ¿ÐԵijÌÐòÀ´Ëµ£¬Ô¤¶Á¿ÉÒÔÌá¸ßI/OЧÂÊ¡£
Ô¤¶ÁµÄ³¤¶ÈÒ»°ãΪҳ£¨page£©µÄÕû±¶Êý¡£Ò³ÊǼÆËã»ú¹ÜÀí´æ´¢Æ÷µÄÂß¼¿é£¬Ó²¼þ¼°²Ù×÷ϵͳÍùÍù½«Ö÷´æºÍ´ÅÅÌ´æ´¢Çø·Ö¸îΪÁ¬ÐøµÄ´óСÏàµÈµÄ¿é£¬Ã¿¸ö´æ´¢¿é³ÆΪһҳ£¨ÔÚÐí¶à²Ù×÷ϵͳÖУ¬Ò³µÃ´óСͨ³£Îª4k£©£¬Ö÷´æºÍ´ÅÅÌÒÔҳΪµ¥Î»½»»»Êý¾Ý¡£µ±³ÌÐòÒª¶ÁÈ¡µÄÊý¾Ý²»ÔÚÖ÷´æÖÐʱ£¬»á´¥·¢Ò»¸öȱҳÒì³££¬´Ëʱϵͳ»áÏò´ÅÅÌ·¢³ö¶ÁÅÌÐźţ¬´ÅÅÌ»áÕÒµ½Êý¾ÝµÄÆðʼλÖò¢ÏòºóÁ¬Ðø¶ÁÈ¡Ò»Ò³»ò¼¸Ò³ÔØÈëÄÚ´æÖУ¬È»ºóÒì³£·µ»Ø£¬³ÌÐò¼ÌÐøÔËÐС£
B-/+TreeË÷ÒýµÄÐÔÄÜ·ÖÎö
µ½ÕâÀïÖÕÓÚ¿ÉÒÔ·ÖÎöB-/+TreeË÷ÒýµÄÐÔÄÜÁË¡£
ÉÏÎÄ˵¹ýÒ»°ãʹÓôÅÅÌI/O´ÎÊýÆÀ¼ÛË÷Òý½á¹¹µÄÓÅÁÓ¡£ÏÈ´ÓB-Tree·ÖÎö£¬¸ù¾ÝB-TreeµÄ¶¨Ò壬¿ÉÖª¼ìË÷Ò»´Î×î¶àÐèÒª·ÃÎÊh¸ö½Úµã¡£Êý¾Ý¿âϵͳµÄÉè¼ÆÕßÇÉÃîÀûÓÃÁË´ÅÅÌÔ¤¶ÁÔÀí£¬½«Ò»¸ö½ÚµãµÄ´óСÉèΪµÈÓÚÒ»¸öÒ³£¬ÕâÑùÿ¸ö½ÚµãÖ»ÐèÒªÒ»´ÎI/O¾Í¿ÉÒÔÍêÈ«ÔØÈ롣ΪÁË´ïµ½Õâ¸öÄ¿µÄ£¬ÔÚʵ¼ÊʵÏÖB-Tree»¹ÐèҪʹÓÃÈçϼ¼ÇÉ£º
ÿ´Îн¨½Úµãʱ£¬Ö±½ÓÉêÇëÒ»¸öÒ³µÄ¿Õ¼ä£¬ÕâÑù¾Í±£Ö¤Ò»¸ö½ÚµãÎïÀíÉÏÒ²´æ´¢ÔÚÒ»¸öÒ³À¼ÓÖ®¼ÆËã»ú´æ´¢·ÖÅ䶼ÊÇ°´Ò³¶ÔÆëµÄ£¬¾ÍʵÏÖÁËÒ»¸önodeÖ»ÐèÒ»´ÎI/O¡£
B-TreeÖÐÒ»´Î¼ìË÷×î¶àÐèÒªh-1´ÎI/O£¨¸ù½Úµã³£×¤Äڴ棩£¬½¥½ø¸´ÔÓ¶ÈΪO(h)=O(logdN)¡£Ò»°ãʵ¼ÊÓ¦ÓÃÖУ¬³ö¶ÈdÊǷdz£´óµÄÊý×Ö£¬Í¨³£³¬¹ý100£¬Òò´Ëh·Ç³£Ð¡£¨Í¨³£²»³¬¹ý3£©¡£
×ÛÉÏËùÊö£¬ÓÃB-Tree×÷ΪË÷Òý½á¹¹Ð§ÂÊÊǷdz£¸ßµÄ¡£
¶øºìºÚÊ÷ÕâÖֽṹ£¬hÃ÷ÏÔÒªÉîµÄ¶à¡£ÓÉÓÚÂß¼ÉϺܽüµÄ½Úµã£¨¸¸×Ó£©ÎïÀíÉÏ¿ÉÄܺÜÔ¶£¬ÎÞ·¨ÀûÓþֲ¿ÐÔ£¬ËùÒÔºìºÚÊ÷µÄI/O½¥½ø¸´ÔÓ¶ÈҲΪO(h)£¬Ð§ÂÊÃ÷ÏÔ±ÈB-Tree²îºÜ¶à¡£
ÉÏÎÄ»¹Ëµ¹ý£¬B+Tree¸üÊʺÏÍâ´æË÷Òý£¬ÔÒòºÍÄÚ½Úµã³ö¶ÈdÓйء£´ÓÉÏÃæ·ÖÎö¿ÉÒÔ¿´µ½£¬dÔ½´óË÷ÒýµÄÐÔÄÜÔ½ºÃ£¬¶ø³ö¶ÈµÄÉÏÏÞÈ¡¾öÓÚ½ÚµãÄÚkeyºÍdataµÄ´óС£º
dmax = floor(pagesize / (keysize + datasize + pointsize)) (pagesize ¨C dmax >= pointsize)
»ò
dmax = floor(pagesize / (keysize + datasize + pointsize)) ¨C 1 (pagesize ¨C dmax < pointsize)
floor±íʾÏòÏÂÈ¡Õû¡£ÓÉÓÚB+TreeÄÚ½ÚµãÈ¥µôÁËdataÓò£¬Òò´Ë¿ÉÒÔÓµÓиü´óµÄ³ö¶È£¬ÓµÓиüºÃµÄÐÔÄÜ¡£
ÕâÒ»Õ´ÓÀíÂ۽ǶÈÌÖÂÛÁËÓëË÷ÒýÏà¹ØµÄÊý¾Ý½á¹¹ÓëËã·¨ÎÊÌ⣬ÏÂÒ»Õ½«ÌÖÂÛB+TreeÊÇÈçºÎ¾ßÌåʵÏÖΪMySQLÖÐË÷Òý£¬Í¬Ê±½«½áºÏMyISAMºÍInnDB´æ´¢ÒýÇæ½éÉܷǾۼ¯Ë÷ÒýºÍ¾Û¼¯Ë÷ÒýÁ½ÖÖ²»Í¬µÄË÷ÒýʵÏÖÐÎʽ¡£
ÔÚMySQLÖУ¬Ë÷ÒýÊôÓÚ´æ´¢ÒýÇ漶±ðµÄ¸ÅÄ²»Í¬´æ´¢ÒýÇæ¶ÔË÷ÒýµÄʵÏÖ·½Ê½ÊDz»Í¬µÄ£¬±¾ÎÄÖ÷ÒªÌÖÂÛMyISAMºÍInnoDBÁ½¸ö´æ´¢ÒýÇæµÄË÷ÒýʵÏÖ·½Ê½¡£
MyISAMÒýÇæʹÓÃB+Tree×÷ΪË÷Òý½á¹¹£¬Ò¶½ÚµãµÄdataÓò´æ·ÅµÄÊÇÊý¾Ý¼Ç¼µÄµØÖ·¡£ÏÂͼÊÇMyISAMË÷ÒýµÄÔÀíͼ£º
ͼ8
ÕâÀïÉè±íÒ»¹²ÓÐÈýÁУ¬¼ÙÉèÎÒÃÇÒÔCol1ΪÖ÷¼ü£¬Ôòͼ8ÊÇÒ»¸öMyISAM±íµÄÖ÷Ë÷Òý£¨Primary key£©Ê¾Òâ¡£¿ÉÒÔ¿´³öMyISAMµÄË÷ÒýÎļþ½ö½ö±£´æÊý¾Ý¼Ç¼µÄµØÖ·¡£ÔÚMyISAMÖУ¬Ö÷Ë÷ÒýºÍ¸¨ÖúË÷Òý£¨Secondary key£©ÔڽṹÉÏûÓÐÈκÎÇø±ð£¬Ö»ÊÇÖ÷Ë÷ÒýÒªÇókeyÊÇΨһµÄ£¬¶ø¸¨ÖúË÷ÒýµÄkey¿ÉÒÔÖظ´¡£Èç¹ûÎÒÃÇÔÚCol2ÉϽ¨Á¢Ò»¸ö¸¨ÖúË÷Òý£¬Ôò´ËË÷ÒýµÄ½á¹¹ÈçÏÂͼËùʾ£º
ͼ9
ͬÑùÒ²ÊÇÒ»¿ÅB+Tree£¬dataÓò±£´æÊý¾Ý¼Ç¼µÄµØÖ·¡£Òò´Ë£¬MyISAMÖÐË÷Òý¼ìË÷µÄË㷨ΪÊ×ÏÈ°´ÕÕB+TreeËÑË÷Ëã·¨ËÑË÷Ë÷Òý£¬Èç¹ûÖ¸¶¨µÄKey´æÔÚ£¬ÔòÈ¡³öÆädataÓòµÄÖµ£¬È»ºóÒÔdataÓòµÄֵΪµØÖ·£¬¶ÁÈ¡ÏàÓ¦Êý¾Ý¼Ç¼¡£
MyISAMµÄË÷Òý·½Ê½Ò²½Ð×ö¡°·Ç¾Û¼¯¡±µÄ£¬Ö®ËùÒÔÕâô³ÆºôÊÇΪÁËÓëInnoDBµÄ¾Û¼¯Ë÷ÒýÇø·Ö¡£
ËäÈ»InnoDBҲʹÓÃB+Tree×÷ΪË÷Òý½á¹¹£¬µ«¾ßÌåʵÏÖ·½Ê½È´ÓëMyISAM½ØÈ»²»Í¬¡£
µÚÒ»¸öÖØ´óÇø±ðÊÇInnoDBµÄÊý¾ÝÎļþ±¾Éí¾ÍÊÇË÷ÒýÎļþ¡£´ÓÉÏÎÄÖªµÀ£¬MyISAMË÷ÒýÎļþºÍÊý¾ÝÎļþÊÇ·ÖÀëµÄ£¬Ë÷ÒýÎļþ½ö±£´æÊý¾Ý¼Ç¼µÄµØÖ·¡£¶øÔÚInnoDBÖУ¬±íÊý¾ÝÎļþ±¾Éí¾ÍÊÇ°´B+Tree×éÖ¯µÄÒ»¸öË÷Òý½á¹¹£¬Õâ¿ÃÊ÷µÄÒ¶½ÚµãdataÓò±£´æÁËÍêÕûµÄÊý¾Ý¼Ç¼¡£Õâ¸öË÷ÒýµÄkeyÊÇÊý¾Ý±íµÄÖ÷¼ü£¬Òò´ËInnoDB±íÊý¾ÝÎļþ±¾Éí¾ÍÊÇÖ÷Ë÷Òý¡£
ͼ10
ͼ10ÊÇInnoDBÖ÷Ë÷Òý£¨Í¬Ê±Ò²ÊÇÊý¾ÝÎļþ£©µÄʾÒâͼ£¬¿ÉÒÔ¿´µ½Ò¶½Úµã°üº¬ÁËÍêÕûµÄÊý¾Ý¼Ç¼¡£ÕâÖÖË÷Òý½Ð×ö¾Û¼¯Ë÷Òý¡£ÒòΪInnoDBµÄÊý¾ÝÎļþ±¾ÉíÒª°´Ö÷¼ü¾Û¼¯£¬ËùÒÔInnoDBÒªÇó±í±ØÐëÓÐÖ÷¼ü£¨MyISAM¿ÉÒÔûÓУ©£¬Èç¹ûûÓÐÏÔʽָ¶¨£¬ÔòMySQLϵͳ»á×Ô¶¯Ñ¡ÔñÒ»¸ö¿ÉÒÔΨһ±êʶÊý¾Ý¼Ç¼µÄÁÐ×÷ΪÖ÷¼ü£¬Èç¹û²»´æÔÚÕâÖÖÁУ¬ÔòMySQL×Ô¶¯ÎªInnoDB±íÉú³ÉÒ»¸öÒþº¬×Ö¶Î×÷ΪÖ÷¼ü£¬Õâ¸ö×ֶ㤶ÈΪ6¸ö×Ö½Ú£¬ÀàÐÍΪ³¤ÕûÐΡ£
µÚ¶þ¸öÓëMyISAMË÷ÒýµÄ²»Í¬ÊÇInnoDBµÄ¸¨ÖúË÷ÒýdataÓò´æ´¢ÏàÓ¦¼Ç¼Ö÷¼üµÄÖµ¶ø²»ÊǵØÖ·¡£»»¾ä»°Ëµ£¬InnoDBµÄËùÓи¨ÖúË÷Òý¶¼ÒýÓÃÖ÷¼ü×÷ΪdataÓò¡£ÀýÈ磬ͼ11Ϊ¶¨ÒåÔÚCol3ÉϵÄÒ»¸ö¸¨ÖúË÷Òý£º
ͼ11
ÕâÀïÒÔÓ¢ÎÄ×Ö·ûµÄASCIIÂë×÷Ϊ±È½Ï×¼Ôò¡£¾Û¼¯Ë÷ÒýÕâÖÖʵÏÖ·½Ê½Ê¹µÃ°´Ö÷¼üµÄËÑË÷Ê®·Ö¸ßЧ£¬µ«ÊǸ¨ÖúË÷ÒýËÑË÷ÐèÒª¼ìË÷Á½±éË÷Òý£ºÊ×ÏȼìË÷¸¨ÖúË÷Òý»ñµÃÖ÷¼ü£¬È»ºóÓÃÖ÷¼üµ½Ö÷Ë÷ÒýÖмìË÷»ñµÃ¼Ç¼¡£
Á˽ⲻͬ´æ´¢ÒýÇæµÄË÷ÒýʵÏÖ·½Ê½¶ÔÓÚÕýȷʹÓúÍÓÅ»¯Ë÷Òý¶¼·Ç³£ÓаïÖú£¬ÀýÈçÖªµÀÁËInnoDBµÄË÷ÒýʵÏֺ󣬾ͺÜÈÝÒ×Ã÷°×Ϊʲô²»½¨ÒéʹÓùý³¤µÄ×Ö¶Î×÷ΪÖ÷¼ü£¬ÒòΪËùÓи¨ÖúË÷Òý¶¼ÒýÓÃÖ÷Ë÷Òý£¬¹ý³¤µÄÖ÷Ë÷Òý»áÁÖúË÷Òý±äµÃ¹ý´ó¡£ÔÙÀýÈ磬Ó÷ǵ¥µ÷µÄ×Ö¶Î×÷ΪÖ÷¼üÔÚInnoDBÖв»ÊǸöºÃÖ÷Ò⣬ÒòΪInnoDBÊý¾ÝÎļþ±¾ÉíÊÇÒ»¿ÅB+Tree£¬·Çµ¥µ÷µÄÖ÷¼ü»áÔì³ÉÔÚ²åÈëмǼʱÊý¾ÝÎļþΪÁËά³ÖB+TreeµÄÌØÐÔ¶øƵ·±µÄ·ÖÁѵ÷Õû£¬Ê®·ÖµÍЧ£¬¶øʹÓÃ×ÔÔö×Ö¶Î×÷ΪÖ÷¼üÔòÊÇÒ»¸öºÜºÃµÄÑ¡Ôñ¡£
ÏÂÒ»Õ½«¾ßÌåÌÖÂÛÕâЩÓëË÷ÒýÓйصÄÓÅ»¯²ßÂÔ¡£
MySQLµÄÓÅ»¯Ö÷Òª·ÖΪ½á¹¹ÓÅ»¯£¨Scheme optimization£©ºÍ²éѯÓÅ»¯£¨Query optimization£©¡£±¾ÕÂÌÖÂ۵ĸßÐÔÄÜË÷Òý²ßÂÔÖ÷ÒªÊôÓڽṹÓÅ»¯·¶³ë¡£±¾ÕµÄÄÚÈÝÍêÈ«»ùÓÚÉÏÎĵÄÀíÂÛ»ù´¡£¬Êµ¼ÊÉÏÒ»µ©Àí½âÁËË÷Òý±³ºóµÄ»úÖÆ£¬ÄÇôѡÔñ¸ßÐÔÄܵIJßÂԾͱä³ÉÁË´¿´âµÄÍÆÀí£¬²¢ÇÒ¿ÉÒÔÀí½âÕâЩ²ßÂÔ±³ºóµÄÂß¼¡£
ΪÁËÌÖÂÛË÷Òý²ßÂÔ£¬ÐèÒªÒ»¸öÊý¾ÝÁ¿²»ËãСµÄÊý¾Ý¿â×÷ΪʾÀý¡£±¾ÎÄÑ¡ÓÃMySQL¹Ù·½ÎĵµÖÐÌṩµÄʾÀýÊý¾Ý¿âÖ®Ò»£ºemployees¡£Õâ¸öÊý¾Ý¿â¹Øϵ¸´ÔÓ¶ÈÊÊÖУ¬ÇÒÊý¾ÝÁ¿½Ï´ó¡£ÏÂͼÊÇÕâ¸öÊý¾Ý¿âµÄE-R¹Øϵͼ£¨ÒýÓÃ×ÔMySQL¹Ù·½Êֲᣩ£º
ͼ12
MySQL¹Ù·½ÎĵµÖйØÓÚ´ËÊý¾Ý¿âµÄÒ³ÃæΪhttp://dev.mysql.com/doc/employee/en/employee.html¡£ÀïÃæÏêϸ½éÉÜÁË´ËÊý¾Ý¿â£¬²¢ÌṩÁËÏÂÔصØÖ·ºÍµ¼Èë·½·¨£¬Èç¹ûÓÐÐËȤµ¼Èë´ËÊý¾Ý¿âµ½×Ô¼ºµÄMySQL¿ÉÒԲο¼ÎÄÖÐÄÚÈÝ¡£
¸ßЧʹÓÃË÷ÒýµÄÊ×ÒªÌõ¼þÊÇÖªµÀʲôÑùµÄ²éѯ»áʹÓõ½Ë÷Òý£¬Õâ¸öÎÊÌâºÍB+TreeÖеġ°×î×óǰ׺ÔÀí¡±Óйأ¬ÏÂÃæͨ¹ýÀý×Ó˵Ã÷×î×óǰ׺ÔÀí¡£
ÕâÀïÏÈ˵һÏÂÁªºÏË÷ÒýµÄ¸ÅÄî¡£ÔÚÉÏÎÄÖУ¬ÎÒÃǶ¼ÊǼÙÉèË÷ÒýÖ»ÒýÓÃÁ˵¥¸öµÄÁУ¬Êµ¼ÊÉÏ£¬MySQLÖеÄË÷Òý¿ÉÒÔÒÔÒ»¶¨Ë³ÐòÒýÓöà¸öÁУ¬ÕâÖÖË÷Òý½Ð×öÁªºÏË÷Òý£¬Ò»°ãµÄ£¬Ò»¸öÁªºÏË÷ÒýÊÇÒ»¸öÓÐÐòÔª×é<a1, a2, ¡, an>£¬ÆäÖи÷¸öÔªËؾùΪÊý¾Ý±íµÄÒ»ÁУ¬Êµ¼ÊÉÏÒªÑϸñ¶¨ÒåË÷ÒýÐèÒªÓõ½¹Øϵ´úÊý£¬µ«ÊÇÕâÀïÎÒ²»ÏëÌÖÂÛÌ«¶à¹Øϵ´úÊýµÄ»°Ì⣬ÒòΪÄÇÑù»áÏԵúܿÝÔËùÒÔÕâÀï¾Í²»ÔÙ×öÑϸñ¶¨Òå¡£ÁíÍ⣬µ¥ÁÐË÷Òý¿ÉÒÔ¿´³ÉÁªºÏË÷ÒýÔªËØÊýΪ1µÄÌØÀý¡£
ÒÔemployees.titles±íΪÀý£¬ÏÂÃæÏȲ鿴ÆäÉ϶¼ÓÐÄÄЩË÷Òý£º
1
2
3
4
5
6
7
8
9
|
SHOW INDEX FROM employees.titles; + --------+------------+----------+--------------+-------------+-----------+-------------+------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Null | Index_type | + --------+------------+----------+--------------+-------------+-----------+-------------+------+------------+ | titles | 0 | PRIMARY | 1 | emp_no | A | NULL | | BTREE | | titles | 0 | PRIMARY | 2 | title | A | NULL | | BTREE | | titles | 0 | PRIMARY | 3 | from_date | A | 443308 | | BTREE | | titles | 1 | emp_no | 1 | emp_no | A | 443308 | | BTREE | + --------+------------+----------+--------------+-------------+-----------+-------------+------+------------+ |
´Ó½á¹ûÖпÉÒÔµ½titles±íµÄÖ÷Ë÷ÒýΪ<emp_no, title, from_date>£¬»¹ÓÐÒ»¸ö¸¨ÖúË÷Òý<emp_no>¡£ÎªÁ˱ÜÃâ¶à¸öË÷ÒýʹÊÂÇé±ä¸´ÔÓ£¨MySQLµÄSQLÓÅ»¯Æ÷ÔÚ¶àË÷ÒýʱÐÐΪ±È½Ï¸´ÔÓ£©£¬ÕâÀïÎÒÃǽ«¸¨ÖúË÷Òýdropµô£º
1
|
ALTER TABLE employees.titles DROP INDEX emp_no; |
ÕâÑù¾Í¿ÉÒÔרÐÄ·ÖÎöË÷ÒýPRIMARYµÄÐÐΪÁË¡£
Çé¿öÒ»£ºÈ«ÁÐÆ¥Åä¡£
1
2
3
4
5
6
|
EXPLAIN SELECT * FROM employees.titles WHERE emp_no= '10001' AND title= 'Senior Engineer' AND from_date= '1986-06-26' ; + ----+-------------+--------+-------+---------------+---------+---------+-------------------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+--------+-------+---------------+---------+---------+-------------------+------+-------+ | 1 | SIMPLE | titles | const | PRIMARY | PRIMARY | 59 | const,const,const | 1 | | + ----+-------------+--------+-------+---------------+---------+---------+-------------------+------+-------+ |
ºÜÃ÷ÏÔ£¬µ±°´ÕÕË÷ÒýÖÐËùÓÐÁнøÐо«È·Æ¥Å䣨ÕâÀᆱȷƥÅäÖ¸¡°=¡±»ò¡°IN¡±Æ¥Å䣩ʱ£¬Ë÷Òý¿ÉÒÔ±»Óõ½¡£ÕâÀïÓÐÒ»µãÐèҪעÒ⣬ÀíÂÛÉÏË÷Òý¶Ô˳ÐòÊÇÃô¸ÐµÄ£¬µ«ÊÇÓÉÓÚMySQLµÄ²éѯÓÅ»¯Æ÷»á×Ô¶¯µ÷Õûwhere×Ó¾äµÄÌõ¼þ˳ÐòÒÔʹÓÃÊʺϵÄË÷Òý£¬ÀýÈçÎÒÃǽ«whereÖеÄÌõ¼þ˳Ðòµßµ¹£º
1
2
3
4
5
6
|
EXPLAIN SELECT * FROM employees.titles WHERE from_date= '1986-06-26' AND emp_no= '10001' AND title= 'Senior Engineer' ; + ----+-------------+--------+-------+---------------+---------+---------+-------------------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+--------+-------+---------------+---------+---------+-------------------+------+-------+ | 1 | SIMPLE | titles | const | PRIMARY | PRIMARY | 59 | const,const,const | 1 | | + ----+-------------+--------+-------+---------------+---------+---------+-------------------+------+-------+ |
Ч¹ûÊÇÒ»ÑùµÄ¡£
Çé¿ö¶þ£º×î×óǰ׺ƥÅä¡£
1
2
3
4
5
6
|
EXPLAIN SELECT * FROM employees.titles WHERE emp_no= '10001' ; + ----+-------------+--------+------+---------------+---------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+--------+------+---------------+---------+---------+-------+------+-------+ | 1 | SIMPLE | titles | ref | PRIMARY | PRIMARY | 4 | const | 1 | | + ----+-------------+--------+------+---------------+---------+---------+-------+------+-------+ |
µ±²éѯÌõ¼þ¾«È·Æ¥ÅäË÷ÒýµÄ×ó±ßÁ¬ÐøÒ»¸ö»ò¼¸¸öÁÐʱ£¬Èç<emp_no>»ò<emp_no, title>£¬ËùÒÔ¿ÉÒÔ±»Óõ½£¬µ«ÊÇÖ»ÄÜÓõ½Ò»²¿·Ö£¬¼´Ìõ¼þËù×é³ÉµÄ×î×óǰ׺¡£ÉÏÃæµÄ²éѯ´Ó·ÖÎö½á¹û¿´Óõ½ÁËPRIMARYË÷Òý£¬µ«ÊÇkey_lenΪ4£¬ËµÃ÷Ö»Óõ½ÁËË÷ÒýµÄµÚÒ»ÁÐǰ׺¡£
Çé¿öÈý£º²éѯÌõ¼þÓõ½ÁËË÷ÒýÖÐÁеľ«È·Æ¥Å䣬µ«ÊÇÖмäij¸öÌõ¼þδÌṩ¡£
1
2
3
4
5
6
|
EXPLAIN SELECT * FROM employees.titles WHERE emp_no= '10001' AND from_date= '1986-06-26' ; + ----+-------------+--------+------+---------------+---------+---------+-------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+--------+------+---------------+---------+---------+-------+------+-------------+ | 1 | SIMPLE | titles | ref | PRIMARY | PRIMARY | 4 | const | 1 | Using where | + ----+-------------+--------+------+---------------+---------+---------+-------+------+-------------+ |
´ËʱË÷ÒýʹÓÃÇé¿öºÍÇé¿ö¶þÏàͬ£¬ÒòΪtitleδÌṩ£¬ËùÒÔ²éѯֻÓõ½ÁËË÷ÒýµÄµÚÒ»ÁУ¬¶øºóÃæµÄfrom_dateËäȻҲÔÚË÷ÒýÖУ¬µ«ÊÇÓÉÓÚtitle²»´æÔÚ¶øÎÞ·¨ºÍ×óǰ׺Á¬½Ó£¬Òò´ËÐèÒª¶Ô½á¹û½øÐÐɨÃè¹ýÂËfrom_date£¨ÕâÀïÓÉÓÚemp_noΨһ£¬ËùÒÔ²»´æÔÚɨÃ裩¡£Èç¹ûÏëÈÃfrom_dateҲʹÓÃË÷Òý¶ø²»ÊÇwhere¹ýÂË£¬¿ÉÒÔÔö¼ÓÒ»¸ö¸¨ÖúË÷Òý<emp_no, from_date>£¬´ËʱÉÏÃæµÄ²éѯ»áʹÓÃÕâ¸öË÷Òý¡£³ý´ËÖ®Í⣬»¹¿ÉÒÔʹÓÃÒ»ÖÖ³Æ֮Ϊ¡°¸ôÀëÁС±µÄÓÅ»¯·½·¨£¬½«emp_noÓëfrom_dateÖ®¼äµÄ¡°¿Ó¡±ÌîÉÏ¡£
Ê×ÏÈÎÒÃÇ¿´ÏÂtitleÒ»¹²Óм¸ÖÖ²»Í¬µÄÖµ£º
1
2
3
4
5
6
7
8
9
10
11
12
|
SELECT DISTINCT (title) FROM employees.titles; + --------------------+ | title | + --------------------+ | Senior Engineer | | Staff | | Engineer | | Senior Staff | | Assistant Engineer | | Technique Leader | | Manager | + --------------------+ |
Ö»ÓÐ7ÖÖ¡£ÔÚÕâÖÖ³ÉΪ¡°¿Ó¡±µÄÁÐÖµ±È½ÏÉÙµÄÇé¿öÏ£¬¿ÉÒÔ¿¼ÂÇÓá°IN¡±À´Ìî²¹Õâ¸ö¡°¿Ó¡±´Ó¶øÐγÉ×î×óǰ׺£º
1
2
3
4
5
6
7
8
9
|
EXPLAIN SELECT * FROM employees.titles WHERE emp_no= '10001' AND title IN ( 'Senior Engineer' , 'Staff' , 'Engineer' , 'Senior Staff' , 'Assistant Engineer' , 'Technique Leader' , 'Manager' ) AND from_date= '1986-06-26' ; + ----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ | 1 | SIMPLE | titles | range | PRIMARY | PRIMARY | 59 | NULL | 7 | Using where | + ----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ |
Õâ´Îkey_lenΪ59£¬ËµÃ÷Ë÷Òý±»ÓÃÈ«ÁË£¬µ«ÊÇ´ÓtypeºÍrows¿´³öINʵ¼ÊÉÏÖ´ÐÐÁËÒ»¸örange²éѯ£¬ÕâÀï¼ì²éÁË7¸ökey¡£¿´ÏÂÁ½ÖÖ²éѯµÄÐÔÄܱȽϣº
1
2
3
4
5
6
7
|
SHOW PROFILES; + ----------+------------+-------------------------------------------------------------------------------+ | Query_ID | Duration | Query | + ----------+------------+-------------------------------------------------------------------------------+ | 10 | 0.00058000 | SELECT * FROM employees.titles WHERE emp_no= '10001' AND from_date= '1986-06-26' | | 11 | 0.00052500 | SELECT * FROM employees.titles WHERE emp_no= '10001' AND title IN ... | + ----------+------------+-------------------------------------------------------------------------------+ |
¡°Ìî¿Ó¡±ºóÐÔÄÜÌáÉýÁËÒ»µã¡£Èç¹û¾¹ýemp_noɸѡºóÓàϺܶàÊý¾Ý£¬ÔòºóÕßÐÔÄÜÓÅÊÆ»á¸ü¼ÓÃ÷ÏÔ¡£µ±È»£¬Èç¹ûtitleµÄÖµºÜ¶à£¬ÓÃÌî¿Ó¾Í²»ºÏÊÊÁË£¬±ØÐ뽨Á¢¸¨ÖúË÷Òý¡£
Çé¿öËÄ£º²éѯÌõ¼þûÓÐÖ¸¶¨Ë÷ÒýµÚÒ»ÁС£
1
2
3
4
5
6
|
EXPLAIN SELECT * FROM employees.titles WHERE from_date= '1986-06-26' ; + ----+-------------+--------+------+---------------+------+---------+------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+--------+------+---------------+------+---------+------+--------+-------------+ | 1 | SIMPLE | titles | ALL | NULL | NULL | NULL | NULL | 443308 | Using where | + ----+-------------+--------+------+---------------+------+---------+------+--------+-------------+ |
ÓÉÓÚ²»ÊÇ×î×óǰ׺£¬Ë÷ÒýÕâÑùµÄ²éѯÏÔÈ»Óò»µ½Ë÷Òý¡£
Çé¿öÎ壺ƥÅäijÁеÄǰ׺×Ö·û´®¡£
1
2
3
4
5
6
|
EXPLAIN SELECT * FROM employees.titles WHERE emp_no= '10001' AND title LIKE 'Senior%' ; + ----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ | 1 | SIMPLE | titles | range | PRIMARY | PRIMARY | 56 | NULL | 1 | Using where | + ----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ |
´Ëʱ¿ÉÒÔÓõ½Ë÷Òý£¬µ«ÊÇÈç¹ûͨÅä·û²»ÊÇÖ»³öÏÖÔÚĩ⣬ÔòÎÞ·¨Ê¹ÓÃË÷Òý¡££¨ÔÎıíÊöÓÐÎó£¬Èç¹ûͨÅä·û%²»³öÏÖÔÚ¿ªÍ·£¬Ôò¿ÉÒÔÓõ½Ë÷Òý£¬µ«¸ù¾Ý¾ßÌåÇé¿ö²»Í¬¿ÉÄÜÖ»»áÓÃÆäÖÐÒ»¸öǰ׺£©
Çé¿öÁù£º·¶Î§²éѯ¡£
1
2
3
4
5
6
|
EXPLAIN SELECT * FROM employees.titles WHERE emp_no < '10010' and title= 'Senior Engineer' ; + ----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ | 1 | SIMPLE | titles | range | PRIMARY | PRIMARY | 4 | NULL | 16 | Using where | + ----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ |
·¶Î§ÁпÉÒÔÓõ½Ë÷Òý£¨±ØÐëÊÇ×î×óǰ׺£©£¬µ«ÊÇ·¶Î§ÁкóÃæµÄÁÐÎÞ·¨Óõ½Ë÷Òý¡£Í¬Ê±£¬Ë÷Òý×î¶àÓÃÓÚÒ»¸ö·¶Î§ÁУ¬Òò´ËÈç¹û²éѯÌõ¼þÖÐÓÐÁ½¸ö·¶Î§ÁÐÔòÎÞ·¨È«Óõ½Ë÷Òý¡£
1
2
3
4
5
6
7
8
9
|
EXPLAIN SELECT * FROM employees.titles WHERE emp_no < 10010 ' AND title='</code><code class="sql plain" style="border:0px !important;margin:0px !important;padding:0px !important;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;border-radius:0px !important;bottom:auto !important;float:none !important;height:auto !important;left:auto !important;line-height:1.1em !important;outline:0px !important;overflow:visible !important;position:static !important;right:auto !important;top:auto !important;vertical-align:baseline !important;width:auto !important;box-sizing:content-box !important;min-height:auto !important;background:none !important;">Senior Engineer ' AND from_date BETWEEN ' 1986-01-01 ' AND ' 1986-12-31'; + ----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ | 1 | SIMPLE | titles | range | PRIMARY | PRIMARY | 4 | NULL | 16 | Using where | + ----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ |
¿ÉÒÔ¿´µ½Ë÷Òý¶ÔµÚ¶þ¸ö·¶Î§Ë÷ÒýÎÞÄÜΪÁ¦¡£ÕâÀïÌرðҪ˵Ã÷MySQLÒ»¸öÓÐÒâ˼µÄµØ·½£¬ÄǾÍÊǽöÓÃexplain¿ÉÄÜÎÞ·¨Çø·Ö·¶Î§Ë÷ÒýºÍ¶àֵƥÅ䣬ÒòΪÔÚtypeÖÐÕâÁ½Õ߶¼ÏÔʾΪrange¡£Í¬Ê±£¬ÓÃÁË¡°between¡±²¢²»ÒâζמÍÊÇ·¶Î§²éѯ£¬ÀýÈçÏÂÃæµÄ²éѯ£º
1
2
3
4
5
6
7
8
9
|
EXPLAIN SELECT * FROM employees.titles WHERE emp_no BETWEEN '10001' AND '10010' AND title= 'Senior Engineer' AND from_date BETWEEN '1986-01-01' AND '1986-12-31' ; + ----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ | 1 | SIMPLE | titles | range | PRIMARY | PRIMARY | 59 | NULL | 16 | Using where | + ----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+ |
¿´ÆðÀ´ÊÇÓÃÁËÁ½¸ö·¶Î§²éѯ£¬µ«×÷ÓÃÓÚemp_noÉϵġ°BETWEEN¡±Êµ¼ÊÉÏÏ൱ÓÚ¡°IN¡±£¬Ò²¾ÍÊÇ˵emp_noʵ¼ÊÊǶàÖµ¾«È·Æ¥Åä¡£¿ÉÒÔ¿´µ½Õâ¸ö²éѯÓõ½ÁËË÷ÒýÈ«²¿Èý¸öÁС£Òò´ËÔÚMySQLÖÐÒª½÷É÷µØÇø·Ö¶àֵƥÅäºÍ·¶Î§Æ¥Å䣬·ñÔò»á¶ÔMySQLµÄÐÐΪ²úÉúÀ§»ó¡£
Çé¿öÆߣº²éѯÌõ¼þÖк¬Óк¯Êý»ò±í´ïʽ¡£
ºÜ²»ÐÒ£¬Èç¹û²éѯÌõ¼þÖк¬Óк¯Êý»ò±í´ïʽ£¬ÔòMySQL²»»áΪÕâÁÐʹÓÃË÷Òý£¨ËäȻijЩÔÚÊýѧÒâÒåÉÏ¿ÉÒÔʹÓã©¡£ÀýÈ磺
1
2
3
4
5
6
|
EXPLAIN SELECT * FROM employees.titles WHERE emp_no= '10001' AND left (title, 6)= 'Senior' ; + ----+-------------+--------+------+---------------+---------+---------+-------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+--------+------+---------------+---------+---------+-------+------+-------------+ | 1 | SIMPLE | titles | ref | PRIMARY | PRIMARY | 4 | const | 1 | Using where | + ----+-------------+--------+------+---------------+---------+---------+-------+------+-------------+ |
ËäÈ»Õâ¸ö²éѯºÍÇé¿öÎåÖй¦ÄÜÏàͬ£¬µ«ÊÇÓÉÓÚʹÓÃÁ˺¯Êýleft£¬ÔòÎÞ·¨ÎªtitleÁÐÓ¦ÓÃË÷Òý£¬¶øÇé¿öÎåÖÐÓÃLIKEÔò¿ÉÒÔ¡£ÔÙÈ磺
1
2
3
4
5
6
|
EXPLAIN SELECT * FROM employees.titles WHERE emp_no - 1= '10000' ; + ----+-------------+--------+------+---------------+------+---------+------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+--------+------+---------------+------+---------+------+--------+-------------+ | 1 | SIMPLE | titles | ALL | NULL | NULL | NULL | NULL | 443308 | Using where | + ----+-------------+--------+------+---------------+------+---------+------+--------+-------------+ |
ÏÔÈ»Õâ¸ö²éѯµÈ¼ÛÓÚ²éѯemp_noΪ10001µÄº¯Êý£¬µ«ÊÇÓÉÓÚ²éѯÌõ¼þÊÇÒ»¸ö±í´ïʽ£¬MySQLÎÞ·¨ÎªÆäʹÓÃË÷Òý¡£¿´À´MySQL»¹Ã»ÓÐÖÇÄܵ½×Ô¶¯ÓÅ»¯³£Á¿±í´ïʽµÄ³Ì¶È£¬Òò´ËÔÚд²éѯÓï¾äʱ¾¡Á¿±ÜÃâ±í´ïʽ³öÏÖÔÚ²éѯÖУ¬¶øÊÇÏÈÊÖ¹¤Ë½Ï´úÊýÔËË㣬ת»»ÎªÎÞ±í´ïʽµÄ²éѯÓï¾ä¡£
¼ÈÈ»Ë÷Òý¿ÉÒÔ¼Ó¿ì²éѯËٶȣ¬ÄÇôÊDz»ÊÇÖ»ÒªÊDzéѯÓï¾äÐèÒª£¬¾Í½¨ÉÏË÷Òý£¿´ð°¸ÊÇ·ñ¶¨µÄ¡£ÒòΪË÷ÒýËäÈ»¼Ó¿ìÁ˲éѯËٶȣ¬µ«Ë÷ÒýÒ²ÊÇÓдú¼ÛµÄ£ºË÷ÒýÎļþ±¾ÉíÒªÏûºÄ´æ´¢¿Õ¼ä£¬Í¬Ê±Ë÷Òý»á¼ÓÖزåÈ롢ɾ³ýºÍÐ޸ļǼʱµÄ¸ºµ££¬ÁíÍ⣬MySQLÔÚÔËÐÐʱҲҪÏûºÄ×ÊԴά»¤Ë÷Òý£¬Òò´ËË÷Òý²¢²»ÊÇÔ½¶àÔ½ºÃ¡£Ò»°ãÁ½ÖÖÇé¿öϲ»½¨Ò齨Ë÷Òý¡£
µÚÒ»ÖÖÇé¿öÊDZí¼Ç¼±È½ÏÉÙ£¬ÀýÈçÒ»Á½Ç§ÌõÉõÖÁÖ»Óм¸°ÙÌõ¼Ç¼µÄ±í£¬Ã»±ØÒª½¨Ë÷Òý£¬Èòéѯ×öÈ«±íɨÃè¾ÍºÃÁË¡£ÖÁÓÚ¶àÉÙÌõ¼Ç¼²ÅËã¶à£¬Õâ¸ö¸öÈËÓиöÈ˵Ŀ´·¨£¬ÎÒ¸öÈ˵ľÑéÊÇÒÔ2000×÷Ϊ·Ö½çÏߣ¬¼Ç¼Êý²»³¬¹ý 2000¿ÉÒÔ¿¼ÂDz»½¨Ë÷Òý£¬³¬¹ý2000Ìõ¿ÉÒÔ×ÃÇ鿼ÂÇË÷Òý¡£
ÁíÒ»ÖÖ²»½¨Ò齨Ë÷ÒýµÄÇé¿öÊÇË÷ÒýµÄÑ¡ÔñÐԽϵ͡£ËùνË÷ÒýµÄÑ¡ÔñÐÔ£¨Selectivity£©£¬ÊÇÖ¸²»Öظ´µÄË÷ÒýÖµ£¨Ò²½Ð»ùÊý£¬Cardinality£©Óë±í¼Ç¼Êý£¨#T£©µÄ±ÈÖµ£º
Index Selectivity = Cardinality / #T
ÏÔȻѡÔñÐÔµÄÈ¡Öµ·¶Î§Îª(0, 1]£¬Ñ¡ÔñÐÔÔ½¸ßµÄË÷Òý¼ÛÖµÔ½´ó£¬ÕâÊÇÓÉB+TreeµÄÐÔÖʾö¶¨µÄ¡£ÀýÈ磬ÉÏÎÄÓõ½µÄemployees.titles±í£¬Èç¹ûtitle×ֶξ³£±»µ¥¶À²éѯ£¬ÊÇ·ñÐèÒª½¨Ë÷Òý£¬ÎÒÃÇ¿´Ò»ÏÂËüµÄÑ¡ÔñÐÔ£º
1
2
3
4
5
6
|
SELECT count ( DISTINCT (title))/ count (*) AS Selectivity FROM employees.titles; + -------------+ | Selectivity | + -------------+ | 0.0000 | + -------------+ |
titleµÄÑ¡ÔñÐÔ²»×ã0.0001£¨¾«È·ÖµÎª0.00001579£©£¬ËùÒÔʵÔÚûÓÐʲô±ØҪΪÆäµ¥¶À½¨Ë÷Òý¡£
ÓÐÒ»ÖÖÓëË÷ÒýÑ¡ÔñÐÔÓйصÄË÷ÒýÓÅ»¯²ßÂÔ½Ð×öǰ׺Ë÷Òý£¬¾ÍÊÇÓÃÁеÄǰ׺´úÌæÕû¸öÁÐ×÷ΪË÷Òýkey£¬µ±Ç°×º³¤¶ÈºÏÊÊʱ£¬¿ÉÒÔ×öµ½¼ÈʹµÃǰ׺Ë÷ÒýµÄÑ¡ÔñÐÔ½Ó½üÈ«ÁÐË÷Òý£¬Í¬Ê±ÒòΪË÷Òýkey±ä¶Ì¶ø¼õÉÙÁËË÷ÒýÎļþµÄ´óСºÍά»¤¿ªÏú¡£ÏÂÃæÒÔemployees.employees±íΪÀý½éÉÜǰ׺Ë÷ÒýµÄÑ¡ÔñºÍʹÓá£
´Óͼ12¿ÉÒÔ¿´µ½employees±íÖ»ÓÐÒ»¸öË÷Òý<emp_no>£¬ÄÇôÈç¹ûÎÒÃÇÏë°´Ãû×ÖËÑË÷Ò»¸öÈË£¬¾ÍÖ»ÄÜÈ«±íɨÃèÁË£º
1
2
3
4
5
6
|
EXPLAIN SELECT * FROM employees.employees WHERE first_name= 'Eric' AND last_name= 'Anido' ; + ----+-------------+-----------+------+---------------+------+---------+------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+-----------+------+---------------+------+---------+------+--------+-------------+ | 1 | SIMPLE | employees | ALL | NULL | NULL | NULL | NULL | 300024 | Using where | + ----+-------------+-----------+------+---------------+------+---------+------+--------+-------------+ |
Èç¹ûƵ·±°´Ãû×ÖËÑË÷Ô±¹¤£¬ÕâÑùÏÔȻЧÂʺܵͣ¬Òò´ËÎÒÃÇ¿ÉÒÔ¿¼Âǽ¨Ë÷Òý¡£ÓÐÁ½ÖÖÑ¡Ôñ£¬½¨<first_name>»ò<first_name, last_name>£¬¿´ÏÂÁ½¸öË÷ÒýµÄÑ¡ÔñÐÔ£º
1
2
3
4
5
6
7
8
9
10
11
12
13
|
SELECT count ( DISTINCT (first_name))/ count (*) AS Selectivity FROM employees.employees; + -------------+ | Selectivity | + -------------+ | 0.0042 | + -------------+ SELECT count ( DISTINCT (concat(first_name, last_name)))/ count (*) AS Selectivity FROM employees.employees; + -------------+ | Selectivity | + -------------+ | 0.9313 | + -------------+ |
<first_name>ÏÔȻѡÔñÐÔÌ«µÍ£¬<first_name, last_name>Ñ¡ÔñÐԺܺ㬵«ÊÇfirst_nameºÍlast_name¼ÓÆðÀ´³¤¶ÈΪ30£¬ÓÐûÓмæ¹Ë³¤¶ÈºÍÑ¡ÔñÐԵİ취£¿¿ÉÒÔ¿¼ÂÇÓÃfirst_nameºÍlast_nameµÄÇ°¼¸¸ö×Ö·û½¨Á¢Ë÷Òý£¬ÀýÈç<first_name, left(last_name, 3)>£¬¿´¿´ÆäÑ¡ÔñÐÔ£º
1
2
3
4
5
6
|
SELECT count ( DISTINCT (concat(first_name, left (last_name, 3))))/ count (*) AS Selectivity FROM employees.employees; + -------------+ | Selectivity | + -------------+ | 0.7879 | + -------------+ |
Ñ¡ÔñÐÔ»¹²»´í£¬µ«Àë0.9313»¹ÊÇÓеã¾àÀ룬ÄÇô°Ñlast_nameǰ׺¼Óµ½4£º
1
2
3
4
5
6
|
SELECT count ( DISTINCT (concat(first_name, left (last_name, 4))))/ count (*) AS Selectivity FROM employees.employees; + -------------+ | Selectivity | + -------------+ | 0.9007 | + -------------+ |
ÕâʱѡÔñÐÔÒѾºÜÀíÏëÁË£¬¶øÕâ¸öË÷ÒýµÄ³¤¶ÈÖ»ÓÐ18£¬±È<first_name, last_name>¶ÌÁ˽ӽüÒ»°ë£¬ÎÒÃÇ°ÑÕâ¸öǰ׺Ë÷Òý ½¨ÉÏ£º
1
2
|
ALTER TABLE employees.employees ADD INDEX `first_name_last_name4` (first_name, last_name(4)); |
´ËʱÔÙÖ´ÐÐÒ»±é°´Ãû×Ö²éѯ£¬±È½Ï·ÖÎöÒ»ÏÂÓ뽨Ë÷ÒýÇ°µÄ½á¹û£º
1
2
3
4
5
6
7
|
SHOW PROFILES; + ----------+------------+---------------------------------------------------------------------------------+ | Query_ID | Duration | Query | + ----------+------------+---------------------------------------------------------------------------------+ | 87 | 0.11941700 | SELECT * FROM employees.employees WHERE first_name= 'Eric' AND last_name= 'Anido' | | 90 | 0.00092400 | SELECT * FROM employees.employees WHERE first_name= 'Eric' AND last_name= 'Anido' | + ----------+------------+---------------------------------------------------------------------------------+ |
ÐÔÄܵÄÌáÉýÊÇÏÔÖøµÄ£¬²éѯËÙ¶ÈÌá¸ßÁË120¶à±¶¡£
ǰ׺Ë÷Òý¼æ¹ËË÷Òý´óСºÍ²éѯËٶȣ¬µ«ÊÇÆäȱµãÊDz»ÄÜÓÃÓÚORDER BYºÍGROUP BY²Ù×÷£¬Ò²²»ÄÜÓÃÓÚCovering index£¨¼´µ±Ë÷Òý±¾Éí°üº¬²éѯËùÐèÈ«²¿Êý¾Ýʱ£¬²»ÔÙ·ÃÎÊÊý¾ÝÎļþ±¾Éí£©¡£
ÔÚʹÓÃInnoDB´æ´¢ÒýÇæʱ£¬Èç¹ûûÓÐÌرðµÄÐèÒª£¬ÇëÓÀԶʹÓÃÒ»¸öÓëÒµÎñÎ޹صÄ×ÔÔö×Ö¶Î×÷ΪÖ÷¼ü¡£
¾³£¿´µ½ÓÐÌû×Ó»ò²©¿ÍÌÖÂÛÖ÷¼üÑ¡ÔñÎÊÌ⣬ÓÐÈ˽¨ÒéʹÓÃÒµÎñÎ޹صÄ×ÔÔöÖ÷¼ü£¬ÓÐÈ˾õµÃûÓбØÒª£¬ÍêÈ«¿ÉÒÔʹÓÃÈçѧºÅ»òÉí·ÝÖ¤ºÅÕâÖÖΨһ×Ö¶Î×÷ΪÖ÷¼ü¡£²»ÂÛÖ§³ÖÄÄÖÖÂ۵㣬´ó¶àÊýÂ۾ݶ¼ÊÇÒµÎñ²ãÃæµÄ¡£Èç¹û´ÓÊý¾Ý¿âË÷ÒýÓÅ»¯½Ç¶È¿´£¬Ê¹ÓÃInnoDBÒýÇæ¶ø²»Ê¹ÓÃ×ÔÔöÖ÷¼ü¾ø¶ÔÊÇÒ»¸öÔã¸âµÄÖ÷Òâ¡£
ÉÏÎÄÌÖÂÛ¹ýInnoDBµÄË÷ÒýʵÏÖ£¬InnoDBʹÓþۼ¯Ë÷Òý£¬Êý¾Ý¼Ç¼±¾Éí±»´æÓÚÖ÷Ë÷Òý£¨Ò»¿ÅB+Tree£©µÄÒ¶×Ó½ÚµãÉÏ¡£Õâ¾ÍÒªÇóͬһ¸öÒ¶×Ó½ÚµãÄÚ£¨´óСΪһ¸öÄÚ´æÒ³»ò´ÅÅÌÒ³£©µÄ¸÷ÌõÊý¾Ý¼Ç¼°´Ö÷¼ü˳Ðò´æ·Å£¬Òò´Ëÿµ±ÓÐÒ»ÌõеļǼ²åÈëʱ£¬MySQL»á¸ù¾ÝÆäÖ÷¼ü½«Æä²åÈëÊʵ±µÄ½ÚµãºÍλÖã¬Èç¹ûÒ³Ãæ´ïµ½×°ÔØÒò×Ó£¨InnoDBĬÈÏΪ15/16£©£¬Ôò¿ª±ÙÒ»¸öеÄÒ³£¨½Úµã£©¡£
Èç¹û±íʹÓÃ×ÔÔöÖ÷¼ü£¬ÄÇôÿ´Î²åÈëеļǼ£¬¼Ç¼¾Í»á˳ÐòÌí¼Óµ½µ±Ç°Ë÷Òý½ÚµãµÄºóÐøλÖ㬵±Ò»Ò³Ð´Âú£¬¾Í»á×Ô¶¯¿ª±ÙÒ»¸öеÄÒ³¡£ÈçÏÂͼËùʾ£º
ͼ13
ÕâÑù¾Í»áÐγÉÒ»¸ö½ô´ÕµÄË÷Òý½á¹¹£¬½üËÆ˳ÐòÌîÂú¡£ÓÉÓÚÿ´Î²åÈëʱҲ²»ÐèÒªÒƶ¯ÒÑÓÐÊý¾Ý£¬Òò´ËЧÂʺܸߣ¬Ò²²»»áÔö¼ÓºÜ¶à¿ªÏúÔÚά»¤Ë÷ÒýÉÏ¡£
Èç¹ûʹÓ÷Ç×ÔÔöÖ÷¼ü£¨Èç¹ûÉí·ÝÖ¤ºÅ»òѧºÅµÈ£©£¬ÓÉÓÚÿ´Î²åÈëÖ÷¼üµÄÖµ½üËÆÓÚËæ»ú£¬Òò´Ëÿ´Îмͼ¶¼Òª±»²åµ½ÏÖÓÐË÷ÒýÒ³µÃÖмäij¸öλÖãº
ͼ14
´ËʱMySQL²»µÃ²»ÎªÁ˽«Ð¼Ç¼²åµ½ºÏÊÊλÖöøÒƶ¯Êý¾Ý£¬ÉõÖÁÄ¿±êÒ³Ãæ¿ÉÄÜÒѾ±»»Øдµ½´ÅÅÌÉ϶ø´Ó»º´æÖÐÇåµô£¬´ËʱÓÖÒª´Ó´ÅÅÌÉ϶Á»ØÀ´£¬ÕâÔö¼ÓÁ˺ܶ࿪Ïú£¬Í¬Ê±Æµ·±µÄÒƶ¯¡¢·ÖÒ³²Ù×÷Ôì³ÉÁË´óÁ¿µÄËéƬ£¬µÃµ½Á˲»¹»½ô´ÕµÄË÷Òý½á¹¹£¬ºóÐø²»µÃ²»Í¨¹ýOPTIMIZE TABLEÀ´Öؽ¨±í²¢ÓÅ»¯Ìî³äÒ³Ãæ¡£
Òò´Ë£¬Ö»Òª¿ÉÒÔ£¬Ç뾡Á¿ÔÚInnoDBÉϲÉÓÃ×ÔÔö×Ö¶Î×öÖ÷¼ü¡£
ÕâƪÎÄÕ¶϶ÏÐøÐøдÁË°ë¸öÔ£¬Ö÷ÒªÄÚÈݾÍÊÇÉÏÃæÕâЩÁË¡£²»¿É·ñÈÏ£¬ÕâƪÎÄÕÂÔÚÒ»¶¨³Ì¶ÈÉÏÓÐÖ½ÉÏ̸±øÖ®ÏÓ£¬ÒòΪÎÒ±¾È˶ÔMySQLµÄʹÓÃÊôÓÚ²ËÄñ¼¶±ð£¬¸üûÓÐÌ«¶àÊý¾Ý¿âµ÷ÓŵľÑ飬ÔÚÕâÀï´ó̸Êý¾Ý¿âË÷Òýµ÷ÓÅÓеã´óÑÔ²»²Ñ¡£¾Íµ±ÊÇÎÒ¸öÈ˵Äһƪѧϰ±Ê¼ÇÁË¡£
ÆäʵÊý¾Ý¿âË÷Òýµ÷ÓÅÊÇÒ»Ïî¼¼Êõ»î£¬²»Äܽö½ö¿¿ÀíÂÛ£¬ÒòΪʵ¼ÊÇé¿öǧ±äÍò»¯£¬¶øÇÒMySQL±¾Éí´æÔںܸ´ÔӵĻúÖÆ£¬Èç²éѯÓÅ»¯²ßÂԺ͸÷ÖÖÒýÇæµÄʵÏÖ²îÒìµÈ¶¼»áʹÇé¿ö±äµÃ¸ü¼Ó¸´ÔÓ¡£µ«Í¬Ê±ÕâЩÀíÂÛÊÇË÷Òýµ÷ÓŵĻù´¡£¬Ö»ÓÐÔÚÃ÷°×ÀíÂ۵Ļù´¡ÉÏ£¬²ÅÄܶԵ÷ÓŲßÂÔ½øÐкÏÀíÍƶϲ¢Á˽âÆä±³ºóµÄ»úÖÆ£¬È»ºó½áºÏʵ¼ùÖв»¶ÏµÄʵÑéºÍÃþË÷£¬´Ó¶øÕæÕý´ïµ½¸ßЧʹÓÃMySQLË÷ÒýµÄÄ¿µÄ¡£
ÁíÍ⣬MySQLË÷Òý¼°ÆäÓÅ»¯º¸Ç·¶Î§·Ç³£¹ã£¬±¾ÎÄÖ»ÊÇÉæ¼°µ½ÆäÖÐÒ»²¿·Ö¡£ÈçÓëÅÅÐò£¨ORDER BY£©Ïà¹ØµÄË÷ÒýÓÅ»¯¼°¸²¸ÇË÷Òý£¨Covering index£©µÄ»°Ìâ±¾ÎIJ¢Î´Éæ¼°£¬Í¬Ê±³ýB-TreeË÷ÒýÍâMySQL»¹¸ù¾Ý²»Í¬ÒýÇæÖ§³ÖµÄ¹þÏ£Ë÷Òý¡¢È«ÎÄË÷ÒýµÈµÈ±¾ÎÄÒ²²¢Î´Éæ¼°¡£Èç¹ûÓлú»á£¬Ï£ÍûÔÙ¶Ô±¾ÎÄδÉæ¼°µÄ²¿·Ö½øÐв¹³ä°É¡£
[1] Baron ScbwartzµÈ Öø£¬ÍõС¶«µÈ Ò룻¸ßÐÔÄÜMySQL£¨High Performance MySQL£©£»µç×Ó¹¤Òµ³ö°æÉ磬2010
[2] Michael Kofler Öø£¬ÑîÏþÔÆµÈ Ò룻MySQL5ȨÍþÖ¸ÄÏ£¨The Definitive Guide to MySQL5£©£»ÈËÃñÓʵç³ö°æÉ磬2006
[3] ½ª³ÐÒ¢ Öø£»MySQL¼¼ÊõÄÚÄ»-InnoDB´æ´¢ÒýÇ棻»úе¹¤Òµ³ö°æÉ磬2011
[4] D Comer, Ubiquitous B-tree; ACM Computing Surveys (CSUR), 1979
[5] Codd, E. F. (1970). ¡°A relational model of data for large shared data banks¡±. Communications of the ACM, , Vol. 13, No. 6, pp. 377-387
[6] MySQL5.1²Î¿¼ÊÖ²á ¨C http://dev.mysql.com/doc/refman/5.1/zh/index.html
ÍƼöÐÅÏ¢
ÈÈÃÅÐÅÏ¢
- nohup: redirecting stderr to stdou....
- ʹÓÃlog_formatΪNginx·þÎñÆ÷ÉèÖøüÏêϸµÄÈÕÖ¾¸ñʽ
- jquery easyUI--dataGrid-Json
- [Ô´´]·ÂGoogle Reader¡¢ÐÂÀË΢²©¡¢ÌÚѶ΢²©µ....
- ÀûÓÃKeepalived+mysql¹¹½¨¸ß¿ÉÓÃMySQLË«Ö÷×Ô¶....
- Nginx+keepalivedʵÏÖ¸ºÔؾùºâºÍË«»úÈȱ¸¸ß¿ÉÓÃ
- jqueryʵÏÖÒ³Ãæ¼ÓÔؽø¶ÈÌõ
- Rolling cURL: PHP²¢·¢×î¼Ñʵ¼ù
- codeigniter ·ÓÉÖÕ¼«ÓÅ»¯(url rewrite)
- linuxÏÂÉèÖÃsshÎÞÃÜÂëµÇ¼
ÆÀÂÛ