Apakah terlalu banyak tabel dalam database Mysql dapat memengaruhi kinerja?

10

Memiliki terlalu banyak tabel (misalnya 200) dalam satu contoh database Mysql dapat mengurangi kinerjanya?

pengguna25704
sumber

Jawaban:

8

Secara umum, semakin banyak hal yang Anda miliki akan mengurangi kinerja. Namun, 200 sepertinya jumlah yang cukup kecil. 2.000 mungkin menjadi hit kinerja nyata dan pasti 20.000. Secara umum, Anda harus menjaga jumlah tabel Anda kecil karena MySQL dapat menangani jumlah baris yang sangat besar dalam tabel.

Topher Fangio
sumber
7
Sejumlah besar tabel dapat membuat perbedaan besar jika aplikasi Anda menggunakan 'information_schema'. Tidak ada dalam 'information_schema' yang di-cache. Beberapa sistem ORM yang berbeda banyak menggunakan ini.
Zoredache
4

Jumlah tabel tidak terlalu penting:

  1. Kueri apa yang Anda jalankan - Anda kemungkinan tidak akan meminta ke-200 dalam satu permintaan
  2. Keseluruhan kueri memuat pada sistem pada suatu titik waktu tertentu

Memiliki tabel berlebih berarti ruang memori & hard drive yang dapat diperoleh kembali & digunakan untuk hal-hal lain. Perlu diingat bahwa denormalisasi tabel Anda meningkatkan risiko data buruk karena Anda menghilangkan integritas referensi.

OMG Ponies
sumber
4

Secara umum 200 tabel seharusnya tidak menjadi masalah tetapi tergantung pada sejumlah hal.

Dedicated server MySQL vs Server dibagi dengan perangkat lunak lain, 128Mb vs 128Gb dll, tabel kecil dengan beberapa catatan vs tabel dengan gumpalan dan jutaan baris.

MySQL memiliki pengaturan dan beberapa mesin yang masing-masing memengaruhi kinerja tabel dengan cara yang berbeda.

MyISAM biasanya memiliki tiga file per tabel .frm, .MYD, .MYI

INNODB dalam mode normal memiliki .frm dengan semua data disimpan di file pusat

INNODB dalam satu file per mode tabel memiliki .frm, .idb

table_open_cache adalah jumlah tabel yang dapat dibuka sekaligus (Default 64). Ini mungkin harus lebih besar dari jumlah tabel dalam skema Anda karena ini terkait dengan berapa banyak koneksi yang meminta DB. 100 koneksi bergabung dengan 3 tabel bisa berarti Anda memiliki 300 tabel di-cache plus tabel sementara. Secara umum skema yang lebih kompleks atau koneksi semakin besar angkanya.

open-files-limit Saya cenderung untuk mengatur ini ke 4x table_open_cache yang harus murah hati daripada repot-repot mencari nilai yang tepat.

Batas pegangan file sistem operasi untuk pengguna mysql juga dapat menjadi masalah (di linux defaultnya sering kali 1024, ulimit -n untuk menunjukkan batas pengguna) ini dapat menyebabkan masalah dengan sejumlah besar tabel ketika kurang dari jumlah tersebut mysql membutuhkan. Ini harus setidaknya sama dengan batas file-terbuka.

Seperti halnya basis data apa pun, ada ratusan parameter penyetelan yang dapat Anda sesuaikan untuk mengoptimalkan basis data untuk skema khusus Anda. MySQL lebih buruk untuk ini daripada kebanyakan karena Anda dapat memasukkan mesin tambahan jika Anda ingin yaitu mesin cluster NDB.

http://dev.mysql.com/doc/refman/5.1/en/table-cache.html

Semoga ini bisa membantu


sumber
2

Untuk setiap indeks tabel MySQL memiliki indeks sendiri. Indeks membutuhkan memori untuk disimpan dan digunakan, dan ada batasan global untuk indeks. Ketika ada banyak tabel, indeks tidak semuanya berada dalam RAM, jadi mereka pergi ke disk, yang mempengaruhi kinerja secara langsung. Mencoba mengangkat ini dalam my.cnf: key_buffer_size=256M: ini adalah jumlah RAM menyisihkan untuk memegang informasi indeks.

kolypto
sumber
1

Bisa kah? Tentu. Tetapi berapa banyak tergantung banyak pada aplikasi Anda dan pola aksesnya, dan jika Anda menggunakan myisam atau innodb, dan apakah innodb dalam mode file-per-tabel atau tidak, dan ukuran log innodb. Anda harus memberi kami detail lebih dari itu.

Jim Zajkowski
sumber
1

Tidak - Saya tidak berpikir jumlah tabel akan menjadi hambatan kinerja di sistem Anda. Bagaimanapun, mereka hanya file di sistem file Anda. Tidak ada yang aneh tentang memiliki ratusan tabel dalam database.

Jauh lebih mungkin adalah bahwa pertanyaan Anda tidak dioptimalkan dengan benar. Saya akan menyarankan menyalakan log-slow-queriesdan log-queries-not-using-indexes. Saat Anda mengidentifikasi kueri lambat, gunakan explainopsi untuk melihat rencana kueri untuk kueri ini untuk mengidentifikasi tempat di mana indeks hilang.

Lihat http://dev.mysql.com/doc/refman/5.0/id/slow-query-log.html untuk lebih jelasnya.

kode masuk lubang
sumber