Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Dari perspektif kinerja, seberapa efisien menggunakan tabel sementara MySQL untuk fitur situs web yang sangat sering digunakan?

Apa yang Anda nyatakan sepenuhnya benar, tabel sementara hanya akan terlihat oleh pengguna/koneksi saat ini. Namun, ada beberapa overhead dan beberapa masalah lain seperti:

  • Untuk setiap dari ribuan penelusuran, Anda akan membuat dan mengisi tabel tersebut (dan menghapusnya nanti) - bukan per pengguna, per penelusuran. Karena setiap pencarian kemungkinan besar akan mengeksekusi ulang skrip, dan "per sesi" tidak berarti sesi PHP - itu berarti sesi database (koneksi terbuka).
  • Anda memerlukan CREATE TEMPORARY TABLES hak istimewa, yang mungkin tidak punya.
  • Tetap saja, tabel itu seharusnya memiliki tipe MEMORY, yang mencuri RAM Anda lebih dari yang terlihat. Karena meskipun memiliki VARCHAR, tabel MEMORY menggunakan penyimpanan baris dengan panjang tetap.
  • Jika nanti heuristik Anda perlu merujuk ke tabel itu dua kali (seperti SELECT xyz FROM patternmatch AS pm1, patternmatch AS pm2 ... ) - ini tidak mungkin dilakukan dengan tabel MEMORY.

Selanjutnya, akan lebih mudah bagi Anda - dan juga untuk database - untuk menambahkan LIKE '%xyz%' langsung ke images tabel WHERE ayat. Ini akan melakukan hal yang sama tanpa biaya tambahan untuk membuat TEMP TABLE dan menggabungkannya.

Bagaimanapun - ke mana pun Anda pergi - WHERE itu akan sangat lambat. Bahkan jika Anda menambahkan indeks pada images.name kemungkinan besar Anda akan membutuhkan LIKE '%xyz%' bukannya LIKE 'xyz%' , sehingga indeks tidak akan digunakan.

Tidak. :)

Opsi alternatif

MySQL memiliki Pencarian Teks Lengkap (sejak 5.6 juga untuk InnoDB) yang bahkan dapat memberi Anda skor itu:Saya sangat merekomendasikan untuk membaca dan mencobanya. Anda dapat yakin bahwa database mengetahui lebih baik daripada Anda bagaimana melakukan pencarian itu secara efisien.

Jika Anda akan menggunakan MyISAM daripada InnoDB, perhatikan batasan yang sering diabaikan bahwa pencarian FULLTEXT hanya mengembalikan apa pun jika jumlah hasil kurang dari 50% dari total baris tabel.

Hal lain yang mungkin ingin Anda lihat, misalnya Solr (Pengantar yang bagus membaca topik itu sendiri akan menjadi awal dari http://en.wikipedia.org/wiki/Apache_Solr ). Kami menggunakannya di perusahaan kami dan melakukan pekerjaan dengan baik, tetapi membutuhkan beberapa pembelajaran.

Ringkasan

Solusi untuk masalah Anda saat ini (pencarian) adalah dengan menggunakan kemampuan FULLTEXT.

Untuk memberi Anda nomor, 10.000 panggilan per detik bukanlah "sepele" - dengan ratusan ribu pencarian per detik, jenis masalah kinerja yang akan Anda temui ada di mana-mana dalam pengaturan Anda. Anda akan membutuhkan beberapa server, load balancing dan banyak omong kosong teknologi luar biasa lainnya. Dan salah satunya adalah misalnya Solr;)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Praktik Terbaik Replikasi MySQL

  2. Permintaan SPARQL untuk mendapatkan semua induk dari sebuah simpul

  3. Sistem hierarki yang lebih efisien

  4. Apa yang Harus Diperiksa jika Pemanfaatan Memori MySQL Tinggi?

  5. nodeJS mengembalikan nilai dari panggilan balik