แคชฐานข้อมูล MySQL ในหน่วยความจำ


11

ฉันมีปัญหากับเว็บไซต์ที่มีฐานข้อมูล MySQL 600MB เว็บไซต์ช้าเกินไป ฉันสังเกตว่าฐานข้อมูล MySQL ที่ใหญ่ขึ้นนั้นจะช้าลง เมื่อมันเป็น 5MB เว็บไซต์นั้นเร็วมาก เมื่อมันเริ่มมีขนาดใหญ่ขึ้นมันก็เริ่มช้าลงและช้าลงและตอนนี้ที่ 600MB มันช้าจริงๆใช้เวลาในการโหลดหน้าเว็บประมาณ 10 วินาที

ฉันตรวจสอบกระบวนการด้านบนและไม่มีอะไรเกี่ยวข้องกับโหลดสูงหรืออะไร มันไม่ได้เกี่ยวข้องกับ IOPS เมื่อฉันทำการทดสอบบนไดรฟ์ HDD 7.2k rpm และมันก็มีปัญหาแบบเดียวกันตอนนี้กับการทดสอบกับไดรฟ์ Intel 320 SSD ดังนั้นฉันไม่คิดว่ามันจะเป็นการสืบค้นที่สูง

เว็บไซต์กำลังใช้งาน Wordpress และมีปลั๊กอินที่เหมือนกัน 9 รายการ มีคนบอกว่ามันอาจเป็นปลั๊กอิน ... บางทีอาจจะ ... แต่ตอนนี้ฉันแค่ต้องการแคชฐานข้อมูลทั้งหมดในหน่วยความจำและต้องการขอความช่วยเหลือและทิศทางในการเริ่มต้นและวิธีการที่จะทำ

ฉันมี 16GB RAM และ i5-2400 4 cores ที่ 3.1 GHz ระบบปฏิบัติการคือ centos 5.7

top - 07:23:57 up 9 days, 12:15, 0 users, load average: 0.09, 0.04, 0.05
Tasks: 162 total, 1 running, 161 sleeping, 0 stopped, 0 zombie
Cpu(s): 8.2%us, 1.0%sy, 0.0%ni, 90.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16367532k total, 3641628k used, 12725904k free, 612140k buffers
Swap: 1046520k total, 0k used, 1046520k free, 1538896k cached

คำตอบ:


10

ถ้าฉันเป็นคุณฉันจะเปลี่ยนข้อมูลทั้งหมดเป็น 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 ทั้งหมดของคุณ


2

คุณแคชฐานข้อมูลทั้งหมดในหน่วยความจำแล้ว ปัญหาคือเวลาที่ใช้ในการค้นหาฐานข้อมูลแม้แต่ในแรม

ดูสถิติ I / O ดิสก์ของคุณ คุณอาจจะเห็นว่ามี I / O ของดิสก์เป็นบิตสุ่มบางครั้ง ฐานข้อมูลอยู่ในหน่วยความจำ นั่นไม่ใช่ปัญหา คุณต้องติดตั้งiostatก่อน คุณไม่พูดถึงแพลตฟอร์มหรือการกระจายของคุณ iostatแต่มันก็อาจจะอยู่ในแพคเกจที่เรียกว่า คุณอาจพบว่าatopเป็นมิตรมากขึ้น

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


-1

ติดตั้งปลั๊กอินแคชที่ดีสำหรับ Wordpress อาจช่วยได้ แต่ไม่ช้าก็เร็วคุณจะต้องทราบถึงปัญหาคอขวดที่ทำให้ระบบของคุณช้าลง

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