Bellekte MySQL veritabanını önbelleğe al


11

600MB MySQL veritabanına sahip bir web sitesinde sorun yaşıyorum. Web sitesi çok yavaş. MySQL veritabanı büyüdükçe yavaşlar. 5 MB olduğunda, web sitesi çok hızlıydı. Büyüdükçe yavaşlamaya ve yavaşlamaya başladı ve şimdi 600 MB ile sayfaların yüklenmesi 10 saniye gibi çok yavaş.

Üst işlemleri kontrol ettim ve yüksek yük veya herhangi bir şeyle ilgili bir şey değil. HDD 7.2k rpm sürücülerde test ettiğim gibi IOPS ile bile ilgili değil ve şimdi Intel 320 SSD sürücülerle test ederken de aynı sorunu verdi, bu yüzden yüksek sorgularla da ilgili olduğunu düşünmüyorum.

Web sitesi Wordpress kullanıyor ve aktif gibi 9 eklenti var. İnsanlar bunun eklentiler olabileceğini söyledi ... belki de ... ama şu anda sadece tüm veritabanını önbelleğe almak istiyorum ve nereden başlayacağınız ve nasıl yapılacağı konusunda yardım ve yön almak istiyorum.

16 GB RAM ve 3.1 GHz'de i5-2400 4 çekirdeğim var. İşletim Sistemi 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

Yanıtlar:


10

Siz olsaydım, tüm verileri InnoDB'ye geçirirdim. Masa kilitleme / sıra kilitleme uzun zamandır birçok kişi tarafından tartışılmıştır. Her zaman InnoDB eller aşağı seçin. Ancak, InnoDB ... CACHING'i seçmenin başka bir derin nedeni daha var .

Çoğu kişi MyISAM'ın okumalar için daha hızlı olduğunu söylese de, çoğu kişi MyISAM için anahtar önbellek (key_buffer_size tarafından ayarlanır) adı verilen birçok önbelleğin yalnızca .MYI dosyalarından dizin sayfalarını önbelleğe aldığını unutur. Veri sayfalarını asla önbelleğe almaz. 32-bit sistemlerde resmi maksimum 4GB'a sahiptir. 8GB, 64 bit için en iyi maksimum değerdir.

InnoDB Arabellek Havuzu veri ve dizin sayfalarını önbelleğe alır. Sahip olduğunuz sunucuya bağlı olarak, RAM'deki tüm veri kümesini önbelleğe alabilirsiniz. InnoDB'yi DB Bağlantıları için% 80 ve% 10'a kadar ayarlayabilir ve işletim sistemi için% 10 bırakabilirsiniz. Bu, farklı işletim sistemleri için bile geçerlidir .

Bunları harika bir başarı ile Drupal müşterileri için tavsiye ettim . Wordpress için de geçerlidir . WordPress kullanan istemciler için DB desteği sağladım. Aynı gelişmeler.

InnoDB için belleği her zaman daha fazla MyISAM yapabileceğinizden daha etkili bir şekilde yapılandırabilirsiniz . InnoDB'yi performans gereksinimlerinize uygun hale getirmenin her zaman bir yolu vardır . Verileriniz büyüdükçe, sonunda bir gereklilik haline gelecektir .

GÜNCELLEME 2011-11-21 11:44 EST

Tam veri kümeniz yeterince küçükse, mysql başladıktan hemen sonra sahip olduğunuz her tabloda bir SELECT sorgusu yürütebilirsiniz.

InnoDB ve / veya MyISAM olan tüm tablolar için şu sorguyu çalıştırın:

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
;

Bu, çalıştırılması gereken tüm olası SELECT sorgusunun çıktısını alır ve başvurulan tüm dizinleri toplar. Bu sorguyu /root/MakeSelectQueriesToLoad.sql adlı bir dosyaya yerleştirin. Komut dosyasını çalıştırın ve /root/SelectQueriesToLoad.sql çıktısını toplayın. Son olarak, çalıştırın:

mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql

Bu kesinlikle tüm dizin sayfalarını InnoDB Arabellek Havuzu ve MyISAM Anahtar Önbelleğine önceden yükleyecektir. Tüm verileriniz InnoDB ise, iki değişiklik yapın:

  • yerine WHERE engine IN ('InnoDB','MyISAM')sahipWHERE engine='InnoDB'
  • yerine CONCAT('SELECT ',ndxcollist,' FROM ',sahipCONCAT('SELECT * FROM ',

Bu aynı zamanda daha fazla veri sayfasını InnoDB Arabellek Havuzu'na yerleştirir.

NİHAİ NOT: InnoDB Arabellek Havuzunun tüm InnoDB Verilerinizi tutacak kadar büyük olduğundan emin olun


2

Tüm veritabanını zaten bellekte önbelleğe alıyorsunuz. Sorun neredeyse kesinlikle RAM'de bile veritabanını aramak için gereken süredir.

Disk G / Ç istatistiklerinizi izleyin. Muhtemelen, ara sıra rastgele bir disk G / Ç parçası olduğunu göreceksiniz. Veritabanı olan bellekte. Sorun bu değil. Önce yüklemeniz gerekir iostat. Platformunuzdan veya dağıtımınızdan bahsetmiyorsunuz, ancak muhtemelen adlı bir pakette iostat. atopDaha arkadaşça bulabilirsiniz .

Veritabanınızın tümünün zaten bellekte olmadığını veya sorunun disk G / Ç olduğunu belirten herhangi bir kanıt aldıktan sonra bunu size söyleyen kişiler miydi? Aksi takdirde, tavsiyeleri sizi daha önce hiç görmeyen veya muayene etmeyen, ancak kolunuzun size bir alçı koymanızı söylediğini duyduğunu duymuş bir doktorun eşdeğeridir.


-1

Wordpress için iyi bir önbellek eklentisi yükleyin, yardımcı olabilir. Ancak er ya da geç, sisteminizi yavaşlatan darboğazı çözmeniz gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.