คุณควรพยายามดูคอลัมน์ varchar แบบเดียวกับที่คุณทำกับคอลัมน์ char ในสถานการณ์ส่วนใหญ่และตั้งค่าความยาวอย่างระมัดระวัง คุณไม่จำเป็นต้องคิดถึงตัวปรับแต่ง var เสมอไปเพราะสิ่งที่ส่งผลต่อการตัดสินใจของคุณเกี่ยวกับความยาวสูงสุด ควรถูกมองว่าเป็นคำแนะนำด้านประสิทธิภาพแทนที่จะเป็นสตริงที่ให้มาจะมีความยาวต่างกัน
ไม่ใช่คำสั่งที่ต้องปฏิบัติตามอย่างเคร่งครัดโดยภายในฐานข้อมูลสามารถละเว้นได้ทั้งหมด อย่างไรก็ตามโปรดใช้ความระมัดระวังเนื่องจากบางครั้งการนำไปใช้งานอาจรั่วไหล (เช่นความยาวคงที่และช่องว่างภายใน) แม้ว่าจะไม่ควรอยู่ในโลกแห่งอุดมคติก็ตาม
หากคุณมี varchar (255) คุณก็ไม่สามารถรับประกันได้ว่าประสิทธิภาพที่ชาญฉลาดมันจะทำงานแตกต่างจากถ่าน (255) เสมอในทุกสถานการณ์
อาจดูเหมือนง่ายที่จะตั้งค่าที่บางอย่างเช่น 255, 65535 ฯลฯ ตามคำแนะนำที่ให้ไว้ในคู่มือเกี่ยวกับข้อกำหนดในการจัดเก็บ สิ่งนี้ทำให้รู้สึกว่าค่าใด ๆ ระหว่าง 0 (ใช่มันเป็นสิ่งของ) และ 255 จะมีผลกระทบเช่นเดียวกัน อย่างไรก็ตามนั่นไม่ใช่สิ่งที่สามารถรับประกันได้อย่างเต็มที่
ข้อกำหนดในการจัดเก็บมักจะเป็นจริงหรือเป็นตัวบ่งชี้ที่ดีสำหรับเอ็นจิ้นการจัดเก็บถาวรที่เหมาะสมและครบถ้วนในแง่ของการจัดเก็บแถว มันไม่ได้เป็นตัวบ่งชี้ที่ชัดเจนสำหรับสิ่งต่างๆเช่นดัชนี
บางครั้งก็เป็นคำถามที่ยากว่าสตริงควรจะยาวแค่ไหนเพื่อตั้งค่าให้อยู่ในขอบเขตสูงสุดที่คุณรู้ว่าควรอยู่ภายใน แต่ก็ไม่มีผลกระทบ น่าเสียดายที่สิ่งนี้มักจะเหลือให้ผู้ใช้ดำเนินการและมันค่อนข้างจะเป็นไปตามอำเภอใจ คุณไม่สามารถพูดได้ว่าอย่าใช้สตริงเกินขนาดเพราะอาจมีบางกรณีที่คุณไม่แน่ใจ
คุณควรตรวจสอบให้แน่ใจว่าข้อความค้นหา MySQL ส่งข้อผิดพลาดเมื่อสตริงยาวเกินไปแทนที่จะตัดทอนเพื่อให้อย่างน้อยคุณก็รู้ว่าอาจสั้นเกินไปจากการปล่อยข้อผิดพลาดหรือไม่ การปรับขนาดคอลัมน์เพื่อขยายหรือย่อขนาดอาจเป็นการดำเนินการ DDL ที่มีราคาแพงซึ่งควรจำไว้
นอกจากนี้ควรพิจารณาชุดอักขระที่มีความยาวและประสิทธิภาพ ความยาวหมายถึงสิ่งนี้แทนที่จะเป็นไบต์ หากใช้ utf8 เช่น (ไม่ใช่ MB4) ดังนั้น varchar (255) จะเป็น varbinary (3 * 255) จริงๆ เป็นการยากที่จะทราบว่าสิ่งต่างๆเช่นนี้จะเกิดขึ้นจริงได้อย่างไรโดยไม่ต้องทำการทดสอบและดูรหัสต้นฉบับ / เอกสาร ด้วยเหตุนี้จึงมีขอบเขตสำหรับความยาวที่มากเกินไปที่จะส่งผลกระทบที่สูงเกินคาดโดยไม่คาดคิด สิ่งนี้ไม่ได้ใช้กับประสิทธิภาพเท่านั้น หากวันหนึ่งคุณจำเป็นต้องเปลี่ยนชุดอักขระของคอลัมน์ varchar ให้ใหญ่ขึ้นคุณอาจจบลงด้วยการกดขีด จำกัด บางอย่างโดยไม่มีการไล่เบี้ยหากคุณอนุญาตให้มีสตริงที่ยาวโดยไม่จำเป็นซึ่งสามารถหลีกเลี่ยงได้ นี่เป็นปัญหาเฉพาะที่ค่อนข้างเฉพาะ แต่มันก็เกิดขึ้น
หากปรากฎว่า MAX (LENGTH (คอลัมน์)) อยู่ที่ <64 เสมอ (เช่นหากมีการตัดสินใจว่าจะมีการ จำกัด อินพุตที่ไม่ตรงกับคำจำกัดความของคอลัมน์) แต่คุณมี varchar (255) แสดงว่ามี เป็นโอกาสดีที่คุณจะใช้พื้นที่มากกว่าที่จำเป็นถึงสี่เท่าในบางสถานการณ์
ซึ่งอาจรวมถึง:
- เครื่องยนต์ที่แตกต่างกันบางคนอาจละเลยมันไปโดยสิ้นเชิง
- ขนาดบัฟเฟอร์เช่นการอัปเดตหรือการแทรกอาจต้องจัดสรร 255 เต็ม (แม้ว่าฉันจะไม่ได้ตรวจสอบซอร์สโค้ดเพื่อพิสูจน์สิ่งนี้ แต่ก็เป็นเพียงการสมมุติเท่านั้น)
- ดัชนีสิ่งนี้จะชัดเจนทันทีหากคุณพยายามสร้างคีย์ผสมจากคอลัมน์ varchar (255) จำนวนมาก
- ตารางกลางและชุดผลลัพธ์ที่เป็นไปได้ เนื่องจากวิธีการทำงานของธุรกรรมอาจเป็นไปไม่ได้ที่บางสิ่งบางอย่างจะใช้ความยาวสูงสุดที่แท้จริงของสตริงในคอลัมน์ซึ่งตรงข้ามกับขีด จำกัด ที่กำหนดไว้
- การเพิ่มประสิทธิภาพการคาดการณ์ภายในอาจใช้ความยาวสูงสุดเป็นอินพุต
- การเปลี่ยนแปลงในเวอร์ชันการใช้งานฐานข้อมูล
ตามหลักทั่วไปแล้วไม่จำเป็นต้องให้ varchar นานเกินกว่าที่จะเป็นอยู่แล้วมีปัญหาด้านประสิทธิภาพหรือไม่ดังนั้นฉันขอแนะนำให้ปฏิบัติตามเมื่อคุณทำได้ ใช้ความพยายามมากขึ้นในการสุ่มตัวอย่างขนาดข้อมูลของคุณบังคับใช้ขีด จำกัด ที่แท้จริงหรือค้นหาขีด จำกัด ที่แท้จริงผ่านการถาม / การวิจัยเป็นแนวทางที่ดีที่สุด
เมื่อคุณทำไม่ได้หากคุณต้องการทำบางสิ่งเช่น varchar (255) สำหรับกรณีที่มีข้อสงสัยฉันขอแนะนำให้ทำตามหลักวิทยาศาสตร์ ซึ่งอาจประกอบด้วยการทำซ้ำตารางลดขนาดของคอลัมน์ var จากนั้นคัดลอกข้อมูลจากต้นฉบับและดูขนาดของข้อมูลดัชนี / แถว (จัดทำดัชนีคอลัมน์ด้วยและลองเป็นคีย์หลักด้วย อาจทำงานแตกต่างกันใน InnoDB เนื่องจากแถวเรียงลำดับตามคีย์หลัก) อย่างน้อยที่สุดวิธีนี้คุณจะรู้ว่าคุณมีผลกระทบต่อ IO ซึ่งมีแนวโน้มที่จะเป็นปัญหาคอขวดที่อ่อนไหวที่สุดอย่างหนึ่ง การทดสอบการใช้หน่วยความจำนั้นยากกว่าและยากที่จะทดสอบอย่างละเอียดถี่ถ้วน ฉันอยากจะแนะนำให้ทดสอบกรณีที่เลวร้ายที่สุดที่อาจเกิดขึ้น (การสืบค้นที่มีผลลัพธ์ระดับกลางจำนวนมากในหน่วยความจำตรวจสอบด้วยคำอธิบายสำหรับตารางอุณหภูมิขนาดใหญ่ ฯลฯ )
หากคุณรู้ว่าจะไม่มีแถวจำนวนมากในตารางคุณจะไม่ใช้คอลัมน์สำหรับการรวมดัชนี (โดยเฉพาะแบบผสมไม่ซ้ำกัน) และอื่น ๆ คุณมักจะไม่มีปัญหามากมาย
VARCHAR(255) utf8mb4
คอลัมน์เดียวที่จัดทำดัชนีโดยมีแถว ~ 150k วัดได้ 11.5MB ตารางที่มีVARCHAR(48) utf8mb4
คอลัมน์ที่จัดทำดัชนีซึ่งมีข้อมูลเดียวกัน (ความยาวสูงสุด 46 ตัวอักษร) ใช้ 4.5MB ไม่ได้มีความแตกต่างอย่างมากในการสืบค้น แต่มีการจัดทำดัชนี แต่จะรวมกับแบบสอบถาม I / O และสิ่งต่างๆเช่นการสำรองฐานข้อมูล