จากที่ตั้งใจไว้ตั้งแต่แรกคือเมื่อเจอประสบการณ์ทำงานอะไร ที่น่าจะเป็นประโยชน์แก่ผู้อื่น จะนำมาเขียนเล่าสูกันฟัง วันนี้ขอแนะนำการเพิ่มความเร็วในการค้นหาข้อมูลจากฐานข้อมูล MySQL เพียงแค่พิมพ์คำสั่งเดียวเท่านั้น เพื่อสร้าง index ของฟิลด์ที่ใช้ในการค้นหา
คำเตือน! การทดสอบแนะนำให้ทำบนเครื่องทดลองเท่านั้น เมื่อได้ผลลัพธ์ที่ต้องการแล้ว ค่อยไปปรับใช้กับเครื่องจริง
ฐานข้อมูลที่ทดลองปรับปรุง ใช้เก็บข้อมูลสินค้าของบริษัท ปัญหาที่พบคือเวลาค้นหาชื่อสินค้าโดยพิมพ์ชื่อแล้วกดค้นหา ต้องรอสักพักกว่าจะขึ้น ทั้งๆ ที่มีจำนวน record ประมาณ 60,000 แถว เท่านั้น เมื่อตรวจสอบรายละเอียดของ table แล้ว จะเป็นประมาณนี้
CREATE TABLE `items` ( `item_id` int(10) unsigned NOT NULL auto_increment, `item_name` varchar(255) default NULL, `item_descr` varchar(255) default NULL, `item_barcode` varchar(255) default NULL, `item_total` int(11) default '0', `item_status` char(1) default NULL, PRIMARY KEY (`item_id`) );
เมื่อทดสอบการค้นหาข้อมูล โดยใช้คำสั่ง SELECT จะได้ผลลัพธ์ดังนี้
mysql> SELECT item_id,item_name FROM items WHERE item_name='PNGS932A-31';
+---------+----------------------+ | item_id | item_name | +---------+----------------------+ | 22434 | PNGS932A-31 | +---------+----------------------+ 1 row in set (0.17 sec)
จากตัวอย่าง ใช้เวลาในการค้นหา 0.17 วินาที
เพื่อเพิ่มความเร็วในการค้นหาฟิลด์ที่ใช้งานบ่อยๆ แนะนำให้ทำ index หรือ key กับฟิลด์นั้นๆ วิธีการคือใช้คำสั่ง ALTER TABLE ตามตัวอย่างดังนี้
mysql> ALTER TABLE items ADD KEY (item_name); Query OK, 57625 rows affected (1.34 sec) Records: 57625 Duplicates: 0 Warnings: 0
แล้วทดลองค้นหาโดยใช้คำสั่ง SELECT อีกครั้งหนึ่ง เพื่อเปรียบเทียบ
mysql> SELECT item_id,item_name FROM items WHERE item_name='PNGS932A-31';
+---------+----------------------+ | item_id | item_name | +---------+----------------------+ | 22434 | PNGS932A-31 | +---------+----------------------+ 1 row in set (0.01 sec)
ผลลัพธ์ที่ได้ จะใช้เวลาแค่ 0.01 วินาที เท่านั้น ซึ่งเร็วกว่ามาก เมื่อเปรียบเทียบกับการไม่สร้าง index
ทดสอบเอา index ออกอีกครั้ง แล้วทดสอบ SELECT อีกที ผลลัพธ์จะกลับมาช้าเหมือนเดิม
ตัวอย่างการเอา index ออกจากฟิลด์ item_name
mysql> ALTER TABLE items DROP KEY item_descr; Query OK, 57625 rows affected (0.70 sec) Records: 57625 Duplicates: 0 Warnings: 0
mysql> SELECT item_id,item_name FROM items WHERE item_name='PNGS932A-31';
+---------+----------------------+ | item_id | item_name | +---------+----------------------+ | 22434 | PNGS932A-31 | +---------+----------------------+ 1 row in set (0.17 sec)
คำแนะนำ
- ทำ index กับฟิลด์ที่ใช้ค้นหาบ่อยๆ หรือใช้เป็นเงื่อนไขการ JOIN TABLE
- ไม่จำเป็นเสมอไป หลังจากทำ index แล้วจะเร็วขึ้น ขึ้นอยู่กับการออกแบบฐานข้อมูลและคำสั่งที่ใช้ค้นหาด้วย
- หากต้องการข้อมูลเพิ่มเติม แนะนำให้ดูจากข้อมูลอ้างอิง
ข้อมูลอ้างอิง
นี่ล่ะที่ผมตามหามานานนนนน ไม่มีงบจ้างเค้าทำ -*- เลยต้องมั่วเอง ขอบคุณครับ
เป็นประโยชน์มากครับ
เข้าใจขึ้นเยอะเลยครับ แต่น่าจะอธิบายประเภทของ index ว่ามีกี่แบบ แต่ละแบบมีประโยชน์อย่างไรจะดีมากเลยครับ ขอบคุณครับ
เป็นประโยชน์กับกับการทำงานมาก ๆ เลย
DB คงจะเร็วขึ้นมาก ๆ
ขอบคุณครับ กำลังหาวิธีทำให้ DB เร็วขึ้นพอดีเลย
ขอบคุณครับ กำลังหาวิธีทำให้ DB เร็วขึ้นพอดีเลย.