it-swarm.asia

Tembolok basis data MySQL di memori

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 semakin besar, ia mulai semakin lambat dan semakin lambat dan sekarang, pada 600MB, itu 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 berhubungan 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 bilang itu mungkin plugin ... yah mungkin ... tapi sekarang saya hanya ingin me-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
11
grant tailor

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 membanggakan 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 meninggalkan 10% untuk OS. Ini berlaku bahkan untuk sistem operasi yang berbeda .

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

Anda selalu dapat mengonfigurasi memori untuk InnoDB lebih efektif daripada MyISAM. Selalu ada cara untuk tweek InnoDB sesuai dengan kebutuhan kinerja Anda . Ketika 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') dengan WHERE engine='InnoDB'
  • ganti CONCAT('SELECT ',ndxcollist,' FROM ', dengan CONCAT('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

10
RolandoMySQLDBA

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 is dalam memori. Bukan itu masalahnya. Anda harus menginstal iostat terlebih dahulu. Anda tidak menyebutkan platform atau distribusi Anda, tetapi mungkin dalam paket yang disebut iostat. Anda mungkin menemukan atop lebih 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.

2
David Schwartz