0019 | สารบัญนั้นสำคัญไฉน… (ว่าด้วย MySQL Index)

ดองไว้ตั้งนานแล้วครับ entry นี้
เคยเกริ่นๆ ไว้ตั้งนานแล้วด้วยแหละ

เรื่องนี้ถือเป็นเรื่องใหญ่มากๆ ครับในการออกแบบฐานข้อมูลบน MySQL
เนื่องด้วยมันจะมีผลต่อความเร็วในการค้นหาข้อมูลมาก ถึงมากที่สุด
เคสที่ยังใช้งานน้อยๆ เช่นมีการเรียกใช้แค่ นาทีละไม่ถึงสามสิบครั้ง อะไรอย่างนี้อาจจะไม่ค่อยเห็นผลเท่าไหร่
แต่พอมีการใช้งานเยอะๆ ดูสิครับ… ไม่อยากบรรยายถึงความเละสุดอนาถเลยแหละ

ทีนี้ จะดูยังไงว่าเราควรจะสร้างฐานข้อมูลยังไง ออกแบบยังไงให้มีประสิทธิภาพ
ตรงนี้ต้องดูการเรียกใช้งานของเราครับ เช่น…

อ้อ ลืมไป ยกตัวอย่างไม่ได้ ต้องสร้างตารางก่อน

CREATE TABLE users (
    id INT NOT NULL DEFAULT '0' AUTO_INCREMENT,
    username VARCHAR(24) NOT NULL DEFAULT '',
    password VARCHAR(32) NOT NULL DEFAULT '',
    email VARCHAR(64) NOT NULL DEFAULT '',
    PRIMARY KEY(id)
) Engine=MyISAM;

ในการนี้เราจะได้ตาราง users มี 4 field คือ id, username, password และ email
ทีนี้ สมมติเราต้องการดึงค่า email ออกมาจากตาราง โดยหาจาก username ก็ต้อง query แบบนี้

SELECT email FROM users WHERE username = 'xxxxxxx';

เงื่อนไขการค้นหาก็จะเป็น ค้นหาจาก ตาราง users โดยดูใน field username ที่มีค่าเท่ากับ ‘xxxxxxx’

กรณีที่เรายังไม่ได้ทำ Index ให้ตารางนี้…
MySQL จะเปิดตารางขึ้นมา(จาก harddisk) จากนั้นก็เริ่มตั้งแต่ record แรกสุด
เรียกข้อมูลใน field username ออกมาเทียบค่า ถ้าไม่ใช่ก็หาต่อไปเรื่อยๆ จนกว่าจะเจอ
ซึ่งกรณีเลวร้ายที่สุด คือค้นหาไม่เจอเลย จะทำให้ MySQL ต้องทำการอ่านข้อมูลจากตารางเยอะมาก
กลายเป็นว่า ต้องอ่านข้อมูลทั้งตารางเพื่อหาว่า user นี้อยู่ที่ record ไหน

สมมติพอทำ Index ปุ๊ป MySQL ก็จะเข้ามาอ่าน Index ที่มีอยู่
ซึ่งโดยปกติ index จะพยายามเก็บในแรมครับ แต่ก็มี file ที่เก็บบน harddisk เหมือนกัน
แล้วก็เทียบค่าไปเรื่อยๆ แต่แรมมันเร็วกว่า hdd เยอะครับ…
จากนั้น พอเจอแล้ว เจ้า index นี่ก็จะเป็นตัวบอกว่า ข้อมูลนี้อยู่ที่ตำแหน่งตรงไหนของแฟ้ม
ก็เลยทำให้ MySQL กระโดดไปเอาข้อมูลมาได้เลยครับ

คำสั่งเพิ่ม index ให้ตารางที่มีอยู่แล้วใช้อย่างนี้ครับ

ALTER TABLE users ADD INDEX (username)

.

เดี๋ยวจะมาอธิบายการตรวจสอบ query อีกที ง่วงมากเลยตอนนี้ T_T

Tags: , ,

0018 | Fedora 9 บน Dell R200

มันเพิ่งออกมาครับ ไอ้เจ้า Fedora 9 นี่
หลังจากที่รอคอย เธอมาแสนนาน ~*
เพิ่งลงเครื่อง eva01 ไป ผลลัพท์ที่ได้ เละมากมาย

1. มันใช้ upstart คุม service
ดีขึ้นนะ บูตเร็วขึ้นเยอะมากๆ เลย
เวลาคุม service อะไรพวกนี้ก็ค่อนข้างดีขึ้นด้วย รู้สึกว่าปัญหาจากระบบ service startup ลดลง

2. ยกเลิก network service ไปใช้ networkmanager แทน
network manager ตั้งค่าตรงไหนอ๊ะ หาไม่เจอ T_T
fix ip ไม่ถูก สุดท้ายก็เลยต้องปิด networkmanager แล้วรัน network service แทน
(ยังดีนะมีให้ใช้อยู่)

3. เปลี่ยนโครงสร้าง NFS ใหม่
จริงๆ เปลี่ยนตั้งนานและ เคยพูดถึงไปแล้วด้วย อันนี้ไม่ค่อยมีปัญหาเท่าไหร่

4. yum ทำงานไวขึ้นเยอะเลย
เปลี่ยนมาใช้แบบนี้ตั้งแต่ fedora 7 ละมั้ง ชอบใจไม่หาย

5. ที่แน่ๆ PHP ใหม่เกิน บั๊กเพียบเลย
memory leak ขึ้นมายุบยับมากเลย
รันได้ซักพัก swap พุ่งปรี๊ด โคตรเซ็ง
สุดท้ายก็เลยต้องเอา php 5.2.5 ตัวเก่าเรามา rebuild เองอีก เห้อ เสียเวลา

.

เอาเครื่องลงมาสี่ห้าวันแล้ว ยังไม่ได้เปิดใช้งานเลย
ทดสอบแล้ว overload ตลอด เซ็งมาก อาจต้องรัน fcgi ให้ lighttpd อีกเครื่องละมั้งนี่

Tags: