หากมีสิ่งหนึ่งที่ฉันสามารถพูดเกี่ยวกับ MySQL ก็คือ InnoDB ซึ่งเป็นเครื่องมือจัดเก็บข้อมูลทรานแซคชัน (สอดคล้องกับกรด) ของมันนั้นเป็นมัลติเธรด อย่างไรก็ตามมันเป็นแบบมัลติเธรดตามที่คุณกำหนดค่า !!! แม้จะถูก "ออกนอกกรอบ" InnoDB ยังทำงานได้อย่างยอดเยี่ยมในสภาพแวดล้อม CPU เดียวเนื่องจากการตั้งค่าเริ่มต้น ในการใช้ประโยชน์จากความสามารถในการมัลติเธรดของ InnoDB คุณต้องจำไว้ว่าให้เปิดใช้งานตัวเลือกมากมาย
innodb_thread_concurrencyตั้งค่าขอบเขตบนของจำนวนเธรดที่เกิดขึ้นพร้อมกันที่ InnoDB สามารถเปิดค้างไว้ จำนวนรอบที่ดีที่สุดสำหรับการตั้งค่านี้คือ (2 X จำนวน CPUs) + จำนวนดิสก์ อัปเดต : เมื่อฉันเรียนรู้โดยตรงจากการประชุม 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
innodb_read_ahead_thresholdอนุญาตการอ่านเชิงเส้นของจำนวน extents ที่กำหนด (64 หน้า [หน้า = 16K]) ก่อนที่จะเปลี่ยนเป็นการอ่านแบบอะซิงโครนัส
เวลาจะหนีฉันถ้าฉันตั้งชื่อตัวเลือกเพิ่มเติม คุณสามารถอ่านเกี่ยวกับพวกเขาในเอกสารของ MySQL
คนส่วนใหญ่ไม่ทราบคุณสมบัติเหล่านี้และค่อนข้างพอใจกับ InnoDB เพียงทำธุรกรรมที่เป็นไปตามข้อกำหนดของกรด หากคุณปรับแต่งตัวเลือกใด ๆ เหล่านี้คุณก็ทำได้ด้วยความเสี่ยง
ฉันได้เล่นกับ MySQL 5.5 Multiple Buffer Pool Instances (162GB ในอินสแตนซ์ของ Pool buffer 9 รายการ) และได้พยายามที่จะแบ่งพาร์ติชันข้อมูลโดยอัตโนมัติในหน่วยความจำด้วยวิธีนี้ ผู้เชี่ยวชาญบางคนบอกว่าสิ่งนี้จะช่วยให้คุณปรับปรุงประสิทธิภาพได้ 50% สิ่งที่ฉันได้รับคือการล็อคเธรดมากมายที่ทำให้ InnoDB คลาน ฉันเปลี่ยนเป็น 1 บัฟเฟอร์ (162GB) และทุกอย่างก็ดีขึ้นอีกครั้งในโลก ฉันคิดว่าคุณต้องการผู้เชี่ยวชาญ Percona ในการกำจัดของคุณเพื่อตั้งค่านี้ ฉันจะเข้าร่วมการประชุม Percona MySQL ที่นิวยอร์กในวันพรุ่งนี้และจะถามเกี่ยวกับสิ่งนี้หากมีโอกาสเกิดขึ้น
โดยสรุปแล้ว InnoDB ทำงานได้ดีในเซิร์ฟเวอร์ CPU หลายตัวเนื่องจากการตั้งค่าเริ่มต้นสำหรับการทำงานแบบมัลติเธรด พวกเขาใช้ความระมัดระวังอย่างมากอดทนอย่างยิ่งเอกสารที่ยอดเยี่ยมและกาแฟที่ยอดเยี่ยม (หรือ Red Bull, Jolt ฯลฯ )
สวัสดีตอนเช้าสวัสดีตอนเย็นและราตรีสวัสดิ์ !!!
ปรับปรุง 2011-05-27 20:11
กลับมาจากการประชุม MySQL Percona ที่นิวยอร์กในวันพฤหัสบดี เป็นการประชุมอะไร เรียนรู้มากมาย แต่ฉันได้รับคำตอบฉันจะพิจารณาเกี่ยวกับ InnoDB ฉันได้รับแจ้งจากRonald Bradfordว่าการตั้ง innodb_thread_concurrency เป็น 0 จะทำให้ InnoDB เป็นผู้กำหนดแนวทางที่ดีที่สุดในการดำเนินการภายในพร้อมกับการทำงานพร้อมกันของเธรด ฉันจะทดลองเพิ่มเติมใน MySQL 5.5
อัพเดท 2011-06-01 11:20
เท่าที่หนึ่งแบบสอบถามยาวไป InnoDB เป็นกรดที่สอดคล้องและดำเนินงานได้เป็นอย่างดีโดยใช้Multiversion Concurrency ควบคุม ธุรกรรมควรมีระดับการแยก (อ่านซ้ำโดยค่าเริ่มต้น) ที่ป้องกันการบล็อกผู้อื่นจากการเข้าถึงข้อมูล
สำหรับระบบมัลติคอร์นั้น InnoDB นั้นมาไกล ในอดีต InnoDB ไม่สามารถทำงานได้ดีในสภาพแวดล้อมแบบมัลติคอร์ ฉันจำได้ว่าต้องรันหลายอินสแตนซ์ mysql บนเซิร์ฟเวอร์เดียวเพื่อให้ได้หลายคอร์เพื่อแจกจ่ายโพรเซส mysqld หลาย ๆ ตัวในซีพียู นี่ไม่จำเป็นอีกต่อไปขอบคุณ Percona และต่อมา MySQL (eh, Oracle บอกว่ายังคงทำให้ฉันปิดปาก) เนื่องจากพวกเขาได้พัฒนา InnoDB เป็นเครื่องมือเก็บข้อมูลที่เป็นผู้ใหญ่มากขึ้นที่สามารถเข้าถึงแกนด้วยความเรียบง่าย อินสแตนซ์ปัจจุบันของ InnoDB ในวันนี้สามารถทำงานได้ดีในเซิร์ฟเวอร์แกนเดียว