MyISAM สำหรับการอ่านข้อมูล


10

ฉันมีตารางที่มีแถวประมาณ 1 พันล้านแถวและอ่านได้ 98%

ฉันพยายามปรับฐานข้อมูลด้วยเอนจินการเก็บข้อมูลต่าง ๆ (MyISAM และ InnoDB)

จากนั้นทำการทดสอบสองสามครั้งเพื่อดูประสิทธิภาพ

ในส่วนที่ฉันมีรหัสคีย์หลักและดูเหมือนว่าตั้งแต่ MyISAM Key Cache เก็บดัชนีทั้งหมดในบัฟเฟอร์ของมันการใช้ MyISAM ดูเหมือนจะค่อนข้างเร็วเร็วกว่า InnoDB ประมาณ 2 เท่า

แต่สำหรับ InnoDB มันดูช้าลง !! InnoDB ไม่ได้ใช้บัฟเฟอร์ใด ๆ เพื่อโหลดดัชนีล่วงหน้าหรือไม่


บางทีผู้ดูแลที่มีความสุขที่กระตุ้นการลงคะแนนเพื่อปิดคำถามสามารถอธิบายรายละเอียดเกี่ยวกับแรงจูงใจของพวกเขาได้หรือไม่?
pQd

คุณช่วยให้เราทราบขนาดของฐานข้อมูลและตารางที่เป็นปัญหาหรือไม่ ขนาดโดยรวมของดิสก์จะมีประโยชน์ นอกจากนี้สเป็คเครื่องที่คุณกำลังใช้อยู่คืออะไร?
เดฟ Rix

คำตอบ:


6

ก่อนที่คุณจะตัดสินใจเกี่ยวกับ MyISAM หรือ InnoDB คุณจะต้องตรวจสอบทั้ง Storage Engine ในแง่ของแคชแต่ละตัว

MyISAM

เมื่ออ่านแล้วดัชนีของตาราง MyISAM สามารถอ่านได้ครั้งเดียวจากไฟล์. MYI และโหลดใน MyISAM Key Cache (ปรับขนาดตามkey_buffer_size ) คุณจะทำให้. MyYAM ของตารางอ่านได้เร็วขึ้นได้อย่างไร ด้วยสิ่งนี้:

ALTER TABLE mytable ROW_FORMAT=Fixed;

ฉันเขียนเกี่ยวกับเรื่องนี้ในโพสต์ที่ผ่านมาของฉัน

InnoDB

ตกลงสิ่งที่เกี่ยวกับ InnoDB InnoDB จะทำดิสก์ I / O ใด ๆ สำหรับการสืบค้นหรือไม่? น่าแปลกที่ใช่มันไม่ !! คุณอาจจะคิดผมบ้าบอกว่า แต่มันเป็นความจริงอย่างแน่นอนแม้สำหรับการค้นหา SELECT ณ จุดนี้คุณอาจสงสัยว่า "InnoDB เป็นอย่างไรในการทำดิสก์ I / O สำหรับการสืบค้น"

ทุกอย่างกลับไปที่ InnoDB ซึ่งเป็นระบบจัดเก็บข้อมูล Transactional ACID เพื่อให้ InnoDB เป็นธุรกรรมจะต้องมีการสนับสนุนIin ACIDซึ่งก็คือ Isolation เทคนิคในการรักษาความโดดเดี่ยวสำหรับการทำธุรกรรมจะกระทำผ่านMVCC การควบคุมภาวะพร้อมกันหลายอย่าง กล่าวอย่างง่าย InnoDB บันทึกข้อมูลที่มีลักษณะเหมือนก่อนที่ธุรกรรมจะพยายามเปลี่ยนแปลง ที่ได้รับการบันทึกไว้ที่ไหน ในไฟล์ tablespace ของระบบรู้จักกันในชื่อ ibdata1 ที่ต้องใช้ดิสก์ของ I / O

เปรียบเทียบ

เนื่องจากทั้ง InnoDB และ MyISAM ทำดิสก์ I / O อะไรที่เป็นปัจจัยสุ่มกำหนดว่าใครเร็วกว่ากัน

  • ขนาดของคอลัมน์
  • รูปแบบคอลัมน์
  • ชุดตัวละคร
  • ช่วงของค่าตัวเลข (ต้องการ INT มากพอ)
  • แถวถูกแบ่งข้ามบล็อก (การโยงแถว)
  • การกระจายตัวของข้อมูลเกิดจากDELETEsและUPDATEs
  • ขนาดของคีย์หลัก (InnoDB มีดัชนีแบบคลัสเตอร์ต้องการการค้นหาคีย์สองครั้ง)
  • ขนาดของรายการดัชนี
  • รายการไปที่ ...

บทส่งท้าย

ดังนั้นในสภาพแวดล้อมที่อ่านหนักเป็นไปได้สำหรับตาราง MyISAM ที่มีรูปแบบแถวคงที่เพื่อให้มีประสิทธิภาพสูงกว่า InnoDB อ่านออกจาก InnoDB Buffer Pool หากมีข้อมูลเพียงพอที่จะเขียนลงในบันทึกการเลิกทำที่มีอยู่ใน ibdata1 เพื่อสนับสนุนพฤติกรรมการทำธุรกรรม กำหนดไว้ในข้อมูล InnoDB วางแผนประเภทข้อมูลแบบสอบถามและเครื่องมือจัดเก็บข้อมูลของคุณอย่างรอบคอบ เมื่อข้อมูลเติบโตขึ้นอาจเป็นเรื่องยากที่จะย้ายข้อมูลไปมา

โดยวิธีการที่ฉันเขียนบางสิ่งเช่นนี้ 5 วันที่ผ่านมา: ฉันจะกำหนดวงเงินหน่วยความจำสำหรับ mySQL ได้อย่างไร


Innodbe สร้างแผ่นดิสก์ใด ๆ ที่อ่านจริง ๆ เมื่อข้อมูลทั้งหมดอยู่ในบัฟเฟอร์พูลแล้วและไม่มีการร้องขอการแก้ไขข้อมูลพร้อมกันเพียงแค่อ่าน?
pQd

ฉันเดาว่าเป็นผู้ถามมี 1 พันล้านแถวใน db ของเขาแล้วเขาไม่น่าจะมีแคชทั้งหมดใน RAM ในบัฟเฟอร์พูล - ดังนั้นจะต้องมีการอ่านเพื่อรับข้อมูลนอกบัฟเฟอร์พูลและบนดิสก์?
เดฟ Rix

3

MyISAM จะทำงานได้เร็วกว่า Innodb มากเมื่อไม่มีข้อโต้แย้งสำหรับข้อมูล เริ่มเพิ่มหลายเซสชันที่พยายามอัปเดตแท็บเล็ตเดียวกันและ innodb จะได้รับประโยชน์จากประสิทธิภาพการทำงานอย่างรวดเร็ว

วิธีที่คุณปรับระบบสำหรับเครื่องยนต์ 2 นั้นแตกต่างกันมาก

สาเหตุที่มีเอ็นจินต่างกันอยู่เนื่องจากเวิร์กโหลด / รูปแบบการเข้าถึงที่แตกต่างกัน


2

คุณต้อง 'อุ่นเครื่อง' innodb เช่นเล่นล็อกการเข้าถึงซ้ำหรือเรียกใช้คิวรีแบบสมาร์ทที่จะสัมผัสแต่ละค่าจากดัชนี

ลองดูที่นี่หรือที่นี่

ฉันหวังว่าคุณจะไม่ใช้การตั้งค่า mysql เริ่มต้นสำหรับ innodb - มันเหมาะสำหรับฮาร์ดแวร์ตั้งแต่ ~ 2000


ฉันทำการเปลี่ยนแปลงในการกำหนดค่าเริ่มต้นรวมทั้งเรียกใช้แบบสอบถามหลายครั้งประมาณ 30 ครั้ง แต่ก็ให้ผลลัพธ์เกือบเหมือนกัน มันเร็วกว่าหลังจากพยายามสองสามครั้ง แต่ยังคงช้ากว่า MYISAM และใช้ MariaDB (เวอร์ชั่นล่าสุด)
Akash

1

ตรวจสอบเว็บไซต์นี้มันมีข้อมูลที่เป็นประโยชน์มาก:

http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/

http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/

คุณยังสามารถปรับระบบไฟล์ของคุณ ฉันมีผลงานที่ดีใน XFS ด้วยค่าsunit และ swidth ที่ดีที่สุด(แน่นอนถ้าคุณใช้ RAID)


0

หลังจากปรับแต่ง InnoDB บน ​​MariaDB ต่อไปฉันเพิ่มinnodb_buffer_pool_sizeขนาดฐานข้อมูล InnoDB ของฉันตั้งแต่นั้นมา InnoDB เริ่มดึงแถวได้เร็วขึ้น

ฉันคิดว่าการปรับแต่ง InnoDB นั้นค่อนข้างสำคัญตามความต้องการฐานข้อมูล

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