คำถามที่คล้ายกันถูกถามก่อน
ความหมายของประสิทธิภาพของขนาด MySQL VARCHAR
นี่คือข้อความที่ตัดตอนมาจากคำตอบของฉัน
คุณต้องตระหนักถึงข้อเสียของการใช้ CHAR กับ VARCHAR
ด้วยฟิลด์ CHAR สิ่งที่คุณจัดสรรคือสิ่งที่คุณได้รับ ตัวอย่างเช่น CHAR (15) จัดสรรและจัดเก็บ 15 ไบต์ไม่ว่าคุณจะใส่อักขระในฟิลด์อย่างไร การจัดการสตริงนั้นง่ายและตรงไปตรงมาเนื่องจากขนาดของเขตข้อมูลสามารถคาดเดาได้ทั้งหมด
ด้วยฟิลด์ VARCHAR คุณจะได้รับเรื่องราวที่แตกต่างอย่างสิ้นเชิง ตัวอย่างเช่น VARCHAR (15) จะจัดสรรข้อมูลแบบไดนามิกมากถึง 16 ไบต์สูงสุด 15 สำหรับข้อมูลและอย่างน้อย 1 ไบต์เพิ่มเติมเพื่อจัดเก็บความยาวของข้อมูล หากคุณมีสตริง 'hello' ในการจัดเก็บที่ใช้เวลา 6 ไบต์ไม่ใช่ 5 การจัดการสตริงต้องดำเนินการตรวจสอบความยาวบางรูปแบบในทุกกรณี
การแลกเปลี่ยนจะเห็นได้ชัดเจนยิ่งขึ้นเมื่อคุณทำสองสิ่ง: 1. จัดเก็บล้านหรือหลายพันล้านแถว 2. การทำดัชนีคอลัมน์ที่มีทั้งแบบ CHAR หรือ VARCHAR
TRADEOFF # 1 เห็นได้ชัดว่า VARCHAR มีข้อได้เปรียบเนื่องจากข้อมูลที่มีความยาวผันแปรจะสร้างแถวที่เล็กลงและทำให้ไฟล์ทางกายภาพมีขนาดเล็กลง
TRADEOFF # 2 เนื่องจากเขตข้อมูล CHAR ต้องการการจัดการสตริงน้อยลงเนื่องจากความกว้างของฟิลด์คงที่การค้นหาดัชนีเทียบกับช่อง CHAR จะเร็วกว่าค่าเฉลี่ย 20% ของเขตข้อมูล VARCHAR นี่ไม่ใช่การคาดเดาใด ๆ ในส่วนของฉัน หนังสือการออกแบบและปรับแต่งฐานข้อมูล MySQL ทำสิ่งที่ยอดเยี่ยมบนโต๊ะ MyISAM เพื่อพิสูจน์สิ่งนี้ ตัวอย่างในหนังสือทำสิ่งต่อไปนี้:
ALTER TABLE tblname ROW_FORMAT=FIXED;
คำสั่งนี้บังคับให้ VARCHARs ทั้งหมดทำงานเป็น CHARs ฉันทำสิ่งนี้ที่งานก่อนหน้าของฉันในปี 2550 และเอาตาราง 300GB และเร่งการค้นหาดัชนีขึ้น 20% โดยไม่เปลี่ยนแปลงอะไรเลย มันทำงานตามที่เผยแพร่ อย่างไรก็ตามมันสร้างตารางเกือบสองเท่าในขนาด แต่มันกลับไปที่การแลกเปลี่ยน # 1
คุณสามารถวิเคราะห์ข้อมูลที่เก็บไว้เพื่อดูสิ่งที่ MySQL แนะนำสำหรับการกำหนดคอลัมน์ เพียงเรียกใช้สิ่งต่อไปนี้กับตารางใด ๆ :
SELECT * FROM tblname PROCEDURE ANALYSE();
สิ่งนี้จะสำรวจทั้งตารางและแนะนำคำนิยามคอลัมน์สำหรับทุกคอลัมน์ตามข้อมูลที่มีค่าฟิลด์ขั้นต่ำค่าฟิลด์สูงสุดและอื่น ๆ บางครั้งคุณต้องใช้สามัญสำนึกกับการวางแผน CHAR กับ VARCHAR นี่เป็นตัวอย่างที่ดี:
หากคุณกำลังจัดเก็บที่อยู่ IP มาสก์สำหรับคอลัมน์ดังกล่าวมีความยาวสูงสุด 15 อักขระ (xxx.xxx.xxx.xxx) ฉันจะกระโดดขึ้นมาทันทีCHAR(15)ใน heartbeat เพราะความยาวของที่อยู่ IP จะไม่แตกต่างกันมากนักและความซับซ้อนที่เพิ่มขึ้นของการจัดการสตริงที่ควบคุมโดยไบต์เพิ่มเติม คุณยังคงสามารถทำการPROCEDURE ANALYSE()ต่อต้านคอลัมน์ดังกล่าวได้ มันอาจแนะนำ VARCHAR ด้วยซ้ำ เงินของฉันจะยังคงเป็น CHAR มากกว่า VARCHAR ในกรณีนี้
ปัญหา CHAR vs VARCHAR สามารถแก้ไขได้ผ่านการวางแผนที่เหมาะสมเท่านั้น ด้วยพลังอันยิ่งใหญ่มาพร้อมความรับผิดชอบที่ยิ่งใหญ่ (ถ้อยคำที่เบื่อหู แต่จริง)
UPDATE
เมื่อพูดถึง MD5 การคำนวณstrlenภายในควรถูกกำจัดเมื่อสลับรูปแบบแถวทั้งหมด ไม่จำเป็นต้องเปลี่ยนการกำหนดเขตข้อมูล
ถ้าคีย์ MD5 เป็นเพียง VARCHAR ปัจจุบันฉันจะไปสำหรับมันและแปลงรูปแบบแถวของตารางจะคงที่ หากมีตัวเลขที่สำคัญของเขตข้อมูล VARCHAR อื่น ๆ อยู่พวกเขาก็จะได้รับประโยชน์เช่นกัน ในการแลกเปลี่ยนตารางจะขยายเป็นสองเท่าของขนาด แต่ข้อความค้นหาควรเร่งได้เร็วขึ้นประมาณ 20% โดยไม่ต้องปรับแต่งเพิ่มเติม