6.1 บทนำ
ตอนนี้ขอย้ายจากทฤษฎีไปสู่การปฏิบัติ
เราอยู่ในโลกแห่งความเป็นจริงและท้ายที่สุดแล้วผลิตภัณฑ์ซอฟต์แวร์ทั้งหมดก็ถูกสร้างขึ้นมาเพื่อผู้คนที่มีชีวิต และผู้คนที่มีชีวิตเหล่านี้รู้สึกรำคาญมากกับไซต์ที่โหลดช้าและโปรแกรมที่ช้าลง
และหากการ สืบค้นฐานข้อมูลใช้เวลานานกว่าหนึ่งวินาที สิ่งนี้เป็นสิ่งที่ยอมรับไม่ได้ ผู้ใช้จะไม่ใช้ผลิตภัณฑ์ที่มีหน้า/การทำงานที่ช้ามาก
แต่บ่อยครั้งในการแสดงหน้าเดียว คุณต้องทำแบบสอบถามหลายโหลไปยังฐานข้อมูล และหากมีการดำเนินการตามลำดับ คุณจะไม่มีขีดจำกัดที่สองอีกต่อไป แต่สมมติว่า 100 มิลลิวินาทีต่อคำขอ
ต่อไปนี้คือวิธี 5 อันดับแรกที่โปรแกรมเมอร์เพิ่มความเร็วในการสืบค้นฐานข้อมูล:
- การเพิ่มดัชนีให้กับตารางในฐานข้อมูล
- เขียนใหม่และเพิ่มประสิทธิภาพแบบสอบถาม
- เปิดใช้งาน (และกำหนดค่า) การแคชบนฝั่งฐานข้อมูล
- เปิดใช้งานการแคชในฝั่งไคลเอ็นต์
- ดำเนินการ denormalization ฐานข้อมูล
คุณคุ้นเคยกับสิ่งเหล่านี้เป็นส่วนใหญ่แล้ว ดังนั้นต่อไปนี้จะเป็นเพียงคำแนะนำที่นำไปใช้ได้จริงเท่านั้น
6.2 ดัชนี
ไม่มีความลับใดที่การทำงานกับฐานข้อมูลจะกินพื้นที่ส่วนใหญ่ของเกือบทุกไซต์ และทำงานร่วมกับฐานข้อมูลที่มักเป็นคอขวดของเว็บแอปพลิเคชัน
ในบทความนี้ฉันต้องการให้คำแนะนำที่เป็นประโยชน์เกี่ยวกับการใช้ MySQL
ฉันจะพูดทันที:
- บทความนี้เขียนเกี่ยวกับ MySQL แม้ว่าสิ่งทั่วไปมักจะเป็นจริงสำหรับ DBMS ใดๆ
- ทุกสิ่งที่เขียนในบทความเป็นมุมมองส่วนตัวของข้าพเจ้า และไม่ใช่ความจริงสูงสุด
- คำแนะนำไม่ได้แสร้งทำเป็นใหม่และเป็นผลมาจากการสรุปทั่วไปของวรรณกรรมที่อ่านและประสบการณ์ส่วนตัว
- ภายในกรอบของบทความนี้ ฉันจะไม่แตะต้องปัญหาการกำหนดค่า MySQL
ปัญหาในการใช้งาน MySQL สามารถแบ่งออกได้เป็นสามกลุ่มดังต่อไปนี้ (ตามลำดับความสำคัญ):
- การไม่ใช้หรือการใช้ดัชนีในทางที่ผิด
- โครงสร้างฐานข้อมูลไม่ถูกต้อง
- แบบสอบถาม SQL ไม่เหมาะสม \ ไม่ถูกต้อง
มาดูกันดีกว่าว่าแต่ละกลุ่มเหล่านี้เป็นอย่างไร
การใช้ดัชนี
การไม่ใช้หรือใช้ดัชนีในทางที่ผิดคือสิ่งที่ทำให้การค้นหาช้าลง สำหรับผู้ที่ไม่คุ้นเคยกับกลไกการทำงานของดัชนีหรือยังไม่ได้อ่านเกี่ยวกับเรื่องนี้ในคู่มือ เราขอแนะนำให้คุณอ่าน
เคล็ดลับสำหรับการใช้ดัชนี:
- คุณไม่จำเป็นต้องจัดทำดัชนีทุกอย่าง บ่อยครั้งโดยที่ไม่เข้าใจความหมาย ผู้คนเพียงแค่ทำดัชนีฟิลด์ทั้งหมดของตาราง ดัชนีเร่งการดึงข้อมูล แต่ทำให้การแทรกแถวและการอัปเดตช้าลง ดังนั้นการเลือกดัชนีแต่ละรายการจึงต้องมีความหมาย
- หนึ่งในพารามิเตอร์หลักที่กำหนดลักษณะของดัชนีคือการเลือก ซึ่งก็คือจำนวนขององค์ประกอบต่างๆ ในดัชนี มันไม่มีเหตุผลที่จะทำดัชนีฟิลด์ที่มีค่าที่เป็นไปได้สองหรือสามค่า จะมีประโยชน์เพียงเล็กน้อยจากดัชนีดังกล่าว
- การเลือกดัชนีควรเริ่มต้นด้วยการวิเคราะห์ข้อความค้นหาทั้งหมดเทียบกับตารางที่กำหนด บ่อยครั้งมาก หลังจากการวิเคราะห์ดังกล่าว แทนที่จะใช้ดัชนีสามหรือสี่ดัชนี คุณสามารถสร้างหนึ่งดัชนีผสมกันได้
- เมื่อใช้ดัชนีผสม ลำดับของฟิลด์ในดัชนีมีความสำคัญ
- อย่าลืมเกี่ยวกับการครอบคลุมดัชนี หากสามารถดึงข้อมูลทั้งหมดในแบบสอบถามจากดัชนีได้ MySQL จะไม่เข้าถึงตารางโดยตรง คำขอดังกล่าวจะดำเนินการอย่างรวดเร็ว ตัวอย่างเช่น สำหรับแบบสอบถาม
SELECT name FROM user WHERE login='test'
ที่มีดัชนี (ชื่อเข้าสู่ระบบ) ไม่จำเป็นต้องเข้าถึงตาราง บางครั้งก็สมเหตุสมผลที่จะเพิ่มฟิลด์เพิ่มเติมให้กับดัชนีผสม ซึ่งจะทำให้ดัชนีครอบคลุมและเพิ่มความเร็วในการค้นหา - สำหรับดัชนีแถว มักจะเพียงพอที่จะสร้างดัชนีเพียงบางส่วนของแถว สิ่งนี้สามารถลดขนาดดัชนีได้อย่างมาก
- หาก
%
เป็นจุดเริ่มต้นLIKE(SELECT * FROM table WHERE field LIKE '%test')
ดัชนีจะไม่ถูกใช้ - ดัชนี FULLTEXTใช้กับ ไวยากรณ์ MATCH ... AGAINSTเท่านั้น
6.3 โครงสร้างฐานข้อมูล
ฐานข้อมูลที่ออกแบบมาอย่างดีเป็นกุญแจสำคัญในการทำงานกับฐานข้อมูลอย่างรวดเร็วและมีประสิทธิภาพ ในทางกลับกัน ฐานข้อมูลที่ออกแบบมาไม่ดีมักสร้างปัญหาให้นักพัฒนาปวดหัวอยู่เสมอ
เคล็ดลับการออกแบบฐานข้อมูล:
- ใช้ชนิดข้อมูลที่เล็กที่สุดเท่าที่จะเป็นไปได้ ยิ่งชนิดข้อมูลมีขนาดใหญ่ ตารางก็ยิ่งต้องการการเข้าถึงดิสก์มากขึ้นเพื่อรับข้อมูล ใช้ขั้นตอนที่สะดวกมาก:
SELECT * FROM table_name PROCEDURE ANALYSE();
เพื่อกำหนดประเภทข้อมูลขั้นต่ำที่เป็นไปได้ - สังเกตรูปแบบปกติในระหว่างขั้นตอนการออกแบบ บ่อยครั้งที่โปรแกรมเมอร์หันไปใช้การทำให้เป็นปกติในขั้นตอนนี้ อย่างไรก็ตาม ในกรณีส่วนใหญ่ในตอนเริ่มต้นโครงการ ยังห่างไกลจากความชัดเจนว่าจะส่งผลอย่างไร การปรับตารางให้เป็นปกตินั้นง่ายกว่าการต้องทนทุกข์ทรมานจากตารางที่ปรับค่าให้ต่ำกว่ามาตรฐาน และ
JOIN
บางครั้งก็ทำงานได้เร็วกว่าตารางดีนอร์มัลไลซ์ที่ไม่ถูกต้อง - อย่าใช้
NULL
คอลัมน์เว้นแต่คุณจะต้องการจริงๆ
6.4 แบบสอบถาม SQL
บ่อยครั้งที่มีความปรารถนาที่จะเขียนแบบสอบถามทั้งหมดใน SQL ดั้งเดิมเพื่อให้แบบสอบถามนั้นเร็วที่สุด หากคุณตัดสินใจที่จะทำเช่นนี้ นี่คือเคล็ดลับบางประการ:
- หลีกเลี่ยงการร้องขอในวง SQL เป็นภาษาของชุด และการเขียนแบบสอบถามไม่ควรใช้ในภาษาของฟังก์ชัน แต่เป็นภาษาของชุด
- หลีกเลี่ยง
*
(เครื่องหมายดอกจัน) ในข้อความค้นหา อย่าลังเลที่จะระบุฟิลด์ที่คุณเลือก ซึ่งจะลดปริมาณข้อมูลที่ดึงและส่ง อย่าลืมเกี่ยวกับการครอบคลุมดัชนี แม้ว่าคุณจะเลือกเขตข้อมูลทั้งหมดในตารางแล้วก็ตาม จะเป็นการดีกว่าที่จะแสดงรายการเขตข้อมูลเหล่านั้น ประการแรกปรับปรุงความสามารถในการอ่านโค้ด เมื่อใช้เครื่องหมายดอกจัน เป็นไปไม่ได้ที่จะค้นหาว่าฟิลด์ใดอยู่ในตารางโดยไม่ดู ประการที่สองวันนี้ตารางของคุณมีห้า คอลัมน์ INT และหนึ่งเดือนต่อมาได้เพิ่ม TEXTและBLOBอีกหนึ่งรายการ และเครื่องหมายดอกจันยังคงอยู่เช่นเดิม - เมื่อแบ่งหน้า เพื่อรับจำนวนระเบียนทั้งหมด ใช้
SQL_CALC_FOUND_ROWS
และSELECT FOUND_ROWS();
เมื่อใช้SQL_CALC_FOUND_ROWS MySQL
แคชจำนวนแถวที่เลือก (ก่อนที่จะใช้ LIMIT) และเมื่อใช้SELECT FOUND_ROWS()
จะคืนค่าแคชนี้เท่านั้นโดยไม่ต้องดำเนินการค้นหาใหม่ - อย่าลืมว่ามี
INSERT
ไวยากรณ์สำหรับการแทรกหลายรายการ ข้อความค้นหาหนึ่งรายการจะเรียงลำดับความสำคัญได้เร็วกว่าข้อความค้นหาหลายรายการในลูป - ใช้
LIMIT
ในที่ที่คุณไม่ต้องการข้อมูลทั้งหมด - ใช้
INSERT… ON DUPLICATE KEY UPDATE…
แทนและINSERT
หรือUPDATE
หลังการเลือก และมักใช้REPLACE
แทน - อย่าลืมคุณสมบัติที่น่าทึ่ง
GROUP_CONCAT
นี้ สามารถช่วยตอบคำถามที่ซับซ้อนได้
GO TO FULL VERSION