หากคุณไม่ได้เกี่ยวข้องกับตรรกะเชิงสัมพันธ์ต้องการความเร็วในการอ่านที่รวดเร็วจริงๆและคุณยินดีที่จะทำงานกับ RDBMS ฉันจะเสี่ยงต่อการบอก MySQL ทำไม ???
เอ็นจิ้นการจัดเก็บ MyISAM มีตัวเลือกที่ช่วยให้สามารถเพิ่มโครงสร้างทางกายภาพของตารางเพื่อประสิทธิภาพที่ดีขึ้น ตัวเลือกนั้นคืออะไร? ตัวเลือกแก้ไขตาราง ROW_FORMAT
ตัวอย่างเช่นหนังสือออกแบบฐานข้อมูล MySQL และปรับแต่งแนะนำให้ใช้ ROW_FORMAT = FIXED ในหน้า 72,73 สิ่งนี้จะแปลงเขตข้อมูล VARCHAR ทั้งหมดเป็น CHAR มันจะทำให้ตาราง MyISAM ใหญ่ขึ้น แต่ทำการเลือก SELECT กับมันจะเร็วขึ้นมาก ฉันสามารถยืนยันถึงสิ่งนี้เป็นการส่วนตัว ฉันเคยมีตารางที่ 1.9GB ฉันเปลี่ยนรูปแบบด้วย ALTER TABLE tblname ROW_FORMAT = FIXED ตารางสิ้นสุดลง 3.7GB ความเร็วของ SELECT ต่อมันเร็วขึ้น 20-25% โดยไม่ต้องปรับปรุงหรือเปลี่ยนแปลงอะไรเลย
ถ้าคุณมีตาราง MyISAM ที่มีข้อมูลอยู่แล้ว? คุณสามารถรับเมทริกสำหรับคำจำกัดความของคอลัมน์ที่แนะนำโดยอิงจากข้อมูลที่มีอยู่ในตาราง MyISAM แบบสอบถามใดนำเสนอการวัดเหล่านั้น
SELECT * FROM tblname PROCEDURE ANALYSE();
วิเคราะห์ขั้นตอน () วิธีนี้จะไม่แสดงข้อมูล มันจะอ่านค่าของทุกคอลัมน์และแนะนำนิยามคอลัมน์ ตัวอย่างถ้าคุณมีคอลัมน์ประเภทที่มีค่าเป็น 1-4 มันจะเป็นการดีที่สุดโดยใช้ ENUM ของค่าเหล่านั้น 4 จากนั้นคุณสามารถเลือกใช้ TINYINT หรือ CHAR (1) เนื่องจากพวกเขาใช้พื้นที่จำนวนเท่ากัน (1 ไบต์)
นี่คือสิ่งอื่นที่ควรพิจารณา: เมื่อคุณคิดที่จะใช้ NoSQL DB คุณเคยคิดที่จะใช้ MyISAM ในรูปแบบ NoSQL หรือไม่? เป็นไปได้ทีเดียว หน้า 175 ของหนังสือเล่มเดียวกันที่ฉันพูดถึงแนะนำให้ใช้โครงสร้างของด้ามจับเพื่ออ่านตารางโดยไม่มีสัมภาระที่เกี่ยวข้อง อันที่จริงแล้วหน้า 175 ให้ตัวอย่างนี้:
CREATE TABLE customer_mileage_details
(
customer_id INT NOT NULL,
ff_number CHAR(10) NOT NULL,
transaction_date DATE NOT NULL,
mileage SMALLINT NOT NULL,
INSERT(customer_id),
INSERT (ff_number,transaction_date)
) ENGINE = MYISAM;
ตารางนี้มีหลายล้านแถว สมมติว่าคุณต้องการสร้างการวิเคราะห์ข้อมูลที่มีข้อกำหนดดังต่อไปนี้:
- มันต้องการที่จะดึงข้อมูลบล็อกโดยเร็วที่สุด
- ขึ้นอยู่กับการป้อนข้อมูลของผู้ใช้หรือปัจจัยอื่น ๆ มีแนวโน้มว่าจะ "กระโดดไปมา" ในตาราง
- ไม่เกี่ยวข้องกับการเกิดพร้อมกันหรือปัญหาความสมบูรณ์ของข้อมูลอื่น ๆ
- ไม่จำเป็นต้องล็อคตารางข้ามแอปพลิเคชัน
คำสั่งเหล่านี้อนุญาตให้อ่านอย่างรวดเร็วและสกปรกจากตาราง:
HANDLER customer_mileage_details OPEN;
HANDLER customer_mileage_details READ ff_number FIRST WHERE ff_number=('aaetm-4441');
HANDLER customer_mileage_details READ NEXT LIMT 10;
HANDLER customer_mileage_details CLOSE;
ฉันหวังว่านี่จะให้อาหารสำหรับความคิด โปรดดูมัน
ข้อแม้
อะไรคือสิ่งที่น่าขันมากเกี่ยวกับเกี่ยวกับฉันเขียนโพสต์นี้โดยเฉพาะอย่างยิ่งคือการที่ผมเขียนโพสต์ก่อนหน้านี้เกี่ยว HANDLER ถูกนำมาใช้ใน Percona เซิร์ฟเวอร์ไบนารีและความคิดว่าการใช้มันก็ออกจากวันที่ ตั้งแต่โพสต์เก่าที่ฉันไม่เคยคิดว่าฉันจะเคยเขียนอะไรบางอย่างในการสนับสนุนโครงสร้าง HANDLER ตอนนี้ฉันยืนแก้ไข