สวัสดีครับ ผมเขียนบทความนี้ขึ้นมาเนื่องจาก พบว่า Database ที่ผมใช้งานอยู่ Select ข้อมูลมาค่อนข้างช้า และผมก็ใช้วิธีการ Set Index เพิ่มเข้าไป มันก็สามารถทำงานได้เร็วขึ้นมากทีเดียว ก็เลยลองเขียนมาให้อ่านกันดู เผื่อใครเจอปัญหาทำนองนี้อยู่
ปกติแล้วหลังจากเขียนโปรแกรม php ที่ใช้กับ database MySQL เสร็จเรียบร้อยแล้ว ก็มักจะจบตรงนั้น พอใช้งานซักพัก ก็จะเริ่มพบปัญหาว่าทำไม ใช้ไปเรื่อยๆ มันก็ช้ามากขึ้น ซึ่งก็ต้องมาทำการจูนกันนิดหน่อย โดยการสร้าง Index ในบทความนี้ผมขอยกตัวอย่างว่า ผมใช้ table 1 อันก็แล้วกัน โดยมี field ดังข้างล่าง
id | INT10 | (Primary) |
fname | VARCHAR30 | (Primary) |
lname | VARCHAR30 | (Primary) |
salary | INT10 | (Primary) |
แล้วเกิดผมอยากจะ Select ข้อมูลว่าให้แสดงพนักงานที่มีเงินเดือนมากกว่า 5,000 บาทโดยใช้คำสั่งข้างล่าง
select * from emp where salary>5000;
ในกรณีนี้ MySQL จะทำ full table scan คือ จะทำการอ่านข้อมูลจากทุก record ว่าตรงตามเงื่อนไขหรือเปล่า ซึ่งเราสามารถตรวจสอบดูได้ โดยใช้คำสั่ง
explain select * from emp where salary>5000;
ผลลัพธ์ที่ได้จะเป็นดังนี้
table | type | possible_keys | key | key_len | ref | rows | Extra |
emp | ALL | 2073 | where used |
โดยช่อง table จะแสดงว่าชื่อ table ของ record ที่ถูกดึงข้อมูลมาคือ table อะไร ในตัวอย่างนี้คือ table ที่ชื่อ emp
ช่อง type จะแสดง วิธีการอ่านข้อมูลจาก table นั้น ในที่นี้ ALL หมายถึง database จะอ่านมาทุก record เพื่อนำมาเปรียบเทียบกับเงื่อนไข where
rows หมายถึงจำนวน row ที่ถูกอ่านขึ้นมา
ซึ่งหลังจากที่เรามีการ set index ที่ field salary แล้วทำการตรวจสอบอีกครั้งด้วยคำสั่ง
explain select * from emp where salary>5000;
จะได้ผลลัพธ์ดังนี้
table | type | possible_keys | key | key_len | ref | rows | Extra |
emp | ref | salary | salary | 10 | const | 1247 |
โดย type จะเปลี่ยนจาก ALL มาเป็น ref ซึ่งหมายถึง database จะดึงมาเฉพาะ row ที่มีเงื่อนไขตรงกับ index ที่ set ไว้
possible_keys คือ index key ที่อาจจะใช้สำหรับการทำคำสั่งนี้
key คือ index key ที่ใช้จริงๆสำหรับการทำคำสั่งนี้
rows คือ จำนวน row ที่อ่านขึ้นมา ซึ่งพบว่าในกรณีนี้จะมีการ row ขี้นมาน้อยกว่าตอนที่อ่านขึ้นมาทั้งหมด ซึ่งก็จะช่วยให้ database ติดต่อกับ I/O น้อย ลง ก็จะช่วยให้การทำงานเร็วขึ้น
จริงๆแล้ว เนื้อหาเกี่ยวกับการใช้คำสั่ง explain ก็มีอยู่อีกพอสมควร เช่น ในกรณีที่มีการทำ join กันหลายๆ table ซึ่งในส่วนนี้จะมีการกล่าวเอาไว้ ใน manual ของ MySQL อยู่แล้ว
ไม่มีความคิดเห็น:
แสดงความคิดเห็น