MySQL Database ด้วย Partitioning

เรื่องใหม่นำมาอัปเดท ใหม่ในที่นี้คือใหม่สำหรับทีมงาน กับการทำ MySQL Database ด้วย Partitioning ที่จะช่วยให้การค้นหาข้อมูลตามเงื่อนไขมีความเร็วมากขึ้น แทนที่จะอ่านข้อมูลจากรายการทั้งหมด มาเป็นการอ่านข้อมูลจากส่วนที่มีช่วงของข้อมูลนั้นอยู่แทนซึ่งมีจำนวน record ที่น้อยกกว่าการอ่านข้อมูลทั้งหมด โดยอาศัยการแยกข้อมูลออกเป็นช่วงของข้อมูลตามเงื่อนไขในการแบ่ง Partition แม้ว่าจะต้องอ่านข้อมูลมาจาก Partition มากกว่า 1 ตัวก็ตาม จำนวน record ก็ยังน้อยกกว่าข้อมูลทั้งหมด

เพิ่มความเร็วในการอ่าน MySQL Database ด้วย Partitioning

กระบวยการแบ่งข้อมูลออกเป็น partition เหมือนการแบ่ง Hard disk Partition โดยการกำหนดขอบเขตของข้อมูล โดยการทำ Partition มีทั้งแบบแนวตั้ง (Vertical Partitioning) และการทำ Partition แบบแนวนอน (Horizontal Partitioning) แต่สำหรับ MySQL เราจะขอพูดถึงเฉพาะการทำ Partition แบบแนวนอน หรือแนวระบบเท่านั้น

ฐานข้อมูลของคุณรองรับการทำ Partition หรือเปล่า

การที่จะเปิดใช้คุณสมบัติการทำ Partition ฐานข้อมูลจะต้อง compile plugin “partition” เข้ามาแล้วถึงจะสามารถเรียกใช้งานได้ วิธีตรวจสอบให้เข้าไปใน MySQL Command

mysql> SHOW PLUGINS;
mysql show plugin

mysql show plugin

ตัวอย่างการทำ Partition Table เพื่อแยกข้อมูลออกเป็นชุด

ALTER TABLE hb_tickets DROP PRIMARY KEY, ADD PRIMARY KEY (id, status, dept_id);

ALTER TABLE hb_tickets
PARTITION BY LIST COLUMNS (status)
SUBPARTITION BY KEY (dept_id)
(
 PARTITION p0 VALUES IN ('Answered'),
 PARTITION p1 VALUES IN ('Client-Reply'),
 PARTITION p2 VALUES IN ('Closed'),
 PARTITION p3 VALUES IN ('In-Progress'),
 PARTITION p4 VALUES IN ('Open'),
 PARTITION p5 VALUES IN ('Scheduled')
);

SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='hb_tickets';

ALTER TABLE hb_ticket_replies DROP PRIMARY KEY, ADD PRIMARY KEY (id, date);

ALTER TABLE hb_ticket_replies 
PARTITION BY RANGE COLUMNS (date)(
 PARTITION p0 VALUES LESS THAN ('2014-01-01'),
 PARTITION p1 VALUES LESS THAN ('2015-01-01'),
 PARTITION p2 VALUES LESS THAN ('2015-03-01'),
 PARTITION p3 VALUES LESS THAN ('2015-06-01'),
 PARTITION p4 VALUES LESS THAN ('2015-09-01'),
 PARTITION p5 VALUES LESS THAN ('2015-12-01'),
 PARTITION p6 VALUES LESS THAN ('2016-03-01'),
 PARTITION p7 VALUES LESS THAN ('2016-06-01'),
 PARTITION p8 VALUES LESS THAN ('2016-09-01'),
 PARTITION p9 VALUES LESS THAN ('2016-12-01')
);

SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='hb_ticket_replies ';

จากตัวอย่างการแบ่ง Partition Table เราจะต้องตั้ง primary key ให้กับ field ที่เราจะใช้เป็นตัวกำหนด Partition เสร็จแล้วจึงทำการแบ่ง Partition ตามเงื่อนไขที่ต้องการ จากนั้นเราสามารถตรวจสอบได้ว่าหลังจากแบ่ง Partition เรียบร้อยแล้วข้อมูลถูกจัดเข้ากลุ่มใหนจำนวนเท่าใหร่

ประเภทของ Partition มีอะไรบ้าง

  • RANGE Partitioning การแบ่ง partition โดยการกำหนดช่วงของข้อมูล
  • LIST Partitioning การแบ่ง partition โดยการกำหนดกลุ่มของข้อมูล
  • COLUMNS Partitioning ารแบ่ง partition โดยการกำหนดได้ทั้งแบบช่วง หรือกลุ่ม และคุณสมบัตินี้ยังรองรับประเภทข้อมูลที่เป็นข้อความได้ด้วย
  • HASH Partitioning
  • KEY Partitioning

ข้อควรรู้ที่การทำ Partition Table

  1. การทำ Partitioning Table ใช้สำหรับการลด record เพื่อเพิ่มความเร็วในการค้นหาข้อมูล ออกเป็นหลายๆกลุ่ม หรือที่เรียกว่า table archive ซึ่งจะต้องอ้างอิงกับการ query ข้อมูลด้วย เช่นต้องการทราบว่าเดือนนี้มี order เท่าใหร่ อะไรบ้างให้แสดงออกมา ถ้าเราแบ่งข้อมูลออกเป็นเดือนๆ ฐานข้อมูลจะถูกอ่านเฉพาะส่วน หรือก็คือหนึ่ง partition
  2. การทำ Partitioning Table จะไม่มีประโยชน์อะไรกับการ query ข้อมูลที่ซับซ้อน หรือข้อมูลสรุปรวมทั้งหมด เพราะคำสั่งจะเข้าไปมีส่วนกับทุกรายการของตารางนั้น เช่นการคำนวณหายอดขายทั้งหมดตั้งแต่เปิดร้าน ทุกรายการข้อมูลในตารางจะถูกตรวจสอบ

 

สนใจการ Optimize MySQL Database
ติดต่อเรา
  • ประสิทธิ์ นาคดี

    การทำ MySQL Database ด้วย Partitioning ที่จะช่วยให้การค้นหาข้อมูลตามเงื่อนไขมีความเร็วมากขึ้น แทนที่จะอ่านข้อมูลจากรายการทั้งหมด มาเป็นการอ่านข้อมูลจากส่วนที่มีช่วงของข้อมูลนั้นอยู่แทนซึ่งมีจำนวน record ที่น้อยกกว่าการอ่านข้อมูลทั้งหมด โดยอาศัยการแยกข้อมูลออกเป็นช่วงของข้อมูลตามเงื่อนไขในการแบ่ง Partition แม้ว่าจะต้องอ่านข้อมูลมาจาก Partition มากกว่า 1 ตัวก็ตาม จำนวน record ก็ยังน้อยกกว่าข้อมูลทั้งหมด – See more at: http://narkdeveloper.com/%e0%b9%80%e0%b8%9e%e0%b8%b4%e0%b9%88%e0%b8%a1%e0%b8%84%e0%b8%a7%e0%b8%b2%e0%b8%a1%e0%b9%80%e0%b8%a3%e0%b9%87%e0%b8%a7%e0%b9%83%e0%b8%99%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%ad%e0%b9%88%e0%b8%b2%e0%b8%99-m/#sthash.EilevCKe.dpuf