ถ้าฉันเป็นคุณฉันจะเปลี่ยนข้อมูลทั้งหมดเป็น InnoDB ล็อคตาราง / แถวล็อคได้รับการกล่าวถึงมานานแล้วโดยหลาย ฉันจะเลือก InnoDB เสมอ อย่างไรก็ตามมีอีกเหตุผลที่ลึกซึ้งในการเลือก InnoDB
ในขณะที่คนส่วนใหญ่โม้ว่า MyISAM เร็วกว่าสำหรับการอ่านคนส่วนใหญ่ลืมว่าแคชจำนวนมากสำหรับ MyISAM ซึ่งเรียกว่าแคชคีย์ (กำหนดโดย key_buffer_size) เพียงแคชหน้าดัชนีจากไฟล์. MII มันไม่เคยแคชหน้าข้อมูล มีสูงสุด 4GB อย่างเป็นทางการในระบบ 32 บิต 8GB นั้นดีที่สุดสูงสุดสำหรับ 64- บิต
InnoDB Buffer Pool แคชข้อมูลและหน้าดัชนี คุณสามารถแคชได้ถึงชุดข้อมูลทั้งหมดใน RAM ทั้งนี้ขึ้นอยู่กับเซิร์ฟเวอร์ที่คุณมี คุณสามารถปรับ InnoDB สำหรับ RAM สูงสุด 80% และ 10% สำหรับ DB Conenctions และปล่อยให้ 10% สำหรับระบบปฏิบัติการ นี้เป็นจริงแม้สำหรับระบบปฏิบัติการที่แตกต่างกัน
ฉันได้แนะนำสิ่งเหล่านี้ให้กับลูกค้าของ Drupalด้วยความสำเร็จที่ยิ่งใหญ่ มันใช้กับ Wordpressเช่นกัน ฉันได้ให้การสนับสนุนฐานข้อมูลสำหรับลูกค้าด้วย WordPress การปรับปรุงเหมือนกัน
คุณสามารถกำหนดค่าหน่วยความจำสำหรับ InnoDB ได้อย่างมีประสิทธิภาพยิ่งขึ้นซึ่งคุณสามารถ MyISAM ได้มากขึ้น มีวิธีการที่จะค้นหาInnoDB ให้ตรงกับความต้องการของคุณเสมอ เมื่อข้อมูลของคุณเติบโตขึ้นมันก็จะกลายเป็นข้อกำหนดในที่สุด
ข้อมูลล่าสุด 2011-11-21 11:44 EST
หากชุดข้อมูลที่สมบูรณ์ของคุณมีขนาดเล็กพอคุณสามารถเรียกใช้แบบสอบถามแบบใช้เลือกข้อมูลบนทุกตารางที่คุณมีหลังจากเริ่ม mysql
สำหรับตารางทั้งหมดที่เป็น InnoDB และ / หรือ MyISAM ให้เรียกใช้แบบสอบถามนี้:
SELECT DISTINCT
CONCAT('SELECT ',ndxcollist,' FROM ',
db,'.',tb,' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM (
SELECT
engine,table_schema db,table_name tb,index_name,
GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
FROM (
SELECT
B.engine,A.table_schema,A.table_name,
A.index_name,A.column_name,A.seq_in_index
FROM
information_schema.statistics A INNER JOIN
(SELECT engine,table_schema,table_name
FROM information_schema.tables
WHERE engine IN ('InnoDB','MyISAM')) B
USING (table_schema,table_name)
WHERE
B.table_schema NOT IN ('information_schema','mysql')
AND A.index_type <> 'FULLTEXT'
ORDER BY
table_schema,table_name,index_name,seq_in_index
) A
GROUP BY
table_schema,table_name,index_name
) AA
ORDER BY
engine DESC,db,tb
;
สิ่งนี้จะแสดงผลการสืบค้น SELECT ที่เป็นไปได้ทั้งหมดที่คุณต้องการเรียกใช้ซึ่งจะเรียกดัชนีทั้งหมดที่จะอ้างอิง วางเคียวรีนี้ในไฟล์ชื่อ /root/MakeSelectQueriesToLoad.sql รันสคริปต์และรวบรวมเอาต์พุต /root/SelectQueriesToLoad.sql ในที่สุดเรียกใช้มัน:
mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql
สิ่งนี้จะโหลดหน้าดัชนีทั้งหมดลงใน InnoDB Buffer Pool และ MyISAM Key Cache อย่างแน่นอน หากข้อมูลทั้งหมดของคุณคือ InnoDB ให้ทำการเปลี่ยนแปลงสองอย่าง:
- แทนที่
WHERE engine IN ('InnoDB','MyISAM')
ด้วยWHERE engine='InnoDB'
- แทนที่
CONCAT('SELECT ',ndxcollist,' FROM ',
ด้วยCONCAT('SELECT * FROM ',
สิ่งนี้จะเติมหน้าข้อมูลเพิ่มเติมลงใน InnoDB Buffer Pool
หมายเหตุสุดท้าย: ตรวจสอบให้แน่ใจว่า InnoDB Buffer Pool นั้นใหญ่พอที่จะเก็บข้อมูล InnoDB ทั้งหมดของคุณ