Misalkan saya memiliki tabel pengguna di situs saya di mana ada sekitar 2-3 Juta pengguna (catatan) di dalam tabel.
Untuk mempercepat proses login saya, apakah ini pendekatan yang baik untuk membagi tabel pengguna saya, satu untuk informasi mereka dan satu lagi untuk login mereka.
Jika kami dapat menjalankan kueri yang mirip dengan yang di bawah ini dari satu tabel:
select username,password from users where username=`test` AND password=****
Apakah perlu membaginya, dan apakah ini mempercepat proses login situs saya?
Jawaban:
IMHO Anda tidak perlu membaginya secara fisik. Namun, akan lebih baik untuk menyimpannya.
Jika
users
tabel menggunakan Mesin Penyimpanan MyISAM, Anda memiliki keuntungan yang bagus.Karena MyISAM hanya menyimpan indeks, Anda dapat melakukan dua hal
users
tabel sajaPastikan indeks berikut ada untuk
users
Ada dua (2) alasan utama untuk kedua indeks
ALASAN untuk indeks # 1
Indeks
username_ndx
mencegah nama pengguna memiliki banyak kata sandi, serta mencegah banyak pengguna dengan nama yang samaALASAN untuk indeks # 2
Indeks
username_password_ndx
menyediakan indeks penutup . Dengan demikian, kueri Anda akan mencari nama pengguna dan kata sandi di cache MyISAM khusus, alih-alih memeriksa tabel.Lebih Banyak Tautan tentang Prinsip-prinsip Indeks Penutupan
Hal berikutnya adalah benar-benar membuat cache kunci khusus itu. Berikut adalah perintah untuk membuat cache kunci 8MB dan memuat cache kunci khusus itu (Contoh: Jika tabelnya adalah
mydb.users
):Anda harus meletakkan ketiga baris ini di file /var/lib/mysql/startup.sql
Tambahkan ini ke /etc/my.cnf
Ini akan memuat cache setiap kali mysql dimulai
Cobalah !!!
UPDATE 2011-12-30 17:25 EDT
Jika Anda ingin mendapatkan ukuran yang tepat untuk mengatur cache, gunakan kueri berikut:
UPDATE 2011-12-30 23:21 EDT
Berikut adalah metode berdasarkan InnoDB
Anda masih membutuhkan indeks
Anda harus memastikan Pool Buffer InnoDB memiliki nama pengguna dan kata sandi yang tersedia. Anda mungkin harus melakukan pemindaian indeks lengkap saat startup mysql:
Langkah 1) Buat ReadUserPass.sql
Langkah 2) Tambahkan skrip itu ke /etc/my.cnf
Langkah 3) Lakukan salah satu dari yang berikut ini
$ service mysql restart
mysql> source /var/lib/mysql/ReadUserPass.sql
Karena kedua kolom ini (nama pengguna dan kata sandi) berada di
username_password_ndx
, semua halaman indeks yang menyusun indeks ini dimuat ulang ke dalam Pool Buffer InnoDB. Ini diperlukan karena ada kemungkinan halaman indeks sedang dihapus. Untuk meminimalkan hal itu, tambah Ukuran Buffer Pool dan mulai ulang mysql (satu kali).sumber
users
tabel terlibat dalam transaksi, maka saya perlu mengirimkan jawaban lain hanya berdasarkan InnoDB.Sebuah tabel yang terdiri dari beberapa juta baris tidak perlu dipisah. Penyesuaian kinerja harus dilakukan melalui indeks. MySpace memiliki ratusan juta akun yang terdaftar dalam satu tabel dan kinerja di atas meja itu baik-baik saja. (Saya adalah seorang DBA untuk MySpace pada puncak penggunaannya.) Tabel dalam kasus itu mungkin 80-90 byte lebar (mungkin sedikit lebih).
sumber
Apakah Anda benar-benar memiliki 2 juta pengguna? Kecuali Anda sudah memiliki masalah ini atau yakin bahwa Anda akan melakukannya, Anda mengoptimalkan cara sebelumnya. Tambahkan indeks gabungan pada bidang login dan kata sandi dan selesai dengan itu. Jangan mengoptimalkan kecuali Anda tahu Anda benar-benar memiliki masalah untuk dipecahkan. Saya yakin Anda memiliki masalah yang lebih besar untuk dipecahkan.
sumber
Jika Anda menggunakan Mysql 5.1 dan lebih tinggi, Anda dapat mencoba mempartisi tabel Anda.
Pada pertanyaan Anda apakah mempercepat proses login, itu tergantung pada bagaimana sisa prosedur login (misalnya, jika permintaan Anda sekarang membutuhkan 0,05 detik, dan sisa kode membutuhkan 20 detik, saya lebih suka mengulang pikirkan seluruh rutinitas ...).
Juga, terlepas dari menggunakan partisi, jangan lupa untuk menambahkan indeks seperti yang ditunjukkan RolandoMySQLDBA .
sumber