±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ51cto£¬Ö÷Òª½éÉÜÁË´Ê·¨·ÖÎö£¬Óï·¨·ÖÎö£¬MySQLÓï·¨·ÖÎöÊ÷Éú³É¹ý³Ì£¬ºËÐÄÊý¾Ý½á¹¹¼°Æä¹ØÏµµÈ¡£ |
|
ÏÖ×´Ó볡¾°
SQL½âÎöÊÇÒ»ÏÔӵļ¼Êõ£¬Ò»°ã¶¼ÊÇÓÉÊý¾Ý¿â³§ÉÌÀ´ÕÆÎÕ£¬µ±È»Ò²Óй«Ë¾×¨ÃÅÌṩSQL½âÎöµÄAPI£¨²Î¿¼Á´½Ó£ºhttp://sqlparser.com/£©¡£
ÓÉÓÚÕ⼸ÄêMySQLÊý¾Ý¿âÖмä¼þµÄÐËÆð£¬ÐèÒªÖ§³Ö¶Áд·ÖÀë¡¢·Ö¿â·Ö±íµÈ¹¦ÄÜ£¬¾Í±ØÐë´ÓSQLÖгé³ö±íÃû¡¢¿âÃûÒÔ¼°Ïà¹Ø×ֶεÄÖµ¡£Òò´ËÏñJavaÓïÑÔ±àдµÄDruid£¬CÓïÑÔ±àдµÄMaxScale£¬GoÓïÑÔ±àдµÄKingshardµÈ£¬¶¼»á¶ÔSQL½øÐв¿·Ö½âÎö¡£¶øÕæÕý°ÑSQL½âÎö¼¼ÊõÓÃÓÚÊý¾Ý¿âά»¤µÄ²úÆ·½ÏÉÙ£¬Ö÷ÒªÓÐÈçϼ¸¸ö£º
ÃÀÍŵãÆÀ¿ªÔ´µÄSQLAdvisor¡£Ëü»ùÓÚMySQLÔÉú̬´Ê·¨½âÎö£¬½áºÏ·ÖÎöSQLÖеÄwhereÌõ¼þ¡¢¾ÛºÏÌõ¼þ¡¢¶à±íJoin¹ØÏµ¸ø³öË÷ÒýÓÅ»¯½¨Òé¡£
²Î¿¼Á´½Ó£ºhttps://github.com/Meituan-Dianping/SQLAdvisor
È¥ÄĶù¿ªÔ´µÄInception¡£²àÖØÓÚ¸ù¾ÝÄÚÖõĹæÔò£¬¶ÔSQL½øÐÐÉóºË¡£
²Î¿¼Á´½Ó£ºhttp://mysql-inception.github.io/inception-document
°¢ÀïµÄCloud DBA¡£¸ù¾Ý¹Ù·½Îĵµ½éÉÜ£¬ÆäÒ²ÊÇÌṩSQLÓÅ»¯½¨ÒéºÍ¸Äд¡£
²Î¿¼Á´½Ó£ºhttps://yq.aliyun.com/articles/218442
ÉÏÊö²úÆ·¶¼Óзdz£ºÏÊʵÄÓ¦Óó¡¾°£¬ÔÚÒµ½çÒ²±»¹ã·ºÊ¹Óᣵ«ÊÇSQL½âÎöµÄÓ¦Ó󡾰ԶԶûÓб»³ä·Ö·¢¾ò£¬±ÈÈ磺
»ùÓÚ±íÁ£¶ÈµÄÂý²éѯ±¨±í¡£±ÈÈ磬һ¸öSchemaÖаüº¬ÁËÊôÓÚ²»Í¬ÒµÎñÏßµÄÊý¾Ý±í£¬ÄÇô´ÓÒµÎñÏߵĽǶÈÀ´Ëµ£¬ÆäÏ£ÍûÌṩ±íÁ£¶ÈµÄÂý²éѯ±¨±í¡£
Éú³ÉSQLÌØÕ÷¡£½«SQLÓï¾äÖеÄÖµÌæ»»³ÉÎʺţ¬·½±ãSQL¹éÀà¡£ËäÈ»¿ÉÒÔʹÓÃÕýÔò±í´ïʽʵÏÖÏàͬµÄ¹¦ÄÜ£¬µ«ÊÇÆäBug½Ï¶à£¬¿ÉÒԲο¼pt-query-digest¡£±ÈÈçpt-query-digestÖУ¬»á°ÑÓöµ½µÄÊý×Ö¶¼Ìæ»»³É¡°£¿¡±£¬µ¼ÖÂÎÞ·¨Çø±ð²»Í¬Êý×Öºó׺µÄ±í¡£
¸ßΣ²Ù×÷È·ÈÏÓë¹æ±Ü¡£±ÈÈ磬DBA²»Ð¡ÐÄDropÊý¾Ý±í£¬¶ø´ËÀà²Ù×÷£¬Ä¿Ç°»¹ÎÞÓÐЧµÄ¹¤¾ß½øÐлعö£¬ÓÈÆäÊÇ´ó±í£¬Æäºó¹û½«ÊÇÔÖÄÑÐԵġ£
SQLºÏ·¨ÐÔÅжϡ£ÎªÁ˰²È«¡¢É󼯡¢¿ØÖƵȷ½ÃæµÄÔÒò£¬ÃÀÍŵãÆÀ²»»áÈÃÑз¢ÈËÔ±Ö±½Ó²Ù×÷Êý¾Ý¿â£¬¶øÊÇÌṩRDS·þÎñ¡£ÓÈÆäÊǶÔÓÚÊý¾Ý±ä¸ü£¬ÐèÒªÑз¢ÈËÔ±µÄÉϼ¶Ö÷¹Ü½øÐÐÒµÎñÉϵÄÉóÅú¡£Èç¹ûÑз¢ÈËÔ±£¬Ð´ÁËÒ»ÌõÓï·¨´íÎóµÄSQL£¬¶øRDSÎÞ·¨ÅжϸÃSQLÊÇ·ñºÏ·¨£¬¾Í»áÔì³É²»±ØÒªµÄ¹µÍ¨³É±¾¡£
Òò´ËΪÁËÈÃËùÓÐÓÐÐèÒªµÄÒµÎñ¶¼ÄÜ·½±ãµØÊ¹ÓÃSQL½âÎö¹¦ÄÜ£¬ÎÒÃÇÈÏΪӦ¸Ã¾ßÓÐÈçÏÂÌØÐÔ£º
Ö±½Ó±©Â¶SQL½âÎö½Ó¿Ú£¬Ê¹Óþ¡Á¿¼òµ¥¡£±ÈÈ磺ÊäÈëSQL£¬ÔòÊä³ö±íÃû¡¢ÌØÕ÷ºÍÓÅ»¯½¨Òé¡£
½Ó¿ÚµÄʹÓò»ÒÀÀµÓÚÌØ¶¨µÄÓïÑÔ£¬·ñÔòά»¤ºÍʹÓõĴú¼ÛÌ«¸ß¡£±ÈÈ磺ÒÔHTTPµÈ·½Ê½Ìṩ·þÎñ¡£
ǧÀïÖ®ÐУ¬Ê¼ÓÚ×ãÏ£¬ÏÂÃæÎÒÏȽéÉÜÏÂSQLµÄ½âÎöÔÀí¡£
ÔÀí
SQL½âÎöÓëÓÅ»¯ÊÇÊôÓÚ±àÒëÆ÷·¶³ë£¬ºÍCÓïÑÔµÈÆäËûÓïÑԵĽâÎöûÓб¾ÖʵÄÇø±ð¡£ÆäÖзÖΪ´Ê·¨·ÖÎö¡¢Óï·¨ºÍÓïÒå·ÖÎö¡¢ÓÅ»¯¡¢Ö´ÐдúÂëÉú³É¡£¶ÔÓ¦µ½MySQLµÄ²¿·Ö£¬ÈçÏÂͼ£º

SQL½âÎöÔÀí
1¡¢´Ê·¨·ÖÎö
SQL½âÎöÓÉ´Ê·¨·ÖÎöºÍÓï·¨/ÓïÒå·ÖÎöÁ½¸ö²¿·Ö×é³É¡£´Ê·¨·ÖÎöÖ÷ÒªÊǰÑÊäÈëת»¯³ÉÒ»¸ö¸öToken¡£ÆäÖÐTokenÖаüº¬Keyword£¨Ò²³Æsymbol£©ºÍ·ÇKeyword¡£ÀýÈ磺SQLÓï¾äselect
username from userinfo£¬ÔÚ·ÖÎöÖ®ºó£¬»áµÃµ½4¸öToken£¬ÆäÖÐÓÐ2¸öKeyword£¬·Ö±ðΪselectºÍfrom£º

ͨ³£Çé¿öÏ£¬´Ê·¨·ÖÎö¿ÉÒÔʹÓÃFlexÀ´Éú³É¡£
²Î¿¼Á´½Ó£ºhttps://www.gnu.org/software/flex
µ«ÊÇMySQL²¢Î´Ê¹Óøù¤¾ß£¬¶øÊÇÊÖдÁË´Ê·¨·ÖÎö²¿·Ö£¨¾Ý˵ÊÇΪÁËЧÂʺÍÁé»îÐÔ£¬¿É²Î¿¼£ºhttps://yq.aliyun.com/articles/71979£©¡£¾ßÌå´úÂëÔÚsql/lex.hºÍsql/sql_lex.ccÎļþÖС£
MySQLÖеÄKeyword¶¨ÒåÔÚsql/lex.hÖУ¬ÈçÏÂΪ²¿·ÖKeyword£º
{ "&&", SYM(AND_AND_SYM)},
{ "<", SYM(LT)},
{ "<=", SYM(LE)},
{ "<>", SYM(NE)},
{ "!=", SYM(NE)},
{ "=", SYM(EQ)},
{ ">", SYM(GT_SYM)},
{ ">=", SYM(GE)},
{ "<<", SYM(SHIFT_LEFT)},
{ ">>", SYM(SHIFT_RIGHT)},
{ "<=>", SYM(EQUAL_SYM)},
{ "ACCESSIBLE", SYM(ACCESSIBLE_SYM)},
{ "ACTION", SYM(ACTION)},
{ "ADD", SYM(ADD)},
{ "AFTER", SYM(AFTER_SYM)},
{ "AGAINST", SYM(AGAINST)},
{ "AGGREGATE", SYM(AGGREGATE_SYM)},
{ "ALL", SYM(ALL)}, |
´Ê·¨·ÖÎöµÄºËÐÄ´úÂëÔÚsql/sql_lex.cÎļþÖеÄMySQLLex¡úlex_one_Token£¬ÓÐÐËȤµÄͬѧ¿ÉÒÔÏÂÔØÔ´ÂëÑо¿¡£
2¡¢Óï·¨·ÖÎö
Óï·¨·ÖÎö¾ÍÊÇÉú³ÉÓï·¨Ê÷µÄ¹ý³Ì¡£ÕâÊÇÕû¸ö½âÎö¹ý³ÌÖÐ×»ª¡¢×ÔӵIJ¿·Ö£¬²»¹ýÕⲿ·ÖMySQLʹÓÃÁËBisonÀ´Íê³É¡£¼´Ê¹Èç´Ë£¬ÈçºÎÉè¼ÆºÏÊʵÄÊý¾Ý½á¹¹ÒÔ¼°Ïà¹ØËã·¨£¬È¥´æ´¢ºÍ±éÀúËùÓеÄÐÅÏ¢£¬Ò²ÊÇÖµµÃÔÚÕâÀïÑо¿µÄ¡£
Óï·¨·ÖÎöÊ÷
SQLÓï¾ä£º
select username, ismale from userinfo
where age > 20 and level > 5 and 1 = 1 |
»áÉú³ÉÈçÏÂÓï·¨Ê÷£º

Óï·¨Ê÷
¶ÔÓÚδ½Ó´¥¹ý±àÒëÆ÷ʵÏÖµÄͬѧ£¬¿Ï¶¨»áºÃÆæÈçºÎ²ÅÄÜÉú³ÉÕâÑùµÄÓï·¨Ê÷£¬²»¹ýÆä±³ºóµÄÔÀí¶¼ÊDZàÒëÆ÷µÄ·¶³ë£¬´ó¼Ò¿ÉÒԲο¼Î¬»ù°Ù¿ÆµÄһƪÎÄÕ£¬ÒÔ¼°¸ÃÁ´½ÓÖеIJο¼Êé¼®¡£±¾ÈËÒ²ÊÇÔÚѧϰMySQLÔ´Âë¹ý³ÌÖУ¬ÔĶÁÁ˲¿·ÖÄÚÈÝ¡£
²Î¿¼Á´½Ó£ºhttps://en.wikipedia.org/wiki/LR_parser
ÓÉÓÚ±àÒëÆ÷Éæ¼°µÄÄÚÈݹý¶à£¬±¾È˾ÀúºÍʱ¼äÓÐÏÞ£¬²»×ö¹ý¶à̽¾¿¡£´Ó¹¤³ÌµÄ½Ç¶ÈÀ´Ëµ£¬Ñ§»áÈçºÎʹÓÃBisonÈ¥¹¹½¨Óï·¨Ê÷£¬À´½â¾öʵ¼ÊÎÊÌ⣬¶ÔÎÒÃǵŤ×÷Ò²ÐíÓиü´ó°ïÖú¡£ÏÂÃæÎÒ¾ÍÒÔBisonΪ»ù´¡£¬Ì½Ìָùý³Ì¡£
MySQLÓï·¨·ÖÎöÊ÷Éú³É¹ý³Ì
È«²¿µÄÔ´ÂëÔÚsql/sql_yacc.yyÖУ¬ÔÚMySQL5.6ÖÐÓÐ17KÐÐ×óÓÒ´úÂë¡£ÕâÀïÁгöÉæ¼°µ½SQL£º
select username,
ismale from userinfo where age > 20 and level
> 5 and 1 = 1 |
½âÎö¹ý³ÌµÄ²¿·Ö´úÂëժ¼³öÀ´¡£ÆäʵÓÐÁËBisonÖ®ºó£¬SQL½âÎöµÄÄѶÈҲûÓÐÏëÏóµÄÄÇô´ó¡£ÌرðÊÇÕâÀï¸ø³öÁ˽âÎöµÄÂöÂçÖ®ºó¡£
´úÂëʾÏ£º
select /*selectÓï¾äÈë¿Ú*/:
select_init
{
LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT;
}
;
select_init:
SELECT_SYM /*select ¹Ø¼ü×Ö*/ select_init2
| '(' select_paren ')' union_opt
;
select_init2:
select_part2
SELECT_LEX * sel= lex->current_select;
if (lex-> current_select-> set_braces(0))
{
my_parse_error (ER(ER_SYNTAX_ERROR));
MYSQL_YYABORT;
}
if (sel->linkage == UNION_TYPE &&
sel->master_unit-> first_select-> braces)
union_clause
;
select_part2:
SELECT_LEX *sel= lex->current_select;
if (sel->linkage != UNION_TYPE)
mysql_init_select(lex);
lex->current_select->parsing_place= SELECT_LIST;
}
select_options select_item_list /*½âÎöÁÐÃû*/
{
Select->parsing_place= NO_MATTER;
}
select_into select_lock_type
;
select_into:
opt_order_clause opt_limit_clause {}
| into
| select_from /*from ×Ö¾ä*/
| into select_from
| select_from into
;
select_from:
FROM join_table_list /*½âÎö±íÃû*/ where_clause /*where×Ö¾ä
*/ group_clause having_clause
opt_ order_ clause opt_limit_clause procedure_
analyse_ clause
{
Select->context.table_list=
Select-> context.first_name_resolution_table=
Select ->table_list.first;
}
| FROM DUAL_SYM where_clause opt_limit_clause
/* oracle compatibility: oracle always requires
FROM clause,
and DUAL is system table without fields.
Is "SELECT 1 FROM DUAL" any better than
"SELECT 1" ?
Hmmm :) */
;
where_clause:
/* empty */ { Select->where= 0; }
| WHERE
{
Select->parsing_place= IN_WHERE;
}
expr /*¸÷ÖÖ±í´ïʽ*/
{
SELECT_LEX *select= Select;
select-> where= $3;
select-> parsing_place= NO_MATTER;
if ($3)
$3->top_level_item;
/* all possible expressions */
expr:
| expr and expr %prec AND_SYM
{
/* See comments in rule expr: expr or expr */
Item_cond_and *item1;
Item_cond_and *item3;
if (is_cond_and($1))
{
item1= (Item_cond_and*) $1;
if (is_cond_and($3))
{
item3= (Item_cond_and*) $3;
/*
(X1 AND X2) AND (Y1 AND Y2) ==> AND (X1, X2,
Y1, Y2)
*/
item3->add_at_head(item1->argument_list);
$$ = $3;
}
else
(X1 AND X2) AND Y ==> AND (X1, X2, Y)
*/
item1->add($3);
$$ = $1;
else if (is_cond_and($3))
X AND (Y1 AND Y2) ==> AND (X, Y1, Y2)
*/ item3->add_at_head($1);
/* X AND Y */
$$ = new (YYTHD->mem_root) Item_cond_and($1,
$3);
if ($$ == ) |
ÔÚ´ó¼Òä¯ÀÀÉÏÊö´úÂëµÄ¹ý³Ì£¬»á·¢ÏÖBisonÖÐǶÈëÁËC++µÄ´úÂ롣ͨ¹ýC++´úÂ룬°Ñ½âÎöµ½µÄÐÅÏ¢´æ´¢µ½Ïà¹Ø¶ÔÏóÖС£ÀýÈç±íÐÅÏ¢»á´æ´¢µ½TABLE_LISTÖУ¬order_list´æ´¢order
by×Ó¾äÀïµÄÐÅÏ¢£¬where×־䴿´¢ÔÚItemÖС£ÓÐÁËÕâЩÐÅÏ¢£¬ÔÙ¸¨ÖúÒÔÏàÓ¦µÄËã·¨¾Í¿ÉÒÔ¶ÔSQL½øÐиü½øÒ»²½µÄ´¦ÀíÁË¡£
ºËÐÄÊý¾Ý½á¹¹¼°Æä¹ØÏµ
ÔÚSQL½âÎöÖУ¬×îºËÐĵĽṹÊÇSELECT_LEX£¬Æä¶¨ÒåÔÚsql/sql_lex.hÖС£ÏÂÃæ½öÁгöÓëÉÏÊöÀý×ÓÏà¹ØµÄ²¿·Ö¡£

SQL½âÎöÊ÷½á¹¹
ÉÏÃæÍ¼Ê¾ÖУ¬ÁÐÃûusername¡¢ismale´æ´¢ÔÚitem_listÖУ¬±íÃû´æ´¢ÔÚtable_listÖУ¬Ìõ¼þ´æ´¢ÔÚwhereÖС£ÆäÖÐÒÔwhereÌõ¼þÖеÄItem²ã´Î½á¹¹×îÉ±í´ïÒ²½ÏΪ¸´ÔÓ£¬ÈçÏÂͼËùʾ£º

whereÌõ¼þ
SQL½âÎöµÄÓ¦ÓÃ
ΪÁ˸üÉîÈëµÄÁ˽âSQL½âÎöÆ÷£¬ÕâÀï¸ø³ö2¸öÓ¦ÓÃSQL½âÎöµÄÀý×Ó£º
1¡¢ÎÞÓÃÌõ¼þÈ¥³ý
¡°ÎÞÓÃÌõ¼þÈ¥³ý¡±ÊôÓÚÓÅ»¯Æ÷µÄÂß¼ÓÅ»¯·¶³ë£¬½ö½ö¸ù¾ÝSQL±¾ÉíÒÔ¼°±í½á¹¹¼´¿ÉÍê³É£¬ÆäÓÅ»¯µÄÇé¿ö½Ï¶à£¬´úÂëÔÚsql/sql_optimizer.ccÎļþÖеÄremove_eq_condsº¯Êý¡£ÎªÁ˱ÜÃâ¹ýÓÚ·±ËöµÄÃèÊö£¬ÒÔ¼°´ó¶Î´úÂëµÄÕ³Ìù£¬ÕâÀïͨ¹ýͼƬÀ´·ÖÎöÒÔÏÂËÄÖÖÇé¿ö£º
1=1 and (m > 3 and n > 4)
1=2 and (m > 3 and n > 4)
1=1 or (m > 3 and n > 4)
1=2 or (m > 3 and n > 4)
ÎÞÓÃÌõ¼þÈ¥³ýa£º

ÎÞÓÃÌõ¼þÈ¥³ýb

ÎÞÓÃÌõ¼þÈ¥³ýc

ÎÞÓÃÌõ¼þÈ¥³ýd

Èç¹û¶ÔÆä´úÂëʵÏÖÓÐÐËȤµÄͬѧ£¬ÐèÒª¶ÔMySQLÖеÄÒ»¸öÖØÒªÊý¾Ý½á¹¹ItemÀàÓÐËùÁ˽⡣ÒòΪÆä±È½Ï¸´ÔÓ£¬ËùÒÔMySQL¹Ù·½Îĵµ×¨ÃŽéÉÜÁËItemÀà¡£
²Î¿¼Á´½Ó£ºhttps://dev.mysql.com/doc/internals/en/item-class.html
°¢ÀïµÄMySQLС×éÒ²ÓÐÀàËÆµÄÎÄÕ¡£ÈçÐè¸üÏêϸµÄÁ˽⣬¾ÍÐèҪȥ²é¿´Ô´ÂëÖÐsql/item_*µÈÎļþ¡£
2¡¢SQLÌØÕ÷Éú³É
ΪÁËÈ·±£Êý¾Ý¿âÕâһϵͳ»ù´¡×é¼þÎȶ¨¡¢¸ßЧÔËÐУ¬Òµ½çÓкܶศÖúϵͳ¡£±ÈÈçÂý²éѯϵͳ¡¢Öмä¼þϵͳ¡£ÕâЩϵͳ²É¼¯¡¢ÊÕµ½SQLÖ®ºó£¬ÐèÒª¶ÔSQL½øÐйéÀ࣬ÒÔ±ãͳ¼ÆÐÅÏ¢»òÕßÓ¦ÓÃÏà¹Ø²ßÂÔ¡£¹éÀàʱ£¬Í¨³£ÐèÒª»ñÈ¡SQLÌØÕ÷¡£±ÈÈçSQL£º
select username,
ismale from userinfo where age > 20 and level
> 5£» |
SQLÌØÕ÷Ϊ£º
select username,
ismale from userinfo where age > ? and level
> ? |
Òµ½çÖøÃûµÄÂý²éѯ·ÖÎö¹¤¾ßpt-query-digest£¬Í¨¹ýÕýÔò±í´ïʽʵÏÖÕâ¸ö¹¦ÄÜ£¬µ«ÊÇÕâÀà´¦Àí°ì·¨Bug½Ï¶à¡£½ÓÏÂÀ´¾Í½éÉÜÈçºÎʹÓÃSQL½âÎö£¬Íê³ÉSQLÌØÕ÷µÄÉú³É¡£
SQLÌØÕ÷Éú³É·ÖÁ½²¿·Ö×é³É£º
Éú³ÉTokenÊý×飻
¸ù¾ÝTokenÊý×飬Éú³ÉSQLÌØÕ÷¡£
Ê×ÏȻعËÔÚ´Ê·¨½âÎöÕ½ڣ¬ÎÒÃǽéÉÜÁËSQLÖеĹؼü×Ö£¬²¢ÇÒÿ¸ö¹Ø¼ü×Ö¶¼ÓÐÒ»¸ö16λµÄÕûÊý¶ÔÓ¦£¬¶ø·Ç¹Ø¼ü×ÖͳһÓÃident±íʾ£¬ÆäÒ²¶ÔÓ¦ÁËÒ»¸ö16λÕûÊý¡£ÈçÏÂ±í£º

½«Ò»¸öSQLת»»³ÉÌØÕ÷µÄ¹ý³Ì£º

ÔÚSQL½âÎö¹ý³ÌÖУ¬¿ÉÒԺܷ½±ãµÄÍê³ÉTokenÊý×éµÄÉú³É¡£¶øÒ»µ©Íê³ÉTokenÊý×éµÄÉú³É£¬¾Í¿ÉÒԺܼòµ¥µÄÍê³ÉSQLÌØÕ÷µÄÉú³É¡£SQLÌØÕ÷±»¹ã·ºÓÃÓÚ¸÷¸öϵͳÖУ¬±ÈÈçpt-query-digestÐèÒª¸ù¾ÝÌØÕ÷¶ÔSQL¹éÀ࣬Ȼ¶øÆä»ùÓÚÕýÔò±í´ïʽµÄʵÏÖÓÐÖî¶àBug¡£ÏÂÃæÁоټ¸¸öÒÑÖªµÄBug£º

ѧϰ½¨Òé
×î½ü£¬ÔÚ¶ÔSQL½âÎöÆ÷ºÍÓÅ»¯Æ÷̽Ë÷µÄ¹ý³ÌÖУ¬´ÓÒ»¿ªÊ¼µÄãȻÎÞ´ëµ½ÓÐÕ¿ÉÑ£¬Ò²×ܽáÁËһЩÐĵÃÌå»á£¬ÔÚÕâÀï¸ú´ó¼Ò·ÖÏíһϣº
Ê×ÏÈ£¬ÔĶÁÏà¹ØÊé¼®£¬Êé¼®ÄܸøÎÒÃÇÒ»¸öϵͳµÄÈÏʶ½âÎöÆ÷ºÍÓÅ»¯Æ÷µÄ½Ç¶È¡£µ«ÊǸÃÀàÕë¶ÔMySQLµÄÊé¼®ÊÐÃæÉϺÜÉÙ£¬Ä¿Ç°ÖÐÎÄ×÷Æ·¿ÉÒÔ¿´Ï¡¶Êý¾Ý¿â²éѯÓÅ»¯Æ÷µÄÒÕÊõ£ºÔÀí½âÎöÓëSQLÐÔÄÜÓÅ»¯¡·£»
Æä´Î£¬ÒªÔĶÁÔ´Â룬µ«ÊÇ×îºÃÒÔij¸ö°æ±¾Îª»ù´¡£¬±ÈÈçMySQL5.6.23£¬ÒòΪSQL½âÎö¡¢ÓÅ»¯²¿·ÖµÄ´úÂëÔÚ²»¶Ï±ä»¯£¬ÓÈÆäÊÇÔÚ¿çÔ½´óµÄ°æ±¾Ê±£¬¸Ä¶¯Á¦¶È´ó£»
ÔٴΣ¬¶àʹÓÃGDBµ÷ÊÔ£¬ÑéÖ¤×Ô¼ºµÄ²Â²â£¬¼ìÑéÔĶÁÖÊÁ¿£»
×îºó£¬ÐèҪдÏà¹Ø´úÂëÑéÖ¤£¬Ö»ÓÐд³öÀ´Á˲ÅÄÜËãÕæÕýµÄÕÆÎÕ¡£ |