2016-05-22 65 views
5

Ürün bilgileri içeren büyük bir tablomuz var. Neredeyse her zaman belirli kelimeleri içeren ürün isimlerini bulmamız gerekiyor, ama maalesef bu sorgular sonsuza dek sürüyor.SQL LIKE sorgu performansının iyileştirilmesi

Örnek: Adın "çelik" ve "102" sözcüklerini içerdiği tüm ürünleri bulun (mutlaka birbirinin yanında değil), "Ninja çelik demir 102 x" gibi bir ürün, tıpkı "Dragon" gibi bir eşleşme çelik 102 b "öyle".

SELECT columns FROM products WHERE name LIKE '%WORD1%' AND name LIKE '%WORD2%' (gibi kelimelerin sayısı normalde 2-4, ama teoride 7-8 veya daha fazla olabilir):

Şu anda böyle bunu yapıyor.

Bunu yapmanın daha hızlı bir yolu var mı?

Sadece kelimelerle eşleşiyor, bu yüzden bir şekilde yardımcı olabileceğini merak ediyorum (örneğin yukarıdaki örnekte bulunan ürünler eşleşir, ancak "Samurai swordsteel 102 v", "çelik" tek başına kalmadığından beri eşleşme değildir) .

Kendi düşüncem, ürün adlarındaki kelimelerle bir yardımcı tablo oluşturmak ve sonra eşleşen tabloların kimliklerini almak için bu tabloyu kullanmaktır.

yani bir tablo gibi: [kimlik, kelime, productid] yüzden örneğin olsun:

1, samurai, 3 
2, swordsteel, 3 
3, 102, 3 
4, v, 3 

Sadece MySQL bunu yapmanın yolu inşa orada olup olmadığını merak, bu yüzden yok kendi malzememi uygulamak + iki tabloyu korumak.

Teşekkürler!

cevap

1

Maalesef, desen adının başında joker karakterler var. Bu nedenle, MySQL bunun için standart bir dizin kullanamaz.

İki seçeneğiniz var. İlk olarak, eğer kelimeler gerçekten anahtar kelimeler/özniteliklerse, kelime başına bir satırda başka bir tablonuz olmalıdır.

Eğer durum böyle değilse, tam metin dizini deneyebilirsiniz. MySQL'in minimum kelime uzunluğu için özniteliklere sahip olduğunu ve bir durma listesi listesi kullandığını unutmayın. İndeksi oluşturmadan önce bunları dikkate almalısınız.

+0

Teşekkürler. Zaten tam bir metin dizinine sahibiz, ancak çalışmaya devam etmek veya sorgulamak için 5-10 saniye veya daha uzun sürüyor. – Louisa

+0

@Louisa Tam metin dizini kullanmak için LIKE yerine MATCH kullanıyor musunuz? –

+0

İyi bir ipucu, ancak MATCH, SELECT * yaptığımda birçok satıra geri döner. NEREDEN ALINIRSA (NAME) ('+ word1 + word2 + word3' ') - 3 kelimeyle sonuç alırım, ancak sonuçları da sadece 1 Isimde bulunan kelimelerin 2'si. – Louisa