MySQLã§ãããªã¢ã©ã¤ãºããã¥ã¼3ãå®è£ ç·¨ å³æåæ (on commit)
ã¾ãã¯ç°¡åãªå±¥æ´ç³»ã®ãã¼ãã«ããå®ä½åãã¦ã¿ã¾ãããä¾ã¨ãã¦ã¦ã¼ã¶ã®ãã¼ãã«ã¨ç´ã¥ãã¦ããã³ã¡ã³ãæ©è½ãæç¤ºãã¾ãã
ã¾ãã¯ä¾ã«ãã£ã¦ãã¼ãã«å®ç¾©ã¨ãã¼ã¿ä½æãã
- ã¦ã¼ã¶ãã¼ãã«
CREATE TABLE `user` ( `user_id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'ã¦ã¼ã¶ID', `user_name` VARCHAR( 255 ) NOT NULL COMMENT 'ã¦ã¼ã¶å' ) ENGINE = MYISAM COMMENT = 'ã¦ã¼ã¶';
- ã³ã¡ã³ããã¼ãã«
CREATE TABLE `comment` ( `comment_id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'ã³ã¡ã³ãID' , `from_user_id` INT NOT NULL COMMENT 'éä¿¡å ã¦ã¼ã¶ID', `to_user_id` INT NOT NULL COMMENT 'éä¿¡å ã¦ã¼ã¶ID', `comment` VARCHAR( 255 ) NOT NULL COMMENT 'ã³ã¡ã³ã' , INDEX ( `from_user_id` ),INDEX ( `to_user_id` ) ) ENGINE = MYISAM COMMENT = 'ã³ã¡ã³ã';
- ã¦ã¼ã¶ã®ãã¼ã¿ã10ä¸ä»¶ç¨æãã¾ã
call insert_generate_series('user(user_name)','md5(?)',1,100000,1);
- ã³ã¡ã³ãã®ãã¼ã¿ã100ä¸ä»¶ç¨æãã¾ã
call insert_generate_series('comment(from_user_id,to_user_id,comment)','ceil(rand()*100000),ceil(rand()*100000),md5(?)',1,1000000,1);
ã¾ãã¯ä½æãããã¼ã¿ãçµåãã¦ãã¼ã¿ã表示ãã¦ã¿ã¾ãã
SELECT SQL_NO_CACHE comment_id , fu.user_name form_user_name , tu.user_name to_user_name , comment FROM `comment` cm,user fu,user tu WHERE fu.user_id=cm.from_user_id AND tu.user_id=cm.to_user_id LIMIT 900000,30
30 rows in set (16.19 sec)
ãã®æã®ãã¼ãã«æ§é ã¯ãã¦ã¼ã¶ã10ä¸ä»¶ãã³ã¡ã³ãã100ä¸ä»¶ãè¶ ãããããããæ§è½ãå£åãã¦ãã¾ããOpen Socialç³»ã§ã¦ã¤ã³ã¯å±¥æ´ãã¬ãã£å±¥æ´ããããã¨å±¥æ´ãtwiterç³»ã®ãµã¼ãã¹ã§ãã¤ã¶ããçè¨å¤§ãªã¬ã³ã¼ããæ±ãå ´åããããã®MySQLã§ãJOINãå³ãããªã£ã¦ãã¾ããéã«ä¸è¦æ¨¡ç¨åº¦ã®ãµã¼ãã¹ã§ããã°å¯¾çã¯å¿ è¦ã§ã¯ãªãã§ããã¾ãããããªã¢ã©ã¤ãºåãã以å¤ã«JOINããªãææ³ã¯ããã¤ãåå¨ãã¾ãã
ãã¥ã¼ã使
CREATE OR REPLACE ALGORITHM = UNDEFINED VIEW `v_comment` AS SELECT comment_id, fu.user_id from_user_id , tu.user_id to_user_id , fu.user_name from_user_name , tu.user_name to_user_name , `comment` FROM `comment` cm, user fu, user tu WHERE fu.user_id = cm.from_user_id AND tu.user_id = cm.to_user_id
SELECT SQL_NO_CACHE comment_id , from_user_name , to_user_name , comment FROM `v_comment` LIMIT 900000,30;
30 rows in set (12.07 sec)
å½ç¶ã®ãã¨ãªããããã¥ã¼ã«ããã¨ããã§éåº¦ã¯æ©ããªãã¾ããã
æ¬ä¼¼ãããªã¢ã©ã¤ãºããã¥ã¼ã®ãã¼ãã«ã確ä¿ãã¾ãã
CREATE TABLE mv_comment ( PRIMARY KEY( `comment_id` ), INDEX ( `from_user_id` ), INDEX ( `to_user_id` ) ) SELECT comment_id , fu.user_id from_user_id , tu.user_id to_user_id , fu.user_name from_user_name , tu.user_name to_user_name , comment FROM `comment` cm,user fu,user tu WHERE fu.user_id=cm.from_user_id AND tu.user_id=cm.to_user_id
- v_commentãmv_commentã«ãã¦ã¢ã¯ã»ã¹
SELECT SQL_NO_CACHE comment_id , from_user_name , to_user_name , comment FROM `mv_comment` LIMIT 900000,30
30 rows in set (0.73 sec)
ãã¡ããã¡ãæ©ããªã£ã¦ã¾ããJOINãã¦ãªããã ãã®ããããããã ã
ããªã¬ã¼ãå¼µãã¾ãã
次ã«commentã«è¡ã追å ãããå ´åã«mv_commentã«ã追å ãããããã«ããªã¬ã¼ãå¼µãã¾ãã
DROP TRIGGER IF EXISTS comment_materialized_insert DELIMITER // CREATE TRIGGER comment_materialized_insert AFTER INSERT ON comment FOR EACH ROW BEGIN INSERT INTO mv_comment ( comment_id , from_user_id , to_user_id , from_user_name , to_user_name , comment ) SELECT NEW.comment_id , fu.user_id from_user_id , tu.user_id to_user_id , fu.user_name from_user_name , tu.user_name to_user_name , NEW.comment FROM user fu,user tu WHERE fu.user_id=NEW.from_user_id AND tu.user_id=NEW.to_user_id; END; // DELIMITER ;
以ä¸ã§åºæ¬çãªã¨ããã¯å®äºã§ããmv_commentã§é«éã«ã¢ã¯ã»ã¹ã§ããããã«ãªãã¾ãããupdateãdeleteããªã¬ã¼ãå¿ è¦ã§ããã°é©æå¼µã£ã¦ããã¾ãã