Oke, beginilah cara saya melihatnya bekerja.
Saya memiliki masalah yang sama persis dengan MongoDB. MongoDB "menawarkan" kemampuan pencarian tetapi seperti MySQL Anda tidak boleh menggunakannya kecuali jika Anda ingin tersedak dengan masalah IO, CPU dan memori dan dipaksa untuk menggunakan lebih banyak server untuk mengatasi indeks Anda daripada biasanya.
Ide keseluruhan jika menggunakan Sphinx (atau teknologi pencarian lainnya) adalah untuk menurunkan biaya per server dengan memiliki pencari indeks berkinerja.
Namun Sphinx bukanlah mesin penyimpanan. Tidak mudah untuk menanyakan hubungan yang tepat di seluruh tabel, mereka telah memperbaikinya sedikit dengan SphinxQL tetapi karena sifat dari indeks teks lengkap, itu masih tidak melakukan penggabungan integral seperti yang akan Anda dapatkan di MySQL.
Sebaliknya saya akan menyimpan hubungan dalam MySQL tetapi memiliki indeks "pengguna" dalam Sphinx.
Di situs web saya, saya pribadi memiliki 2 indeks:
- utama (menampung pengguna, video, saluran, dan daftar putar)
- bantuan (pencarian sistem bantuan)
Ini delta diperbarui sekali setiap menit. Karena indeks waktu nyata masih sedikit eksperimental pada waktu dan saya pribadi telah melihat masalah dengan tingkat penyisipan/penghapusan yang tinggi, saya terus memperbarui delta. Jadi saya akan menggunakan indeks delta untuk memperbarui objek utama yang dapat dicari di situs saya karena ini kurang intensif sumber daya dan lebih berkinerja daripada indeks waktu nyata (dari pengujian saya sendiri).
Perhatikan untuk memproses penghapusan dan apa yang bukan koleksi Sphinx Anda melalui delta, Anda akan memerlukan daftar pembunuh dan filter tertentu untuk indeks delta Anda. Berikut adalah contoh dari indeks saya:
source main_delta : main
{
sql_query_pre = SET NAMES utf8
sql_query_pre =
sql_query = \
SELECT id, deleted, _id, uid, listing, title, description, category, tags, author_name, duration, rating, views, type, adult, videos, UNIX_TIMESTAMP(date_uploaded) AS date_uploaded \
FROM documents \
WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) OR update_time >( SELECT last_index_time FROM sph_counter WHERE counter_id=1 )
sql_query_killlist = SELECT id FROM documents WHERE update_time>=( SELECT last_index_time FROM sph_counter WHERE counter_id=1 ) OR deleted = 1
}
Ini memproses penghapusan dan penambahan sekali setiap menit yang cukup realtime untuk aplikasi web nyata.
Jadi sekarang kita tahu cara menyimpan file index. Saya perlu berbicara tentang hubungan. Sphinx (meskipun memiliki SphinxQL) tidak akan melakukan penggabungan integral di seluruh data jadi saya pribadi akan merekomendasikan melakukan hubungan di luar Sphinx, tidak hanya itu tetapi seperti yang saya katakan tabel hubungan ini akan mendapatkan beban tinggi jadi ini adalah sesuatu yang dapat berdampak pada Indeks Sphinx.
Saya akan melakukan kueri untuk memilih semua id dan menggunakan kumpulan id itu menggunakan metode "filter" pada sphinx API untuk memfilter indeks utama ke id dokumen tertentu. Setelah ini selesai, Anda dapat mencari di Sphinx seperti biasa. Ini adalah metode paling efektif yang saya temukan hingga saat ini untuk menangani ini.
Hal utama yang harus diingat setiap saat adalah Sphinx adalah teknologi pencarian sedangkan MySQL adalah teknologi penyimpanan. Ingatlah hal itu dan Anda akan baik-baik saja.
Sunting
Seperti yang dikatakan @N.B (yang saya abaikan dalam jawaban saya) Sphinx memang memiliki SphinxSE. Meskipun primitif dan masih dalam tahap pengujian pengembangannya (sama seperti indeks waktu nyata), ia menyediakan penyimpanan tipe MyISAM/InnoDB yang sebenarnya ke Sphinx. Ini luar biasa. Namun ada peringatan (seperti apa pun):
- Bahasanya primitif
- Gabungannya bersifat primitif
Namun itu dapat/bisa melakukan pekerjaan yang Anda cari, jadi pastikan untuk memeriksanya.