2009-12-24 6 views
5

Was mit falsch:Mysql Spiel ... gegen vs. einfache wie „% Begriff%“

$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] .'%"'); 

und dann die DB-Abfrage, die Ergebnisse in einer bestimmten Reihenfolge abzurufen, anstatt die MyISAM-only sql match ... gegen?

Würde es die Leistung dramatisch beeinträchtigen?

+0

BTW Ich weiß, dass dieses Thema wurde total geärgert und missbraucht. – Gal

Antwort

6

Der Unterschied liegt im Algorithmus, dass MySQL hinter den Kulissen Ihre Daten findet. Bei Volltextsuchen können Sie auch nach Relevanz sortieren. Die LIKE Suche in den meisten Bedingungen wird einen vollständigen Tabellenscan durchführen, sodass abhängig von der Datenmenge Leistungsprobleme auftreten können. Die Volltext-Engine kann auch Leistungsprobleme beim Umgang mit großen Zeilensätzen haben.

Zu einer anderen Anmerkung, eine Sache, die ich diesem Code hinzufügen würde, ist etwas, um den explodierten Werten zu entgehen.

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

Slides sind auch hier:

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

In meinem Test, mit vielleicht ein Aufruf an mysql_real_escape_string()

+0

also jede Idee, die Leistung mehr behindern würde? und ja natürlich hast du Recht, eine mysql_real_escape_string() wäre dort gut platziert. – Gal

+0

In meiner persönlichen Erfahrung neigen Suchanfragen dazu, leistungsintensiver zu sein. Dies trifft am meisten zu, wenn Wildcards verwendet werden, die es mysql nicht erlauben, die Abfrage zu einem Index für das Feld zu optimieren. –

6

Sie können meine letzte Präsentation, die ich für MySQL Universität tat überprüfen LIKE '%pattern%' war mehr als 300x langsamer als mit einem MySQL FULLTEXT Index. Meine Testdaten waren 1,5 Millionen Posts aus dem Oktober-Datenabzug von StackOverflow.

+0

Ich fürchte, dass Ihre Vergleichsmethode ein bisschen falsch war. LIKE ist langsamer, wenn Sie in großen Tabellen suchen, aber es beeinflusst nicht die Geschwindigkeit der Dateneinfügung in die Datenbank. Übereinstimmungen weisen bei der Suche eine bessere Leistung auf, beeinträchtigen jedoch die Geschwindigkeit der Einfügung, da für jedes INSERT- oder UPDATE-Objekt eine Neuindexierung erforderlich ist. Es liegt also am Entwickler, welche Operation eine höhere Priorität hat. –

+0

Ich habe die Leistung der Indexierung eines vorhandenen Datasets verglichen, aber Sie haben recht, ich habe die Leistung beim Einfügen weiterer Daten nicht getestet. Ich glaube nicht, dass die Volltextindizierung von MySQL das gesamte Dataset beim Einfügen neu indizieren muss - soweit ich weiß, muss nur Sphinx das tun. –

+0

Soweit ich weiß, werden MySQL Volltextindizes automatisch nach jedem Einfüge- oder Aktualisierungsvorgang neu indiziert. Wenn ich falsch liege, könnten Sie mir einen Grund nennen, warum in einigen Fällen Volltextindizes das Einfügen zweimal langsamer machen? Btw, eine neue Version von Sphinx unterstützt Echtzeit-Indexierung, aber in den meisten Fällen sind diese Art von Indizes weniger effizient. –