2009-12-24 19 views
5

gibi basit karşı: belirli bir sırayla sonuçlar almak için db sorgulamak sonraMySQL maçı ... vs "% vadeli%" nesi var

$term = $_POST['search']; 

function buildQuery($exploded,$count,$query) 
{ 
    if(count($exploded)>$count) 
    { 
     $query.= ' AND column LIKE "%'. $exploded[$count] .'%"'; 
     return buildQuery($exploded,$count+1,$query); 
    } 
    return $query; 
} 

$exploded = explode(' ',$term); 
$query = buildQuery($exploded,1, 
'SELECT * FROM table WHERE column LIKE "%'. $exploded[0] .'%"'); 

ve yerine MyISAM kullanarak sadece sql maçı ... karşı?

Performansı dramatik bir şekilde artırır mı?

+0

btw Bu konunun tamamen kötüye kullanıldığı ve kötüye kullanıldığı biliniyor. – Gal

cevap

6

Buradaki fark, MySQL'in sahnelerin arkasında kullandığı algoritmaları bulmaktır. Tam metin aramaları, alaka düzeyine göre sıralamanızı da sağlar. Çoğu koşulda LIKE araması, tam bir tablo taraması gerçekleştirecektir, bu nedenle veri miktarına bağlı olarak, performans sorunlarını görebilirsiniz. Tam metinli motor, büyük satır kümeleriyle çalışırken performans sorunlarına da sahip olabilir.

Farklı bir notta, bu koda ekleyeceğim bir şey patlatılmış değerlerden kurtulmak için bir şeydir.

http://forge.mysql.com/wiki/Practical_Full-Text_Search_in_MySQL

Slaytlar da burada: Benim testte

http://www.slideshare.net/billkarwin/practical-full-text-search-with-my-sql

kullanarak Belki mysql_real_escape_string()

+0

, bu yüzden performansı daha fazla engelleyecek herhangi bir fikrin var mı? ve tabi ki haklısınız, orada bir mysql_real_escape_string() iyi yerleştirilmiş olacaktır. – Gal

+0

Aramalarım gibi kişisel deneyimlerimde daha yoğun performans eğilimi vardır. Bu, mysql'in sorguyu bize alandaki bir endeksi optimize etmesine izin vermeyecek olan vahşi kartları kullanırken geçerlidir. –

6

bir çağrı Sen MySQL Üniversitesi için yaptığımız benim son sunumunu kontrol edebilirsiniz LIKE '%pattern%', MySQL FULLTEXT endeksinden daha 300x daha yavaştı. Test verilerim StackOverflow October veri dökümünden 1,5 milyon yayın oldu.

+0

Karşılaştırma yönteminizin biraz yanlış olmasından korkuyorum. Büyük tablolarda arama yaparken GİBİ yavaştır, ancak DB'ye veri ekleme hızını etkilemez. Eşleşmeler, arama yaparken daha iyi performansa sahiptir, ancak her INSERT veya UPDATE yeniden dizilim gerektirdiğinden, ekleme hızını ciddi şekilde etkiler. Bu yüzden hangi işlemin daha yüksek önceliğe sahip olduğu geliştiriciye kalmış. –

+0

Varolan bir veri kümesini indeksleme performansını karşılaştırdım, ancak haklısınız, daha fazla veri ekleme performansını test etmedim. MySQL'in tam metin indekslemesinin eklediğinizde tüm veri kümesini yeniden doldurması gerektiğini sanmıyorum - sadece Sfenks'in bunu yapması gerektiğini bildiğim kadarıyla. –

+0

Bildiğim kadarıyla, her bir ekleme veya güncelleme işleminden sonra MySQL tam metin dizinleri otomatik olarak yeniden dizinlenir. Eğer yanılıyorsam, bazı durumlarda fulltext dizinlerinin neden iki kat daha yavaş girdiğine dair bir neden söyleyebilir misiniz? Sfenks'in yeni bir sürümü olan Btw, gerçek zamanlı dizinlemeyi destekler, ancak çoğu durumda bu tür dizinler daha az verimlidir. –