| ±à¼ÍƼö: |
| ±¾ÎÄÀ´×ÔÓÚwww.v2ex.com,TiDB
ÊÇÒ»¿î¶¨Î»ÓÚÔÚÏßÊÂÎñ´¦Àí/ÔÚÏß·ÖÎö´¦ÀíµÄÈÚºÏÐÍÊý¾Ý¿â²úÆ·£¬ÊµÏÖÁËÒ»¼üˮƽÉìËõ£¬Ç¿Ò»ÖÂÐԵĶั±¾Êý¾Ý°²È«£¬·Ö²¼Ê½ÊÂÎñ£¬ÊµÊ±
OLAP µÈÖØÒªÌØÐÔ¡£Í¬Ê±¼æÈÝ MySQL ÐÒéºÍÉú̬£¬Ç¨ÒƱã½Ý£¬ÔËά³É±¾¼«µÍ¡£ |
|
¿ªÆª
ÊÀ½ç¼¶µÄ¿ªÔ´·Ö²¼Ê½Êý¾Ý¿â TiDB ×Ô 2016 Äê 12 ÔÂÕýʽ·¢²¼µÚÒ»¸ö°æ±¾ÒÔÀ´£¬ÒµÄÚÖî¶à¹«Ë¾Öð²½ÒýÈëʹÓ㬲¢È¡µÃ¹ã·ºÈϿɡ£
¶ÔÓÚ»¥ÁªÍø¹«Ë¾£¬Êý¾Ý´æ´¢µÄÖØÒªÐÔ²»ÑÔ¶øÓ÷¡£ÔÚ NewSQL Êý¾Ý¿â³öÏÖ֮ǰ£¬Ò»°ã²ÉÓõ¥»úÊý¾Ý¿â£¨±ÈÈç
MySQL £©×÷Ϊ´æ´¢£¬Ëæ×ÅÊý¾ÝÁ¿µÄÔö¼Ó£¬¡°·Ö¿â·Ö±í¡±ÊÇÔçÍíÃæÁÙµÄÎÊÌ⣬¼´Ê¹ÓÐÖîÈç MyCat¡¢ShardingJDBC
µÈÓÅÐãµÄÖмä¼þ£¬¡°·Ö¿â·Ö±í¡±»¹ÊǸø RD ºÍ DBA ´øÀ´½Ï¸ßµÄ³É±¾£» NewSQL Êý¾Ý¿â³öÏÖºó£¬ÓÉÓÚËü²»½öÓÐ
NoSQL ¶Ôº£Á¿Êý¾ÝµÄ¹ÜÀí´æ´¢ÄÜÁ¦¡¢»¹Ö§³Ö´«Í³¹ØÏµÊý¾Ý¿âµÄ ACID ºÍ SQL£¬ËùÒÔ¶ÔÒµÎñ¿ª·¢À´Ëµ£¬´æ´¢ÎÊÌâÒѾ±äµÃ¸ü¼Ó¼òµ¥ÓѺ㬽ø¶ø¿ÉÒÔ¸üרעÓÚÒµÎñ±¾Éí¡£¶ø
TiDB£¬ÕýÊÇ NewSQL µÄÒ»¸ö½Ü³ö´ú±í£¡
Õ¾ÔÚÒµÎñ¿ª·¢µÄÊӽǣ¬TiDB ×îÎüÒýÈ˵óÌØÐÔÊÇ£º
Ö§³Ö MySQL ÐÒ飨¿ª·¢½ÓÈë³É±¾µÍ£©£»
100% Ö§³ÖÊÂÎñ£¨Êý¾ÝÒ»ÖÂÐÔʵÏÖ¼òµ¥¡¢¿É¿¿£©£»
ÎÞÏÞË®Æ½ÍØÕ¹£¨²»±Ø¿¼ÂÇ·Ö¿â·Ö±í£©¡£
»ùÓÚÕ⼸´óÌØÐÔ£¬TiDB ÔÚÒµÎñ¿ª·¢ÖÐÊÇÖµµÃÍÆ¹ãºÍʵ¼ùµÄ£¬µ«ÊÇ£¬Ëü±Ï¾¹²»ÊÇ´«Í³µÄ¹ØÏµÐÍÊý¾Ý¿â£¬ÒÔÖÂÎÒÃǶԹØÏµÐÍÊý¾Ý¿âµÄһЩʹÓþÑéºÍ»ýÀÛ£¬ÔÚ
TiDB ÖÐÊÇ´æÔÚ²îÒìµÄ£¬ÏÖÖ÷Òª²ûÊö¡°ÊÂÎñ¡±ºÍ¡°²éѯ¡±Á½·½ÃæµÄ²îÒì¡£
TiDB ÊÂÎñºÍ MySQL ÊÂÎñµÄ²îÒì
MySQL ÊÂÎñºÍ TiDB ÊÂÎñ¶Ô±È

ÔÚ TiDB ÖÐÖ´ÐеÄÊÂÎñ b£¬·µ»ØÓ°ÏìÌõÊýÊÇ 1 £¨ÈÏΪÒѾÐ޸ijɹ¦£©£¬µ«ÊÇÌá½»ºó²éѯ£¬status
È´²»ÊÇÊÂÎñ b Ð޸ĵÄÖµ£¬¶øÊÇÊÂÎñ a Ð޸ĵÄÖµ¡£
¿É¼û£¬MySQL ÊÂÎñºÍ TiDB ÊÂÎñ´æÔÚÕâÑùµÄ²îÒ죺
MySQL ÊÂÎñÖУ¬¿ÉÒÔͨ¹ýÓ°ÏìÌõÊý£¬×÷ΪдÈ루»òÐ޸ģ©ÊÇ·ñ³É¹¦µÄÒÀ¾Ý£»¶øÔÚ
TiDB ÖУ¬ÕâÈ´ÊDz»¿ÉÐеģ¡
×÷Ϊ¿ª·¢ÕßÎÒÃÇÐèÒª¿¼ÂÇÏÂÃæµÄÎÊÌ⣺
ͬ²½ RPC µ÷ÓÃÖУ¬Èç¹ûÐèÒªÑϸñÒÀÀµÓ°ÏìÌõÊýÒÔÈ·ÈÏ·µ»ØÖµ£¬Äǽ«ÈçºÎÊǺã¿
¶à±í²Ù×÷ÖУ¬Èç¹ûÐèÒªÑϸñÒÀÀµÄ³¸öÖ÷±íÊý¾Ý¸üнá¹û£¬×÷ΪÊÇ·ñ¸üУ¨»òдÈ룩ÆäËû±íµÄÅжÏÒÀ¾Ý£¬ÄÇÓÖ½«ÈçºÎÊǺã¿
ÔÒò·ÖÎö¼°½â¾ö·½°¸
¶ÔÓÚ MySQL£¬µ±¸üÐÂijÌõ¼Ç¼ʱ£¬»áÏÈ»ñÈ¡¸Ã¼Ç¼¶ÔÓ¦µÄÐм¶Ëø£¨ÅÅËûËø£©£¬»ñÈ¡³É¹¦Ôò½øÐкóÐøµÄÊÂÎñ²Ù×÷£¬»ñȡʧ°ÜÔò×èÈûµÈ´ý¡£
¶ÔÓÚ TiDB£¬Ê¹Óà Percolator ÊÂÎñÄ£ÐÍ£º¿ÉÒÔÀí½âΪÀÖ¹ÛËøÊµÏÖ£¬ÊÂÎñ¿ªÆô¡¢ÊÂÎñÖж¼²»»á¼ÓËø£¬¶øÊÇÔÚÌύʱ²Å¼ÓËø¡£²Î¼û
ÕâÆªÎÄÕ£¨ TiDB ÊÂÎñËã·¨£©¡£
Æä¼òÒªÁ÷³ÌÈçÏ£º

ÔÚÊÂÎñÌá½»µÄ PreWrite ½×¶Î£¬µ±¡°Ëø¼ì²é¡±Ê§°Üʱ£ºÈç¹û¿ªÆô³åÍ»ÖØÊÔ£¬ÊÂÎñÌá½»½«»á½øÐÐÖØÊÔ£»Èç¹û먦Æô³åÍ»ÖØÊÔ£¬½«»áÅ׳öдÈë³åÍ»Òì³£¡£
¿É¼û£¬¶ÔÓÚ MySQL£¬ÓÉÓÚÔÚдÈë²Ù×÷ʱ¼ÓÉÏÁËÅÅËûËø£¬±äÏཫ²¢ÐÐÊÂÎñ´ÓÂß¼ÉÏ´®Ðл¯£»¶ø¶ÔÓÚ
TiDB£¬ÊôÓÚÀÖ¹ÛËøÄ£ÐÍ£¬ÔÚÊÂÎñÌύʱ²Å¼ÓËø£¬²¢Ê¹ÓÃÊÂÎñ¿ªÆôʱ»ñÈ¡µÄ¡°È«¾Öʱ¼ä´Á¡±×÷Ϊ¡°Ëø¼ì²é¡±µÄÒÀ¾Ý¡£
ËùÒÔ£¬ÔÚÒµÎñ²ãÃæ±ÜÃâ TiDB ÊÂÎñ²îÒìµÄ±¾ÖÊÔÚÓÚ±ÜÃâËø³åÍ»£¬¼´£¬µ±Ç°ÊÂÎñÖ´ÐÐʱ£¬²»²úÉú±ðµÄÊÂÎñʱ¼ä´Á£¨ÎÞÆäËûÊÂÎñ²¢ÐУ©¡£´¦Àí·½Ê½ÎªÊÂÎñ´®Ðл¯¡£
TiDB ÊÂÎñ´®Ðл¯
ÔÚÒµÎñ²ã£¬¿ÉÒÔ½èÖú·Ö²¼Ê½Ëø£¬ÊµÏÖ´®Ðл¯´¦Àí£¬ÈçÏ£º

»ùÓÚ Spring ºÍ·Ö²¼Ê½ËøµÄÊÂÎñ¹ÜÀíÆ÷ÍØÕ¹
ÔÚ Spring Éú̬Ï£¬spring-tx Öж¨ÒåÁËͳһµÄÊÂÎñ¹ÜÀíÆ÷½Ó¿Ú£ºPlatformTransactionManager£¬ÆäÖÐÓлñÈ¡ÊÂÎñ£¨
getTransaction £©¡¢Ìá½»£¨ commit £©¡¢»Ø¹ö£¨ rollback £©Èý¸ö»ù±¾·½·¨£»Ê¹ÓÃ×°ÊÎÆ÷ģʽ£¬ÊÂÎñ´®Ðл¯×é¼þ¿É×öÈçÏÂÉè¼Æ£º

ÆäÖУ¬¹Ø¼üµãÓУº
³¬Ê±Ê±¼ä£ºÎª±ÜÃâËÀËø£¬Ëø±ØÐëÓг¬Ê±Ê±¼ä£»Îª±ÜÃâËø³¬Ê±µ¼ÖÂÊÂÎñ²¢ÐУ¬ÊÂÎñ±ØÐëÓг¬Ê±Ê±¼ä£¬¶øÇÒËø³¬Ê±Ê±¼ä±ØÐë´óÓÚÊÂÎñ³¬Ê±Ê±¼ä£¨Ê±¼ä²î×îºÃÔÚÃë¼¶£©¡£
¼ÓËøÊ±»ú£ºTiDB ÖС°Ëø¼ì²é¡±µÄÒÀ¾ÝÊÇÊÂÎñ¿ªÆôʱ»ñÈ¡µÄ¡°È«¾Öʱ¼ä´Á¡±£¬ËùÒÔ¼ÓËøÊ±»ú±ØÐëÔÚÊÂÎñ¿ªÆôǰ¡£
ÊÂÎñÄ£°å½Ó¿ÚÉè¼Æ
Òþ²Ø¸´ÔÓµÄÊÂÎñÖØÐ´Âß¼£¬±©Â¶¼òµ¥ÓÑºÃµÄ API£º


TiDB ²éѯºÍ MySQL µÄ²îÒì
ÔÚ TiDB ʹÓùý³ÌÖУ¬Å¼¶û»áÓÐÕâÑùµÄÇé¿ö£¬Ä³¼¸¸ö×ֶν¨Á¢ÁËË÷Òý£¬µ«ÊDzéѯ¹ý³Ì»¹ÊǺÜÂý£¬ÉõÖÁ²»¾¹ýË÷Òý¼ìË÷¡£
Ë÷Òý»ìÏýÐÍ£¨¾ÙÀý£©
±í½á¹¹£º
CREATE TABLE `t_test`
(
`id` bigint(20) NOT NULL DEFAULT '0' COMMENT 'Ö÷¼ü
id',
`a` int(11) NOT NULL DEFAULT '0' COMMENT 'a',
`b` int(11) NOT NULL DEFAULT '0' COMMENT 'b',
`c` int(11) NOT NULL DEFAULT '0' COMMENT 'c',
PRIMARY KEY (`id`),
KEY `idx_a_b` (`a`,`b`),
KEY `idx_c` (`c`)
) ENGINE=InnoDB; |
²éѯ£ºÈç¹ûÐèÒª²éѯ (a=1 ÇÒ b=1 £©»ò c=2 µÄÊý¾Ý£¬ÔÚ
MySQL ÖУ¬sql ¿ÉÒÔдΪ£ºSELECT id from t_test where (a=1
and b=1) or (c=2);£¬MySQL ×ö²éѯÓÅ»¯Ê±£¬»á¼ìË÷µ½ idx_a_b ºÍ idx_c
Á½¸öË÷Òý£»µ«ÊÇÔÚ TiDB £¨ v2.0.8-9 £©ÖУ¬Õâ¸ö sql »á³ÉΪһ¸öÂý SQL£¬ÐèÒª¸ÄдΪ£º
| SELECT id from
t_test where (a=1 and b=1) UNION SELECT id from
t_test where (c=2); |
С½á£ºµ¼Ö¸ÃÎÊÌâµÄÔÒò£¬¿ÉÒÔÀí½âΪ TiDB µÄ sql ½âÎö»¹ÓÐÓÅ»¯¿Õ¼ä¡£
ÀäÈÈÊý¾ÝÐÍ£¨¾ÙÀý£©
±í½á¹¹£º
CREATE TABLE
`t_job_record` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT
'Ö÷¼ü id',
`job_code` varchar(255) NOT NULL DEFAULT '' COMMENT
'ÈÎÎñ code',
`record_id` bigint(20) NOT NULL DEFAULT '0' COMMENT
'¼Ç¼ id',
`status` tinyint(3) NOT NULL DEFAULT '0' COMMENT
'Ö´ÐÐ״̬:0 ´ý´¦Àí',
`execute_time` bigint(20) NOT NULL DEFAULT '0'
COMMENT 'Ö´ÐÐʱ¼ä£¨ºÁÃ룩',
PRIMARY KEY (`id`),
KEY `idx_status_execute_time` (`status`,`execute_time`),
KEY `idx_record_id` (`record_id`)
) ENGINE=InnoDB COMMENT='Òì²½ÈÎÎñ job' |
Êý¾Ý˵Ã÷£º
a. ÀäÊý¾Ý£¬status=1 µÄÊý¾Ý£¨ÒѾ´¦Àí¹ýµÄÊý¾Ý£©£»
b. ÈÈÊý¾Ý£¬status=0 ²¢ÇÒ execute_time<=
µ±Ç°Ê±¼ä µÄÊý¾Ý¡£
Âý²éѯ£º¶ÔÓÚÈÈÊý¾Ý£¬Êý¾ÝÁ¿Ò»°ã²»´ó£¬µ«ÊDzéѯƵ¶ÈºÜ¸ß£¬¼ÙÉ赱ǰ£¨ºÁÃë¼¶£©Ê±¼äΪ£º1546361579646£¬ÔòÔÚ
MySQL ÖУ¬²éѯ sql Ϊ£º
| SELECT * FROM
t_job_record where status =0 and execute_time< =
1546361579646 |
Õâ¸öÔÚ MySQL ÖкܸßЧµÄ²éѯ£¬ÔÚ TiDB ÖÐËäȻҲ¿É´ÓË÷Òý¼ìË÷£¬µ«ÆäºÄʱȴ²»¾¡ÈËÒ⣨°ÙÍò¼¶Êý¾ÝÁ¿£¬ºÄʱ°ÙºÁÃë¼¶£©¡£
ÔÒò·ÖÎö£ºÔÚ TiDB ÖУ¬µ×²ãË÷Òý½á¹¹Îª LSM-Tree£¬ÈçÏÂͼ£º

µ±´ÓÄÚ´æ¼¶µÄ C0 ²ã²éѯ²»µ½Êý¾Ýʱ£¬»áÖð²ãɨÃèÓ²ÅÌÖи÷²ã£»ÇÒ merge
²Ù×÷ΪÒì²½²Ù×÷£¬Ë÷ÒýÊý¾Ý¸üÐÂ»á´æÔÚÒ»¶¨µÄÑÓ³Ù£¬¿ÉÄÜ´æÔÚÎÞЧË÷Òý¡£ÓÉÓÚÖð²ãɨÃèºÍÒì²½ merge£¬Ê¹µÃ²éѯЧÂʽϵ͡£
ÓÅ»¯·½Ê½£º¾¡¿ÉÄÜËõС¹ýÂË·¶Î§£¬±ÈÈç½áºÏÒì²½ job »ñÈ¡¼Ç¼ƵÂÊ£¬ÔÚ±£Ö¤²»ÒÅ©Êý¾ÝµÄǰÌáÏ£¬ºÏÀíÉèÖÃ
execute_time É¸Ñ¡Çø¼ä£¬ÀýÈç 1 Сʱ£¬sql ¸ÄдΪ£º
| SELECT * FROM
t_job_record where status =0 and execute_time> 1546357979646
and execute_time<= 1546361579646 |
ÓÅ»¯Ð§¹û£ººÄʱ 10 ºÁÃë¼¶±ð£¨ÒÔÏ£©¡£
¹ØÓÚ²éѯµÄÆô·¢
ÔÚ»ùÓÚ TiDB µÄÒµÎñ¿ª·¢ÖУ¬ÏÈÞðÆú´«Í³¹ØÏµÐÍÊý¾Ý¿â´øÀ´µÄ¶Ô sql
ÏÈÈëΪÖ÷µÄÀí½â»ò¾Ñ飬½÷É÷Éè¼ÆÃ¿Ò»¸ö sql£¬Èç DBA ËùÌᳫ£ºÉè¼Æ sql ʱÎñ±Ø¹Ø×¢Ö´Ðмƻ®£¬±ØÒªÊ±Çë½Ì
DBA¡£
ºÍ MySQL Ïà±È£¬TiDB µÄµ×²ã´æ´¢ºÍ½á¹¹¾ö¶¨ÁËÆäÌØÊâÐԺͲîÒìÐÔ£»µ«ÊÇ£¬TiDB
Ö§³Ö MySQL ÐÒ飬ËüÃÇÒ²´æÔÚһЩ¹²Í¬Ö®´¦£¬±ÈÈçÔÚ TiDB ÖÐʹÓá°Ô¤±àÒ롱ºÍ¡°Åú´¦Àí¡±£¬Í¬Ñù¿ÉÒÔ»ñµÃÒ»¶¨µÄÐÔÄÜÌáÉý¡£
·þÎñ¶ËÔ¤±àÒë
ÔÚ MySQL ÖУ¬¿ÉÒÔʹÓà PREPARE stmt_name
FROM preparable_stm ¶Ô sql Óï¾ä½øÐÐÔ¤±àÒ룬ȻºóʹÓà EXECUTE stmt_name
[USING @var_name [, @var_name] ...] Ö´ÐÐÔ¤±àÒëÓï¾ä¡£Èç´Ë£¬Í¬Ò»
sql µÄ¶à´Î²Ù×÷£¬¿ÉÒÔ»ñµÃ±È³£¹æ sql ¸ü¸ßµÄÐÔÄÜ¡£
mysql-jdbc Ô´ÂëÖУ¬ÊµÏÖÁ˱ê×¼µÄ Statement ºÍ
PreparedStatement µÄͬʱ£¬»¹ÓÐÒ»¸öServerPreparedStatement
ʵÏÖ£¬ServerPreparedStatement ÊôÓÚPreparedStatementµÄÍØÕ¹£¬ÈýÕß¶Ô±ÈÈçÏ£º

ÈÝÒ×·¢ÏÖ£¬PreparedStatement ºÍ Statement
µÄÇø±ðÖ÷񻂿±ðÔÚÓÚ²ÎÊý´¦Àí£¬¶ø¶ÔÓÚ·¢ËÍÊý¾Ý°ü£¬µ÷Ó÷þÎñ¶ËµÄ´¦ÀíÂß¼ÊÇÒ»Ñù£¨»òÀàËÆ£©µÄ£»¾²âÊÔ£¬¶þÕßËÙ¶ÈÏ൱¡£Æäʵ£¬PreparedStatement
²¢²»ÊÇ·þÎñ¶ËÔ¤´¦ÀíµÄ£»ServerPreparedStatement ²ÅÊÇÕæÕýµÄ·þÎñ¶ËÔ¤´¦Àí£¬ËÙ¶ÈÒ²½Ï
PreparedStatement ¿ì£»ÆäʹÓó¡¾°Ò»°ãÊÇ£ºÆµ·±µÄÊý¾Ý¿â·ÃÎÊ£¬sql ÊýÁ¿ÓÐÏÞ£¨Óлº´æÌÔ̲ßÂÔ£¬Ê¹Óò»Ò˻ᵼÖÂÁ½´Î
IO £©¡£
Åú´¦Àí
¶ÔÓÚ¶àÌõÊý¾ÝдÈ룬³£Óà sql Ϊ insert ¡ values
(¡),(¡)£»¶ø¶ÔÓÚ¶àÌõÊý¾Ý¸üУ¬Òà¿ÉÒÔʹÓà update ¡ case ¡ when ¡ then
¡ end À´¼õÉÙ IO ´ÎÊý¡£µ«ËüÃǶ¼ÓÐÒ»¸öÌØµã£¬Êý¾ÝÌõÊýÔ½¶à£¬sql Ô½¼Ó¸´ÔÓ£¬sql ½âÎö³É±¾Ò²¸ü¸ß£¬ºÄʱÔö³¤¿ÉÄܸßÓÚÏßÐÔÔö³¤¡£¶øÅú´¦Àí£¬¿ÉÒÔ¸´ÓÃÒ»Ìõ¼òµ¥
sql£¬ÊµÏÖÅúÁ¿Êý¾ÝµÄдÈë»ò¸üУ¬ÎªÏµÍ³´øÀ´¸üµÍ¡¢¸üÎȶ¨µÄºÄʱ¡£
¶ÔÓÚÅú´¦Àí£¬×÷Ϊ¿Í»§¶Ë£¬java.sql.Statement Ö÷Òª¶¨ÒåÁËÁ½¸ö½Ó¿Ú·½·¨£¬addBatch
ºÍ executeBatch À´Ö§³ÖÅú´¦Àí¡£
Åú´¦ÀíµÄ¼òÒªÁ÷³Ì˵Ã÷ÈçÏ£º

¾ÒµÎñÖÐʵ¼ù£¬Ê¹ÓÃÅú´¦Àí·½Ê½µÄдÈ루»ò¸üУ©£¬±È³£¹æ insert
¡ values(¡),(¡)£¨»ò update ¡ case ¡ when ¡ then ¡ end£©ÐÔÄܸüÎȶ¨£¬ºÄʱҲ¸üµÍ¡£
|