MySQL::Merge Storage Engine
พักนี้เริ่มมั่วไปใหญ่ละ ตอนที่เปิดเว็บ มาตั้งใจว่าจะเขียนแต่เรื่อง jQuery กับ Javascript แต่พักนี้ไหง มีทุกเรื่องเลยก็ไม่รู้ กลายเป็น บล๊อกโปรแกรมมิ่ง ไปไม่รู้ตัว แต่ขออีกทีน่า คนมันอยากเขียนนี่หว่า เดี๋ยวครั้งหน้ากลับมา เขียนเรื่อง jQuery ต่อ
วันนี้ที่จะมาเขียนก็ฉีกแนวไปจากเดิมอีกละ จะมาพูดถึงเรื่อง Storage Engine ตัวนึงที่มี ใน MySQL 5.0 ขึ้นไป นั่นก็คือ merge storage engine (MRG_MyIsam) นั่นเอง เป็นการทำให้ table หลายๆ ตัว ถูก มองเห็นเป็นตัวเดียวกัน
ก่อนอื่นผมสร้าง DB ขึ้นมาทำการทดสอบชื่อว่า merge_test
จากนั้นผมสร้่าง table ขึ้นมา 2 ตัว ชื่อว่า table_a, table_b
-
CREATE TABLE `merge_test`.`table_a` (
-
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
-
`data` VARCHAR( 25 ) NOT NULL ,
-
) ENGINE = MYISAM ;
-
-
CREATE TABLE `merge_test`.`table_b` (
-
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
-
`data` VARCHAR( 25 ) NOT NULL ,
-
) ENGINE = MYISAM ;
Engine ต้องเป็น MyIsam เท่านั้นนะครับ
จากนั้นผม ก็ทำการ ทดสอบ insert ข้อมูล ลงไปใน table_a ก่อน ดังนี้
-
INSERT INTO `merge_test`.`table_a` (`id`, `data`) VALUES (NULL, ‘data for table a’);
แล้วต่อมาอีก ผมก็สร้าง merage table มามีชื่อว่า table_all
-
CREATE TABLE `table_all` (
-
`id` int(10) NOT NULL AUTO_INCREMENT,
-
`data` varchar(25) NOT NULL,
-
) ENGINE=MERGE UNION=(table_a,table_b) INSERT_METHOD=LAST
โดยต้องมี Structure เหมือนกับ 2 table ด้านบนไม่ผิดเพี้ยน จากนั้นกำำหนด Engine เป็น merge ซะ และใช้คำสั่ง Union ในการเลืกว่าจพ เชื่อม table ไหน จากนั้น กำหนด ให้ data insert อยู่ที่ last table นั่นก็คือ table_b นั่นเอง
จากนั้นมาลอง insert ข้อมูลลง table_all
-
INSERT INTO `merge_test`.`table_all` (`id`, `data`) VALUES (NULL, ‘555 test’);
จะเห็นได้ว่า table_all จะเอา data ของ ทั้ง 2 table มาอยู่ในตัวเอง ดังภาพด้านล่าง
จากภาพเราก็จะเห็นได้ว่า data ที่เรา insert table_all จะไป ตกอยู่ที่ table_b ด้วย โดยที่ auto increment ไม่ผิดเพี้ยนไป
ก็คือ table_all จะเป็นตัว map data เท่านั้น โดยที่ ไม่ได้ทำหน้าที่เป็นตัวจัดเก็บจริงๆ
*** ถ้ามี data เยอะๆ ไปลองสังเกตุไฟล์ table_all.frm ได้ว่า ไม่มีขนาดเพิ่มขึ้นตามจำนวน data ***
ทีนี้ เราก็จะสามารถบริหาร select, insert, delete, update โดยใช้ table_all เท่านั้น โดยไม่ต้องไปสนใจว่า data จะอยู่ที่ table_a หรือ table_b
วิธีนี้ไม่เหมือนกับการทำ Partition นะครับ เพราะว่า Data ไม่สามารถกำหนดในลักษณะั hasing ได้ ต้องเลือกเอาเลย ว่าจะ insert ลง table ไป “Last or First”
เท่าที่ลองหาข้อมูลมา วิธีนี้ไม่ได้ช่วยเรื่อง performance เท่าไหร่ แต่ว่า เป็นการ merge table เพื่อนำมาวิเคราะห์ข้อมูลมากกว่า แตกต่างจาก partition อย่าสับสนกันนะครับ
เอาล่ะ จบ เรื่อง MySQL เดี๋ยวครั้งแน่ jQuery แน่ๆ 555+
You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.



ความรู้ๆ ขอบคุณครับ
เออ คุณตี๋ ภาพ table_b ผมผิดนะครับ ต้องเป็นข้อมูล
2 | 555 test
^
^
จริงด้วย ใส่ภาพผิด T__T
ขอบคุณนะครับ
แหมเฮีย เพิ่งเห็น adsense นะเนี่ย ผมอยากจะคลิก ads. ที่เว็บเฮียนานแล้ว แต่หาไม่เจอ เอหรือมีนานแล้วแต่ผมไม่ได้สังเกตุ
เพิ่งเอามาติดวันนี้เอง แต่ถ้าไม่ได้สนใจ ads มันจริงๆ ก็อย่าไปคลิกนะครับ เดี๋ยว พวก adwords จะเคืองเอา แล้วที่สำคัญเดี๋ยวผมจะซวย 555+
ผมมีหลักการส่วนตัวอยู่อย่างหนึ่งคือ ถ้าผมไปอ่านบทความที่ไหน แล้วบทความนั้น ให้ประโยชน์โดยตรงแก่ผม ผมจะมองหา ads. ทันที และจะเลือกคลิก ads. ตัวที่น่าสนใจ ส่วนหนึ่งเพื่อเป็นการช่วยค่าโฮสต์ และให้กำลังใจ
จะได้เขียนบทความที่มีประโยชน์ต่อไป
วิธีนี้ทำให้ เวลาการ query เพิ่มขึ้นจากเดิมไหมครับ ผมกลัวว่ามันจะไปเหมือนกับ
UNION ALL SELECT
อ่านเขาใจง่ายดีครับ Php-Syslog-NG (all_logs) ก็ใช้ Engine นี้อยู่เหมือนกัน merge storage engine (MRG_MyIsam)
แต่พอ data tables อื่นเพิ่มมากขึ้น กับ error #1168 – Unable to open underlying table which is differently defined or of non-MyISAM type or doesn’t exists \