Lebih baik membuat tabel untuk setiap akun pengguna, atau satu tabel besar untuk semua data pengguna di MYSQL

8

Saya membuat direktori web yang akan memungkinkan pengguna individu untuk mendaftar akun dan pada dasarnya menyimpan dokumen teks dalam entri basis data mysql.

Awalnya mungkin hanya akan ada beberapa ratus pengguna, tetapi kami berharap memiliki 10.000 hingga 100.000 di beberapa titik. Dan setiap pengguna akan dapat mengunggah 100-200 "dokumen".

Apakah akan lebih efisien untuk membuat satu tabel besar, diindeks oleh nomor pengguna? Yang secara teoritis bisa tumbuh menjadi 20.000.000 entri. Atau untuk terus maju dan membuat tabel untuk setiap pengguna dengan dokumen masing-masing?

Saya berasumsi tidak sehat memiliki ribuan tabel dalam database, tetapi saya benar-benar tidak dapat menemukan data konkret mengenai hal ini.

Keith
sumber

Jawaban:

7

MySQL dapat dengan mudah mengatasi 20M baris jika diindeks dengan benar. Kami memiliki tabel dengan lebih dari satu miliar baris di dalamnya.

Memiliki satu meja lebih bersih. Tidak perlu melakukan sihir dalam aplikasi berdasarkan pengguna (nama). Lebih mudah membuat statistik apa pun di tabel dokumen juga.

Saya pasti akan pergi dengan pendekatan satu meja besar. Jika Anda khawatir tentang ukuran tabel (fisik), Anda harus mempertimbangkan mempartisi tabel dokumen. http://dev.mysql.com/doc/refman/5.5/en/partitioning-types.html

Károly Nagy
sumber
Terima kasih balasannya. Saya pasti akan menggunakan satu tabel saja, dan saya akan meneliti pendekatan partisi. Namun satu pertanyaan, apa sebenarnya yang dimaksud dengan tabel yang diindeks dengan benar? Saya mendengar ini banyak direferensikan, dan menganggap itu berarti bahwa tabel database memerlukan kunci indeks yang ditetapkan dengan benar. Tetapi apakah ada lebih dari itu untuk optimasi terbaik.
Keith
Dengan diindeks dengan benar saya maksudkan memiliki setidaknya indeks komposit pada user_id dengan kolom yang Anda filter untuk atau memesan pada pada tabel dokumen dan indeks pada nama pengguna pada tabel pengguna (mungkin indeks parsial cukup memeriksa kardinalitas 90-95 % cukup). Misalnya: sqlfiddle.com/#!2/9fb15/2 (Dalam kasus saya dengan indeks parsial 5 pada kardinalitas nama pengguna adalah 50%)
Károly Nagy
Saya rasa saya mengerti, terima kasih atas bantuannya. Satu pertanyaan lagi, dengan asumsi Anda memiliki kunci indeks utama untuk setiap tabel, apakah masih membantu optimasi untuk menentukan kolom tambahan yang Anda tahu akan Anda cari secara teratur (seperti kategori induk) sebagai indeks? Apakah ada kerugian untuk mendefinisikan kunci utama atau unik dan indeks 2-4 untuk setiap tabel?
Keith
Indeks akan membantu, ya. Sebenarnya Anda harus selalu memiliki indeks pada kolom yang Anda filter jika tidak query akan berakhir dalam pencarian pemindaian penuh. Satu-satunya downside (selain dari ukuran indeks) adalah memasukkan dan pembaruan lebih lambat karena sejak 5.1 dengan plugin InnoDB dan 5.5 secara default MySQL memiliki pembuatan indeks cepat ( dev.mysql.com/doc/refman/5.5/en/… ) sehingga tidak masalah besar lagi.
Károly Nagy