Thursday, January 17, 2008

การทำ Index ของ Database

การทำ Index มีประโยชน์ในการค้นหาข้อมูล Query ได้รวดเร็ว โดยการค้นหาจะเป็นการกระโดดไปยังตำแหน่งที่ต้องการได้เลย ทำให้ไม่จำเป็นที่จะต้องค้นหาหมดทุก Row ทำให้ Query ได้เร็วกว่าเดิมมาก
1. ถ้าจะสร้างตาราง โดยจะใช้ field ที่เราใช้เป็นเงื่อนไขในการ query บ่อยๆ ก็สามารถสร้างตารางได้เลย เช่น
CREATE TABLE MyTransactionLogs
(
myKey INT AUTO_INCREMENT NOT NULL
myIndex TIMESTAMP NOT NULL
data1 VARCHAR(100)
data2 VARCHAR(100)
data3 VARCHAR(100)
etc VARCHAR(255)
PRIMARY KEY(myKey)
INDEX (myIndex)
)
;

2. ถ้าต้องการปรับปรุงตาราง ที่สร้างไปแล้ว เพื่อจัด index ให้ข้อมูลในฟิล์ด myIndex ถ้า myIndex ไม่ได้สั่งให้เป็น index ตั้งแต่ตอนสร้างตาราง ก็สามารถใช้คำสั่ง ข้างล่างนี้ จะทำให้ Query เร็วขึ้นมาก
ALTER TABLE MyTransactionLogs ADD INDEX(myIndex);
การจัดการ index ของตารางที่มมีฐานข้อมูลอยู่แล้ว จะเป็นการนำข้อมูลทั้งหมดของฟิล์ดที่เราต้องการจัด index มาจัดเรียง ทำให้เราต้องเสียพื้นที่(disk space) ในการจัดเก็บข้อมูลเพิ่มขึ้น ดังนั้นจึงไม่ควรจัด index ให้กับทุกฟิล์ดในตาราง ซึ่ง Field ที่ควรจัดเก็บควรมีคุณสมบัติดังต่อไปนี้
  • Field ที่ใช้เป็นเงื่อนไขในการค้นหาข้อมูล (เวลา query อยู่หลัง WHERE ก็คือ Field ที่ควรทำ Index)
  • จัด index ให้กับฟิล์ดที่ใช้ในการจัดเรียง (GROUP BY, ORDER BY)
  • จัด index ให้กับ Foreign Keys ที่เราเอาไว้ JOIN
และขั้นตอนในการจัด index จะใช้เวลาพอสมควรขึ้นอยู่กับจำนวนของข้อมูลว่ามีมากน้อยเพียงใด แต่ถ้ามีข้อมูลเป็นหลัก ล้าน หรือมากกว่านั้นก็จะใช้เวลามากขึ้น
โดยขณะที่กำลังจัด index อยู่ ตารางจะถูก locked ไว้ เพื่อไม่ให้ใครมา insert/update/delete ได้ ถ้าตารางข้อมูลกำลังรันอยู่ที่ production และต้องมีการใช้งานอยู่ตลอดเวลา คุณอาจจะเลี่ยงไปทำตอนที่มี traffic การใช้งานน้อย เช่น ช่วงตี 3 - ตี 4 ซึ่งเป็นช่วงนี้ traffic น้อยที่สุด

2 comments:

lead said...

ขอบคุณครับ ที่ให้ข้อมูลแบบเข้าใจง่ายๆ

Anonymous said...

ขอบคุณครับ