Tembolok basis data MySQL di memori

11

Saya mengalami masalah dengan situs web dengan 600MB database MySQL. Situs web terlalu lambat. Saya perhatikan semakin besar database MySQL, semakin lambat. Ketika 5MB, situs web sangat cepat. Ketika mulai menjadi lebih besar, ia mulai semakin lambat dan semakin lambat dan sekarang, pada 600MB, sangat lambat, membutuhkan waktu 10 detik untuk memuat halaman.

Saya memeriksa proses teratas dan tidak ada hubungannya dengan beban tinggi atau apa pun. Ini bahkan tidak terkait dengan IOPS karena saya menguji pada drive HDD 7.2k rpm dan itu memberikan masalah yang sama sekarang dengan pengujian dengan drive Intel 320 SSD, jadi saya tidak berpikir tentang pertanyaan yang tinggi juga.

Situs web ini menggunakan Wordpress dan ada 9 plugin aktif. Orang-orang mengatakan itu mungkin plugin ... yah mungkin ... tapi saat ini saya hanya ingin men-cache seluruh database dalam memori dan ingin mendapatkan bantuan dan arahan untuk memulai dan bagaimana melakukannya.

Saya memiliki 16GB RAM dan i5-2400 4 core @ 3.1 GHz. OS adalah 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
berikan penjahit
sumber

Jawaban:

10

Jika saya jadi Anda, saya akan mengalihkan semua data ke InnoDB. Penguncian meja / penguncian baris telah lama dibahas oleh banyak orang. Saya akan selalu memilih InnoDB tangan ke bawah. Namun, ada alasan mendalam lainnya untuk memilih InnoDB ... CACHING .

Sementara kebanyakan orang menyombongkan bahwa MyISAM lebih cepat untuk dibaca, kebanyakan orang lupa bahwa banyak cache untuk MyISAM, yang disebut cache kunci (ditetapkan oleh key_buffer_size), hanya cache halaman indeks dari file .MYI. Itu tidak pernah cache halaman data. Ini memiliki maksimum resmi 4GB dalam Sistem 32-bit. 8GB maksimum terbaik untuk 64-bit.

Pool Buffer InnoDB menyimpan data dan halaman indeks. Bergantung pada server yang Anda miliki, Anda dapat menyimpan cache hingga seluruh dataset dalam RAM. Anda dapat menyetel InnoDB hingga 80% RAM dan 10% untuk DB Conenctions, dan biarkan 10% untuk OS. Ini berlaku bahkan untuk sistem operasi yang berbeda .

Saya telah merekomendasikan hal-hal ini untuk pelanggan Drupal dengan kesuksesan luar biasa. Ini berlaku untuk Wordpress juga. Saya telah memberikan dukungan DB untuk klien dengan WordPress. Perbaikan yang sama.

Anda selalu dapat mengonfigurasi memori untuk InnoDB lebih efektif sehingga Anda dapat lebih banyak MyISAM. Selalu ada cara untuk mengubah InnoDB agar sesuai dengan kebutuhan kinerja Anda . Saat data Anda tumbuh, pada akhirnya akan menjadi persyaratan .

UPDATE 2011-11-21 11:44 EST

Jika dataset lengkap Anda cukup kecil, Anda bisa menjalankan kueri SELECT pada setiap tabel yang Anda miliki tepat setelah mysql dimulai.

Untuk semua tabel yang merupakan InnoDB dan / atau MyISAM, jalankan kueri ini:

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
;

Ini akan menampilkan setiap permintaan SELECT yang mungkin Anda perlukan untuk menjalankan yang akan memanggil semua indeks yang akan direferensikan. Tempatkan kueri ini dalam file bernama /root/MakeSelectQueriesToLoad.sql. Jalankan skrip dan kumpulkan output /root/SelectQueriesToLoad.sql. Akhirnya, jalankan:

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

Ini pasti akan memuat semua halaman indeks ke dalam Pool Buffer InnoDB dan Cache Kunci MyISAM. Jika semua data Anda adalah InnoDB, buat dua perubahan:

  • ganti WHERE engine IN ('InnoDB','MyISAM')denganWHERE engine='InnoDB'
  • ganti CONCAT('SELECT ',ndxcollist,' FROM ',denganCONCAT('SELECT * FROM ',

Ini juga akan mengisi lebih banyak halaman data ke dalam Pool Buffer InnoDB.

CATATAN FINAL: Pastikan Pool Buffer InnoDB cukup besar untuk menampung semua Data InnoDB Anda

RolandoMySQLDBA
sumber
2

Anda sudah melakukan caching seluruh basis data dalam memori. Masalahnya hampir pasti waktu yang dibutuhkan untuk mencari database, bahkan dalam RAM.

Tonton statistik I / O disk Anda. Anda mungkin akan melihat bahwa hanya ada sedikit acak I / O disk. Basis data ada dalam memori. Bukan itu masalahnya. Anda harus menginstal iostatterlebih dahulu. Anda tidak menyebutkan platform atau distribusi Anda, tetapi mungkin dalam paket yang disebut iostat. Anda mungkin menemukan atoplebih ramah.

Apakah orang-orang yang memberi tahu Anda yang melakukannya setelah mendapatkan bukti bahwa seluruh database Anda belum ada di memori atau bahwa I / O disk adalah masalahnya? Jika tidak, saran mereka setara dengan dokter yang belum pernah melihat atau memeriksa Anda tetapi hanya mendengar bahwa lengan Anda sakit meminta Anda mengenakan gips.

Paul White 9
sumber
-1

Instal plugin caching yang bagus untuk Wordpress, ini mungkin bisa membantu. Tetapi cepat atau lambat Anda harus mencari tahu kemacetan yang memperlambat sistem Anda.

fzsa
sumber