Jika Anda harus menggunakan gaya regexp WHERE
klausa, Anda pasti akan terganggu oleh masalah kueri lambat. Agar pencarian bergaya regexp berfungsi, MySQL harus membandingkan setiap nilai di kolom nama Anda dengan regexp. Dan, kueri Anda telah menggandakan masalah dengan juga melihat kolom nama pengguna Anda.
Ini berarti MySQL tidak dapat memanfaatkan indeks apa pun, yang merupakan cara semua DBMS mempercepat kueri tabel besar.
Ada beberapa hal yang bisa Anda coba. Semuanya melibatkan ucapan selamat tinggal pada REGEXP.
Salah satunya adalah ini:
WHERE name LIKE CONCAT('jack', '%') OR username LIKE CONCAT('jack', '%')
Jika Anda membuat indeks pada kolom nama dan nama pengguna Anda, ini seharusnya cukup cepat. Ini akan mencari semua nama/nama pengguna yang dimulai dengan 'jack'. PERHATIKAN bahwa
WHERE name LIKE CONCAT('%','jack') /* SLOW!!! */
akan mencari nama yang diakhiri dengan 'jack' tetapi akan lambat seperti pencarian gaya regexp Anda.
Hal lain yang dapat Anda lakukan adalah mencari tahu mengapa aplikasi Anda harus dapat mencari bagian dari nama atau nama pengguna. Anda dapat menghilangkan fitur ini dari aplikasi Anda, atau mencari cara yang lebih baik untuk menanganinya.
Kemungkinan cara yang lebih baik:
- Minta pengguna Anda untuk membagi nama mereka ke dalam bidang nama yang diberikan dan nama belakang, dan telusuri secara terpisah.
- Buat fitur "telusuri semua pengguna" terpisah yang hanya digunakan saat pengguna membutuhkannya, sehingga mengurangi frekuensi kueri bergaya regexp lambat Anda.
- Pisahkan nama-nama mereka ke dalam tabel nama-kata yang terpisah menggunakan semacam program pra-pemrosesan. Cari tabel nama-kata tanpa regexp.
- Cari tahu cara menggunakan pencarian teks lengkap MySQL untuk fitur ini.
Semua ini melibatkan beberapa pekerjaan pemrograman.