หนึ่งในนักฆ่าเงียบ ๆ ของการเชื่อมต่อของ MySQL คือ MySQL Packet
อันดับแรกเรามาดูกันว่า MySQL Packet คืออะไร
ตามหน้า 99 ของ "การทำความเข้าใจกับ MySQL ภายใน" (ไอ 0-596-00957-7) ต่อไปนี้เป็นย่อหน้าที่ 1-3 อธิบายแพคเกจ MySQL:
โค้ดการสื่อสารบนเครือข่าย MySQL นั้นเขียนขึ้นภายใต้สมมติฐานที่ว่าคิวรีนั้นสั้นพอสมควรดังนั้นจึงสามารถส่งและประมวลผลโดยเซิร์ฟเวอร์ในหนึ่งก้อนซึ่งเรียกว่าแพ็กเก็ตในคำศัพท์ MySQL เซิร์ฟเวอร์จะจัดสรรหน่วยความจำสำหรับบัฟเฟอร์ชั่วคราวเพื่อเก็บแพ็คเก็ตและมันก็ร้องขอเพียงพอที่จะทำให้มันพอดี สถาปัตยกรรมนี้จำเป็นต้องมีข้อควรระวังเพื่อหลีกเลี่ยงเซิร์ฟเวอร์ที่มีหน่วยความจำไม่เพียงพอ - มีขนาดของแพ็คเก็ตซึ่งตัวเลือกนี้จะทำได้สำเร็จ
รหัสที่สนใจในความสัมพันธ์กับตัวเลือกนี้จะพบใน
SQL / net_serv.cc ลองดูที่my_net_read ()จากนั้นทำตามการเรียกร้องให้my_real_read ()และให้ความสนใจเป็นพิเศษกับ
net_realloc ()
ตัวแปรนี้ยังจำกัดความยาวของผลลัพธ์ของฟังก์ชั่นสตริงจำนวนมาก ดูSQL / field.ccและ
SQL / intem_strfunc.ccสำหรับรายละเอียด
การรู้สิ่งนี้เกี่ยวกับ MySQL Packets ช่วยให้ Developer / DBA เพิ่มขนาดให้รองรับหลาย BLOBs ภายในแพ็คเก็ตเดียวแม้ว่ามันจะใหญ่เกินไป แพ็กเก็ตขนาดเล็กเกินไปจะทำให้เกิดปัญหาสำหรับการเชื่อมต่อแบบเปิดในส่วนนี้
ตามเอกสาร MySQL
คุณสามารถรับข้อผิดพลาดเหล่านี้ได้ถ้าคุณส่งแบบสอบถามไปยังเซิร์ฟเวอร์ที่ไม่ถูกต้องหรือใหญ่เกินไป หาก mysqld ได้รับแพ็คเก็ตที่ใหญ่เกินไปหรือไม่เรียบร้อยก็จะถือว่ามีบางอย่างผิดปกติกับไคลเอนต์และปิดการเชื่อมต่อ หากคุณต้องการคิวรีขนาดใหญ่ (ตัวอย่างเช่นหากคุณทำงานกับคอลัมน์ BLOB ขนาดใหญ่) คุณสามารถเพิ่มขีด จำกัด คิวรีได้โดยการตั้งค่าตัวแปร max_allowed_packet ของเซิร์ฟเวอร์ซึ่งมีค่าเริ่มต้น 1MB คุณอาจต้องเพิ่มขนาดแพ็กเก็ตสูงสุดที่ส่วนท้ายของไคลเอ็นต์ ข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าขนาดแพ็คเก็ตได้รับในส่วน C.5.2.10“ แพ็คเก็ตใหญ่เกินไป”
คำสั่ง INSERT หรือ REPLACE ที่แทรกแถวจำนวนมากออกไปสามารถทำให้เกิดข้อผิดพลาดได้ หนึ่งในคำสั่งเหล่านี้ส่งการร้องขอเดียวไปยังเซิร์ฟเวอร์โดยไม่คำนึงถึงจำนวนแถวที่จะแทรก ดังนั้นคุณมักจะสามารถหลีกเลี่ยงข้อผิดพลาดได้โดยการลดจำนวนแถวที่ส่งต่อ INSERT หรือ REPLACE
คำแนะนำ
ลองเพิ่มmax_allowed_packetเป็นจำนวนที่มากกว่าเนื่องจากค่าเริ่มต้นคือ 1M ฉันจะแนะนำประมาณ 10 เท่าของฟิลด์ TEXT หรือ BLOB ที่ใหญ่ที่สุดที่คุณมีในชุดข้อมูลปัจจุบันของคุณ
หากต้องการตั้งค่า max_allowed_packet เป็น 256M คุณสามารถเพิ่มลงใน /etc/my.cnf หรือ my.ini
[mysqld]
max_allowed_packet=256M
เพื่อให้ครอบคลุมการเริ่มต้นใหม่ในอนาคตของ mysqld หากต้องการติดตั้งค่าทันทีบนเซิร์ฟเวอร์กรุณาเรียกใช้สิ่งนี้:
SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;
ให้มันลอง !!!