การใช้หน่วยความจำสูงสุดของ MySQL


111

ฉันต้องการทราบว่าเป็นไปได้อย่างไรในการกำหนดขีด จำกัด สูงสุดของจำนวนหน่วยความจำที่ MySQL ใช้บนเซิร์ฟเวอร์ Linux

ตอนนี้ MySQL จะใช้หน่วยความจำต่อไปเมื่อมีการร้องขอใหม่ทุกครั้งเพื่อให้หน่วยความจำหมดในที่สุด มีวิธีกำหนดวงเงินเพื่อไม่ให้ MySQL ใช้เกินจำนวนนั้นหรือไม่?


4
MySQL ไม่ "ใช้หน่วยความจำสำหรับทุกแบบสอบถามใหม่และในที่สุดก็หมด" การใช้หน่วยความจำนั้นซับซ้อนกว่านั้นมาก
Rick James

คำตอบ:


183

การใช้หน่วยความจำสูงสุดของ MySQL นั้นขึ้นอยู่กับฮาร์ดแวร์การตั้งค่าและฐานข้อมูลของคุณเอง

ฮาร์ดแวร์

ฮาร์ดแวร์เป็นส่วนที่ชัดเจน แรมมากขึ้น merrier ดิสก์เร็วขึ้นFTW อย่าเชื่อจดหมายข่าวรายเดือนหรือรายสัปดาห์เหล่านั้น MySQL ไม่ปรับขนาดเชิงเส้น - แม้กระทั่งบนฮาร์ดแวร์ของ Oracle มันยากกว่านั้นเล็กน้อย

บรรทัดล่างคือ: ไม่มีกฎทั่วไปสำหรับสิ่งที่แนะนำสำหรับการตั้งค่า MySQL ของคุณ ทั้งหมดขึ้นอยู่กับการใช้งานปัจจุบันหรือการคาดการณ์

การตั้งค่าและฐานข้อมูล

MySQL มีตัวแปรและสวิตช์จำนวนนับไม่ถ้วนเพื่อปรับพฤติกรรมให้เหมาะสม หากคุณประสบปัญหาคุณจำเป็นต้องนั่งอ่านคู่มือ (f'ing)

สำหรับฐานข้อมูล - ข้อ จำกัด ที่สำคัญบางประการ:

  • เครื่องยนต์ตาราง ( InnoDB, MyISAM, ... )
  • ขนาด
  • ดัชนี
  • การใช้

เคล็ดลับ MySQL ส่วนใหญ่เกี่ยวกับ stackoverflow จะบอกคุณเกี่ยวกับ 5-8 ที่เรียกว่าการตั้งค่าที่สำคัญ ก่อนอื่นไม่ใช่ทั้งหมดที่สำคัญเช่นการจัดสรรทรัพยากรจำนวนมากให้กับ InnoDB และการไม่ใช้ InnoDB นั้นไม่สมเหตุสมผลเพราะทรัพยากรเหล่านั้นสูญเปล่า

หรือ - ผู้คนจำนวนมากแนะนำให้เพิ่มmax_connectionตัวแปร - พวกเขารู้เพียงเล็กน้อยว่า MySQL จะจัดสรรทรัพยากรเพิ่มเติมเพื่อรองรับสิ่งเหล่านั้นmax_connectionsหากจำเป็น วิธีแก้ปัญหาที่ชัดเจนยิ่งขึ้นอาจเป็นการปิดการเชื่อมต่อฐานข้อมูลใน DBAL ของคุณหรือเพื่อลดจำนวนwait_timeoutเธรดเหล่านั้นให้เป็นอิสระ

ถ้าคุณจับฉันได้ - มีเรื่องมากมายให้อ่านและเรียนรู้มากมาย

เครื่องยนต์

เอ็นจิ้นตารางเป็นการตัดสินใจที่สำคัญมากหลายคนลืมไปก่อนแล้วจู่ๆก็พบว่าตัวเองกำลังต่อสู้กับMyISAMโต๊ะขนาด 30 GB ซึ่งล็อกและบล็อกแอปพลิเคชันทั้งหมด

ฉันไม่ได้ตั้งใจจะบอกว่าMyISAM แย่แต่InnoDBสามารถปรับแต่งให้ตอบสนองได้เกือบหรือเกือบจะเร็วที่สุดMyISAMและเสนอสิ่งต่างๆเช่นการล็อกแถวในUPDATEขณะที่MyISAMล็อกทั้งตารางเมื่อเขียนถึง

หากคุณมีอิสระในการเรียกใช้ MySQL บนโครงสร้างพื้นฐานของคุณเองคุณอาจต้องการตรวจสอบเซิร์ฟเวอร์ perconaเนื่องจากมีการสนับสนุนจำนวนมากจาก บริษัท ต่างๆเช่น Facebook และ Google (พวกเขารู้เร็ว) มันยังรวมถึงการลดลงของ Percona ด้วย แทนที่InnoDBเรียกว่าXtraDB.

ดูส่วนสำคัญของฉันสำหรับการตั้งค่า percona-server (และ -client) (บน Ubuntu): http://gist.github.com/637669

ขนาด

ขนาดฐานข้อมูลมีความสำคัญมาก - เชื่อหรือไม่ว่าคนส่วนใหญ่ใน Intarwebs ไม่เคยจัดการกับการตั้งค่า MySQL ที่มีขนาดใหญ่และเขียนอย่างเข้มข้น แต่สิ่งเหล่านี้มีอยู่จริง บางคนจะหมุนตัวและพูดว่า "ใช้ PostgreSQL !!! 111" แต่ตอนนี้เราไม่สนใจ

บรรทัดล่างคือตัดสินจากขนาดการตัดสินใจเกี่ยวกับฮาร์ดแวร์จะต้องทำ คุณไม่สามารถทำให้ฐานข้อมูล 80 GB ทำงานได้เร็วบน RAM 1 GB

ดัชนี

ไม่ใช่: ยิ่งมากยิ่งมีความสุข EXPLAINเฉพาะดัชนีที่จำเป็นจะต้องมีการตั้งค่าและการใช้งานจะต้องมีการตรวจสอบกับ เพิ่มเติมว่า MySQL EXPLAINมีจำนวน จำกัด แต่เป็นการเริ่มต้น

การกำหนดค่าที่แนะนำ

เกี่ยวกับสิ่งเหล่านี้my-large.cnfและmy-medium.cnfไฟล์ - ฉันไม่รู้ด้วยซ้ำว่าเขียนขึ้นเพื่อใคร ม้วนของคุณเอง

การปรับสีรองพื้น

เริ่มต้นที่ดีเป็นไพรเมอร์จูน มันเป็นสคริปต์ทุบตี (คำใบ้: คุณจะต้องใช้ลินุกซ์) ซึ่งใช้ผลลัพธ์ของSHOW VARIABLESและSHOW STATUSรวมเป็นคำแนะนำที่เป็นประโยชน์ หากเซิร์ฟเวอร์ของคุณทำงานมาระยะหนึ่งคำแนะนำจะดีกว่าเนื่องจากจะมีข้อมูลที่จะอ้างอิง

ไพรเมอร์การปรับแต่งไม่ใช่ซอสวิเศษ คุณควรอ่านตัวแปรทั้งหมดที่แนะนำให้เปลี่ยนแปลง

การอ่าน

ผมชอบที่จะแนะนำmysqlperformanceblog เป็นแหล่งข้อมูลที่ยอดเยี่ยมสำหรับเคล็ดลับเกี่ยวกับ MySQL ทุกประเภท และไม่ใช่แค่ MySQL เท่านั้นพวกเขายังรู้มากมายเกี่ยวกับฮาร์ดแวร์ที่เหมาะสมหรือแนะนำการตั้งค่าสำหรับ AWS เป็นต้นคนเหล่านี้มีประสบการณ์หลายปี

แหล่งข้อมูลที่ยอดเยี่ยมอีกอย่างคือplanet-mysqlแน่นอน


ฉันไม่รู้เกี่ยวกับtuning primerมันเปรียบเทียบกับmysqltuner?
greg0ire

38

เราใช้การตั้งค่าเหล่านี้:

etc/my.cnf
innodb_buffer_pool_size = 384M
key_buffer = 256M
query_cache_size = 1M
query_cache_limit = 128M
thread_cache_size = 8
max_connections = 400
innodb_lock_wait_timeout = 100

สำหรับเซิร์ฟเวอร์ที่มีคุณสมบัติดังต่อไปนี้:

Dell Server
CPU cores: Two
Processor(s): 1x Dual Xeon
Clock Speed: >= 2.33GHz
RAM: 2 GBytes
Disks: 1×250 GB SATA

16
ฉันคิดว่าคุณ (และผู้เขียนที่คุณเชื่อมโยง) มี query_cache_size และ query_cache_limit ในทางที่ผิด คุณกำลังบอก MySQL: จัดสรรแคช 1MB แต่อย่าใส่คำค้นหาใด ๆ ที่มีขนาดใหญ่กว่า 128MB dev.mysql.com/doc/refman/5.0/en/query-cache-configuration.html
agtb

ฉันจะลด max_connections ฉันจะตัดสินใจว่าจะใช้เอนจิ้นใดและไม่จัดสรรพื้นที่มากมายสำหรับทั้งสองอย่าง
Rick James

19

การใช้หน่วยความจำฐานข้อมูลเป็นหัวข้อที่ซับซ้อน บล็อก MySQL ผลการดำเนินงานไม่ได้งานที่ดีของการครอบคลุมคำถามของคุณและรายการหลายเหตุผลว่าทำไมมันทำไม่ได้อย่างมหาศาลเพื่อ "สำรอง" ความทรงจำ

หากคุณต้องการกำหนดขีด จำกัด แบบยากจริงๆคุณสามารถทำได้ แต่คุณต้องทำที่ระดับ OS เนื่องจากไม่มีการตั้งค่าในตัว ใน linux คุณสามารถใช้ulimitได้ แต่คุณอาจต้องแก้ไขวิธีที่ MySQL เริ่มต้นเพื่อกำหนดสิ่งนี้


ทางออกที่ดีที่สุดคือการปรับแต่งเซิร์ฟเวอร์ของคุณเพื่อให้การรวมกันของการตั้งค่าหน่วยความจำ MySQL ตามปกติจะทำให้การใช้หน่วยความจำลดลงโดยทั่วไปเมื่อติดตั้ง MySQL แน่นอนว่าสิ่งนี้จะส่งผลเสียต่อประสิทธิภาพของฐานข้อมูลของคุณ แต่การตั้งค่าบางอย่างที่คุณสามารถปรับแต่งได้my.iniได้แก่ :

key_buffer_size
query_cache_size
query_cache_limit
table_cache
max_connections
tmp_table_size
innodb_buffer_pool_size

ฉันจะเริ่มที่นั่นและดูว่าคุณจะได้ผลลัพธ์ที่ต้องการหรือไม่ มีบทความมากมาย เกี่ยวกับการปรับการตั้งค่าหน่วยความจำ MySQL


แก้ไข:

ทราบว่าบางชื่อตัวแปรที่มีการเปลี่ยนแปลงในที่ใหม่กว่า 5.1.x รุ่นของ MySQL

ตัวอย่างเช่น:

table_cache

ตอนนี้:

table_open_cache

2
Hi! ขอบคุณสำหรับคำตอบ. ฉันสังเกตเห็นว่าสมการที่ผู้คนอ้างถึงมีดังต่อไปนี้: key_buffer_size + (read_buffer_size + sort_buffer_size) * max_connections = หน่วยความจำทั้งหมด ฉันได้ตั้งค่าสิ่งต่อไปนี้: key_buffer_size = 128M, read_buffer_size = 1M, sort_buffer_size = 2M, max_connections = 120 และหน่วยความจำทั้งหมดบนเซิร์ฟเวอร์คือ 512M อย่างไรก็ตามหลังจากมีการสอบถามจำนวนมากหน่วยความจำที่ว่างได้ลดลงเหลือเพียง 12M และอาจจะยังคงใช้งานต่อไปได้ มีสาเหตุที่เป็นเช่นนั้นและสามารถป้องกันได้หรือไม่? ขอบคุณ!

หรือบางทีฉันอาจต้องพิจารณาว่าไม่ใช่หน่วยความจำทั้งหมดบนเซิร์ฟเวอร์ (512M) แต่เป็นหน่วยความจำว่าง (เช่นหน่วยความจำที่มีอยู่หลังจากโหลดระบบปฏิบัติการทั้งหมดที่เกี่ยวข้องและโปรแกรมอื่น ๆ )

1
หากคุณกำลังจะแก้ไข tmp_table_size โดยมีจุดประสงค์เพื่อเพิ่มขนาดของตาราง temp ที่สามารถเก็บไว้ใน RAM ได้อย่าลืมเพิ่ม max_heap_table_size ด้วยเนื่องจาก MySQL ใช้ขั้นต่ำสองอย่าง ...
Dave Rix

1
@TimothyMilsud - ไม่มีสูตรแบบนั้นได้ผลจริงๆ และเซิร์ฟเวอร์ส่วนใหญ่ทำงานได้ค่อนข้างดีเมื่อสูตรอ้างว่ามีการใช้ RAM มากเกินไป
Rick James

19

mysqld.exe ใช้ RAM 480 mb ฉันพบว่าฉันเพิ่มพารามิเตอร์นี้ใน my.ini

table_definition_cache = 400

ที่ลดการใช้หน่วยความจำจาก 400,000+ kb ลงเหลือ 105,000kb


ส่วนนี้อยู่ภายใต้อะไร? ฉันเพิ่มไปยังของฉันและบริการปฏิเสธที่จะเริ่มต้น
ข้อผิดพลาดทางไวยากรณ์

ไม่เป็นไรฉันย้ายมันไปไว้ที่ [wampmysqld] และมันก็ใช้งานได้ดีและลดหน่วยความจำที่ฉันใช้ลงไปมาก ฉันคิดว่ามันอาจเร่งความเร็วเพจโหลดโลคัลโฮสต์ของฉันในกระบวนการด้วยเช่นกันตอนนี้ดูเหมือนเร็วขึ้น
ข้อผิดพลาดทางไวยากรณ์

แม้ว่าค่าเริ่มต้นและขั้นต่ำคือ 400 แต่อะไรที่ทำให้สูงกว่า 400 ในกรณีของคุณ?
Wadih M.

5

ใน/etc/my.cnf:

[mysqld]
...

performance_schema = 0

table_cache = 0
table_definition_cache = 0
max-connect-errors = 10000

query_cache_size = 0
query_cache_limit = 0

...

ทำงานได้ดีบนเซิร์ฟเวอร์พร้อมหน่วยความจำ 256MB


เหตุใดจึงเป็นtable_definition_cache= 0 คำอธิบายบางอย่างจะดี และโดยพื้นฐานแล้วคุณไม่ได้แคชแบบสอบถาม ... ผลเช่นเดียวกันถ้าคุณquery_cache_type = 0:)
Khom Nazid

0

หากคุณกำลังมองหาการเพิ่มประสิทธิภาพคอนเทนเนอร์ mysql ของนักเทียบท่าคำสั่งด้านล่างอาจช่วยได้ ฉันสามารถเรียกใช้ mysql docker container จาก 480mb เริ่มต้นเป็นเพียง 100 mbs

นักเทียบท่ารัน -d -p 3306: 3306 -e MYSQL_DATABASE = test -e MYSQL_ROOT_PASSWORD = tooor -e MYSQL_USER = test -e MYSQL_PASSWORD = test -v / mysql: / var / lib / mysql --name mysqldb mysql --table_definition --performance_schema = 0 --default-authentication-plugin = mysql_native_password

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.