วิธีการใช้ประโยชน์สูงสุดจาก MySQL บนเครื่อง QuadCore ด้วย RAM ขนาด 16 GB?


10

ฉันใช้เซิร์ฟเวอร์ MySQL 5.5 บนเวิร์กสเตชันของฉันสำหรับการวิเคราะห์ข้อมูลทางวิทยาศาสตร์และสงสัยว่าจะกำหนดค่า MySQL อย่างไรเพื่อให้ได้ประสิทธิภาพที่ดีที่สุด ประเภทของแบบสอบถามที่ฉันใช้โดยทั่วไปเกี่ยวข้องกับการรวม 10-20 ตารางและสามารถทำงานได้ค่อนข้างนานหนึ่งถึงหลายนาทีโดยไม่มีข้อยกเว้นเลย มีผู้ใช้เพียงไม่กี่รายเท่านั้นที่เข้าถึงฐานข้อมูลในเวลาเดียวกัน (5 เป็นจำนวนสูงสุด) ฉันย้ายเซิร์ฟเวอร์จาก Lenovo Thinkpad T61 ด้วย Dual Core 2.2 GHz และ RAM 4 GB ไปยังเครื่องใหม่ที่มีส่วนประกอบที่เลือกด้วยมือ:

  • Intel i7 3770, 4x 3.4 GHz (ทำงานที่ 4x3.7 GHz)
  • ชิปเซ็ต Z77
  • DDR3 1600 RAM 16 GB
  • Windows 7 Prof 64-bit
  • เซิร์ฟเวอร์ Windows และ MySQL ทำงานบนไดรฟ์ Intel 520 series SSD

การทดสอบครั้งแรก (การเรียกใช้คิวรีเดียวกันบนเครื่องทั้งสอง) แสดงการปรับปรุงที่ชัดเจนสำหรับความเร็วใหม่ แต่การสืบค้นยังคงใช้เวลานานและฉันคาดว่าจะได้รับการเพิ่มมากขึ้น แบบสอบถามที่มีปัญหานั้นได้รับการปรับให้เหมาะสมอย่างดีเช่นตารางทั้งหมดมีคีย์ที่เหมาะสมซึ่งใช้ในการ "อธิบายเพิ่มเติม"

ตอนนี้การตั้งค่า MySQL ปัจจุบันของฉัน: ครั้งแรกที่ฉันควรพูดถึงว่าฉันย้ายจาก MyISAM ไป Innodb นานมาแล้ว

my.ini tweaks ของฉันบางอย่าง (เช่นออกจากการตั้งค่าเริ่มต้น):

# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
#tmp_table_size=35M
tmp_table_size=4000M
max_heap_table_size=4000M

# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
# row data. The bigger you set this the less disk I/O is needed to
# access data in tables. On a dedicated database server you may set this
# parameter up to 80% of the machine physical memory size. Do not set it
# too large, though, because competition of the physical memory may
# cause paging in the operating system.  Note that on 32bit systems you
# might be limited to 2-3.5G of user level memory per process, so do not
# set it too high.
#innodb_buffer_pool_size=96M
innodb_buffer_pool_size=800M

general-log
expire_logs_days = 60
general_log_file = "F:/my_query_mysql.log"
log-output = TABLE
optimizer_search_depth = 0 #meant to cure the "statistics state" bug in some queries

ฉันต้องการที่จะรู้ว่าใครบางคนจะแนะนำการเปลี่ยนแปลงหมายเลขข้างต้นหรือแม้กระทั่งการตั้งค่าเพิ่มเติมที่ฉันไม่รู้จัก

ฉันขอขอบคุณคำพูดที่เป็นประโยชน์ใด ๆ

สตีฟ

แก้ไข: ฉันมีสองคำถามที่เกี่ยวข้องกับการเข้าร่วมใน 10-20 ตารางและวิ่งไปที่โน๊ตบุ๊ค Lenovo และพีซีใหม่ของฉัน Query # 1 ใช้เวลา 3m36s บนเครื่องใหม่เทียบกับ 9m11s บนแล็ปท็อป Query # 2 ใช้เวลา 22.5s บนเวิร์กสเตชันและ 48.5s บนแล็ปท็อป ดังนั้นความเร็วในการประมวลผลจึงเพิ่มขึ้นโดยประมาณ 2-2.5 บนเวิร์กสเตชันไม่มีการใช้ RAM แม้แต่ 50% โหลด CPU เฉลี่ยทั่วทั้งสี่แกน (ตามที่รายงานโดย Windows Task Manager) มีเพียงประมาณ 13% โหลดบนพื้นฐานต่อคอร์ (ตามรายงานโดย Core ชั่วคราว) ประมาณ 25-40% สำหรับหนึ่งคอร์ในขณะที่มันเป็น <= 10% สำหรับคนอื่น ๆ ที่ระบุว่า MySQL ไม่ได้ใช้หลายแกนสำหรับแบบสอบถามเดียว .


กรุณาแสดงโหลดเซิร์ฟเวอร์ของคุณเพื่อตรวจสอบหน่วยความจำ io โหลดซีพียู ฯลฯ

ฉันจะใช้การทดสอบและรายงานสิ่งที่ Windows Task Manager พูด (หรือคุณจะแนะนำเครื่องมือที่ดีกว่านี้?)

นั่นควรจะเพียงพอสำหรับการบ่งชี้แรกเพื่อดูว่าปัญหาของคุณอยู่ที่ใด

เพิ่งเพิ่มสถิติบางอย่าง

2
นอกจากนี้คุณยังสามารถลองใช้ตัวช่วยสร้าง Percona เพื่อรับการตั้งค่า "แนะนำ" สำหรับเซิร์ฟเวอร์ฐานข้อมูลของคุณที่tools.percona.com/wizard
Stephen Senkomago Musoke

คำตอบ:


5

เนื่องจากคุณใช้ MySQL 5.5 คุณอาจต้องพิจารณากำหนดค่า InnoDB เพื่อเข้าถึงหลายคอร์

นี่คือการตั้งค่าที่คุณควรใช้

innodb_thread_concurrencyตั้งค่าขอบเขตบนของจำนวนเธรดที่เกิดขึ้นพร้อมกันที่ InnoDB สามารถเปิดค้างไว้ จำนวนรอบที่ดีที่สุดสำหรับการตั้งค่านี้คือ (2 X จำนวนซีพียู) + จำนวนดิสก์ อัปเดต : เมื่อฉันเรียนรู้โดยตรงจากการประชุม Percona NYC คุณควรตั้งค่านี้เป็น 0 เพื่อแจ้งเตือน InnoDB Storage Engine เพื่อค้นหาจำนวนเธรดที่ดีที่สุดสำหรับสภาพแวดล้อมที่ทำงานอยู่

innodb_concurrency_ticketsตั้งค่าจำนวนเธรดที่สามารถข้ามการตรวจสอบพร้อมกันด้วยการไม่ต้องรับโทษ หลังจากถึงขีด จำกัด นั้นการตรวจสอบการทำงานพร้อมกันของเธรดจะกลายเป็นบรรทัดฐานอีกครั้ง

innodb_commit_concurrencyตั้งค่าจำนวนธุรกรรมที่เกิดขึ้นพร้อมกันที่สามารถยืนยันได้ เนื่องจากค่าเริ่มต้นคือ 0 การตั้งค่านี้ไม่อนุญาตให้มีจำนวนการทำธุรกรรมใด ๆ พร้อมกัน

innodb_thread_sleep_delayตั้งค่าจำนวนมิลลิวินาทีที่เธรด InnoDB สามารถหยุดทำงานก่อนที่จะป้อนคิว InnoDB อีกครั้ง ค่าเริ่มต้นคือ 10000 (10 วินาที)

innodb_read_io_threadsและinnodb_write_io_threads (ทั้งตั้งแต่ MySQL 5.1.38) จัดสรรจำนวนเธรดที่ระบุสำหรับการอ่านและเขียน ค่าเริ่มต้นคือ 4 และสูงสุดคือ 64

innodb_replication_delayกำหนดให้การหน่วงเวลาของเธรดบนทาสถึงถึง innodb_thread_concurrency

นี่คือกระทู้ที่ผ่านมาของฉันใน MySQL 5.5 และเปิดใช้งานหลายคอร์สำหรับ InnoDB


2

Percona- ชั้นนำข้อเสนอที่ปรึกษาด้านข้อมูล MySQL MySQL การกำหนดค่าตัวช่วยสร้าง ช่วยให้คุณสามารถกำหนดค่าmy.cnf/my.iniทั้งนี้ขึ้นอยู่กับการกำหนดค่าระบบของคุณ

นอกจากนี้คน Percona ยังได้เปิดตัวหนังสือชื่อ " High Performance MySQL " ฉบับที่สามเพิ่งเปิดตัวและครอบคลุมการปรับแต่งในรายละเอียดที่ยอดเยี่ยม


ค่าเหล่านี้คือสิ่งที่พวกเขาแนะนำเพื่อประสิทธิภาพที่ดีหรือว่ามันพ่นสิ่งที่ฉันป้อน
OpenCoderX

1

การใช้หน่วยความจำ: ดูที่http://mysql.rjweb.org/doc.php/memory (ค่าที่ปรับได้ส่วนใหญ่จะไม่สร้างความแตกต่างมากพอสำหรับเรื่องนี้)

max_heap_table_size = 4000M สูงอันตราย! หากผู้ใช้ 4 คนต้องการคุณจะไม่ได้ใช้ RAM และทำการสลับ การสลับสับเปลี่ยนการทำงานเป็นสิ่งที่เจ็บปวดมากกว่าสิ่งใด

การค้นหาใช้เวลาไม่กี่วินาที: ควรทำการศึกษาเพื่อการปรับปรุง โปรดให้ตารางแสดง SHOW; แสดงสถานะตาราง; อธิบายถึงการเลือก


0

คุณอาจพิจารณาตัวเลือกนากด้วยเช่นกัน เช่น PostgreSQL บน FreeBSD แต่การเปลี่ยนจาก Windows เป็น Linux จะเพิ่มประสิทธิภาพให้คุณ

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