Saya sedang mengembangkan aplikasi web bervolume tinggi, di mana bagiannya adalah database MySQL dari postingan diskusi yang perlu bertambah hingga 20 juta baris, dengan lancar.
Saya awalnya berencana menggunakan MyISAM untuk tabel (untuk kemampuan pencarian teks lengkap built-in ), tetapi pemikiran bahwa seluruh tabel dikunci karena satu operasi tulis membuat saya menutup. Kunci tingkat baris jauh lebih masuk akal (belum lagi keunggulan kecepatan InnoDB lainnya saat menangani tabel besar). Jadi, untuk alasan ini, saya cukup bertekad untuk menggunakan InnoDB.
Masalahnya adalah ... InnoDB tidak memiliki kemampuan pencarian teks lengkap bawaan.
Haruskah saya menggunakan sistem pencarian pihak ketiga? Seperti Lucene (c ++) / Sphinx ? Apakah ada di antara ninja database Anda yang memiliki saran / panduan?Zoie LinkedIn (berdasarkan Lucene) sepertinya merupakan pilihan terbaik saat ini... telah dibangun dengan kemampuan waktu nyata (yang sangat penting untuk aplikasi saya.) Saya agak ragu untuk berkomitmen namun tanpa wawasan ...
(FYI: akan menggunakan EC2 dengan rig memori tinggi, menggunakan PHP untuk melayani frontend)
Jawaban:
Saya dapat menjamin MyISAM fulltext menjadi pilihan yang buruk - bahkan mengesampingkan berbagai masalah dengan tabel MyISAM secara umum, saya telah melihat hal-hal fulltext keluar dari rel dan mulai merusak dirinya sendiri dan menabrak MySQL secara teratur.
Mesin pencari khusus pasti akan menjadi pilihan paling fleksibel di sini - simpan data posting di MySQL / innodb, dan kemudian ekspor teks ke mesin pencari Anda. Anda dapat menyiapkan pembuatan / publikasi indeks penuh berkala dengan cukup mudah, dan menambahkan pembaruan indeks waktu nyata jika Anda merasa perlu dan ingin menghabiskan waktu.
Lucene dan Sphinx adalah pilihan yang bagus, seperti Xapian , yang bagus dan ringan. Jika Anda mengikuti jalur Lucene, jangan berasumsi bahwa Clucene akan lebih baik, bahkan jika Anda memilih untuk tidak bergulat dengan Java, meskipun saya tidak benar-benar memenuhi syarat untuk membahas pro dan kontra keduanya.
sumber
Seiring dengan penghentian umum MyISAM, pencarian teks lengkap (FTS) InnoDB akhirnya tersedia di rilis MySQL 5.6.4.
Banyak detail menarik di https://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.html .
Sementara mesin lain memiliki banyak fitur berbeda, yang ini adalah InnoDB, jadi ini asli (yang berarti ada jalur peningkatan), dan itu menjadikannya opsi yang berharga.
sumber
Anda harus menghabiskan waktu satu jam dan menjalani instalasi dan test-drive Sphinx dan Lucene. Lihat apakah memenuhi kebutuhan Anda, sehubungan dengan pembaruan data.
Salah satu hal yang mengecewakan saya tentang Sphinx adalah bahwa Sphinx tidak mendukung penyisipan tambahan dengan sangat baik. Artinya, sangat mahal untuk mengindeks ulang setelah penyisipan, sangat mahal sehingga solusi yang mereka rekomendasikan adalah membagi data Anda menjadi baris yang lebih lama, tidak berubah dan baris yang lebih baru dan mudah menguap. Jadi, setiap penelusuran yang dilakukan aplikasi Anda harus menelusuri dua kali: sekali di indeks yang lebih besar untuk baris lama dan juga di indeks yang lebih kecil untuk baris terbaru. Jika itu tidak terintegrasi dengan pola penggunaan Anda, Sphinx ini bukanlah solusi yang baik (setidaknya tidak dalam implementasi saat ini).
Saya ingin menunjukkan kemungkinan solusi lain yang dapat Anda pertimbangkan: Google Penelusuran Khusus . Jika Anda dapat menerapkan beberapa SEO ke aplikasi web Anda, maka lakukan outsourcing fungsi pengindeksan dan pencarian ke Google, dan sematkan kolom teks pencarian Google ke situs Anda. Ini bisa menjadi cara paling ekonomis dan terukur untuk membuat situs Anda dapat ditelusuri.
sumber
Mungkin Anda tidak boleh mengabaikan FT MySQL begitu cepat. Craigslist dulu menggunakannya .
edit
Seperti yang dikomentari di bawah ini, Craigslist tampaknya telah beralih ke Sphinx di awal tahun 2009.
sumber
Sphinx, seperti yang Anda tunjukkan, cukup bagus untuk benda ini. Semua pekerjaan ada di file konfigurasi. Pastikan apa pun tabel Anda dengan string memiliki beberapa kunci id integer unik, dan Anda akan baik-baik saja.
sumber
coba ini
sumber
Anda harus melihat Sphinx. Layak dicoba. Pengindeksannya super cepat dan didistribusikan. Anda harus melihat webminar ini (http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown). Ini berbicara tentang pencarian dan memiliki beberapa tolok ukur yang rapi. Anda mungkin merasa terbantu.
sumber
Jika semuanya gagal, selalu ada soundex_match , yang sayangnya tidak terlalu cepat dan akurat
sumber
Bagi siapa pun yang terjebak pada versi lama MySQL / MariaDB (yaitu pengguna CentOS) di mana InnoDB tidak mendukung pencarian Fulltext, solusi saya saat menggunakan tabel InnoDB adalah membuat tabel MyISAM terpisah untuk hal yang ingin saya cari.
Misalnya, tabel InnoDB utama saya adalah
products
dengan berbagai kunci dan integritas referensial. Saya kemudian membuat tabel MyISAM sederhana yang disebutproduct_search
berisi dua bidang,product_id
dan diproduct_name
mana yang terakhir ditetapkan keFULLTEXT
indeks. Kedua bidang secara efektif merupakan salinan dari apa yang ada diproduct
tabel utama .Saya kemudian mencari di tabel MyISAM menggunakan fulltext, dan melakukan inner join kembali ke tabel InnoDB.
Isi tabel MyISAM dapat terus diperbarui melalui pemicu atau model aplikasi.
Saya tidak akan merekomendasikan ini jika Anda memiliki beberapa tabel yang memerlukan teks lengkap, tetapi untuk satu tabel sepertinya cukup berhasil sampai Anda dapat memutakhirkan.
sumber