2012-03-31 4 views
1

Ich habe eine beträchtliche Menge an Zeit damit verbracht, diesen zu verfolgen. Ich habe eine Box-Autocomplete auf meiner Website (http://www.devbridge.com/projects/autocomplete/jquery/) verwendet. Wenn Sie das Wort eingeben, wird es als GET-Variable an eine Seite zur Verarbeitung gesendet, in der es in einer mySQL-Datenbank gesucht wird. Die Seite sieht folgendermaßen aus:Autovervollständigen langsam mit großer Datenbanksuche

$get = $_GET['query']; 
$query = "SELECT title,author,id,isbn10,isbn13 FROM textbook 
     WHERE title LIKE '" . $get . "%' 
     OR author LIKE '" . $get . "%' 
     LIMIT 5 
     "; 
$result = mysql_query($query,$connection); 
$resString = ""; 
$idString = ""; 
while($data = mysql_fetch_array($result)){ 
$resString .= "'" . title($data['title']) . " by " . $data['author'] . "',"; 
$idString .= "'" . $data['id'] . "',"; 
} 
$resString = rtrim($resString, ','); 
$idString = rtrim($idString, ','); 
$code = "{\n"; 
$code .= "query:'" . $get . "',\n"; 
$code .= "suggestions:[" . $resString . "],\n"; 
$code .= "data:[" . $idString . "]\n"; 
$code .= "}"; 
echo $code; 

Dies gibt ein einfaches JSON-Dataset aus, das als Ergebnis gelesen und zurückgesendet wird. Das Problem ist, dass es wirklich langsam war. Das "LIMIT 5" half einer Tonne, es zu beschleunigen. Allerdings läuft es immer noch langsam nach dem ersten Ergebnissatz. Ich gebe vielleicht "summ" ein und es kommt mit einer schnellen Ergebnismenge zurück, aber alle Buchstaben/Wörter danach brauchen 4-6 Sekunden, um zu zeigen. Die Datenbank ist ungefähr 300K Datensätze. Beigefügt ist ein Bild von meiner Datenbankstruktur Seite:

database http://semesterkey.com/images/data.jpg

Im gerade zu versuchen, herauszufinden, wie die Dinge zu beschleunigen. Ich denke, es könnte meine Datenbankstruktur sein, könnte es sein, wie ich frage? Ich habe nur keine Ahnung. Vielen Dank im Voraus für Ihre Hilfe!

+0

@Yogesh hat Recht, Sie sollten Felder indizieren, nach denen Sie suchen. –

+0

Würden Sie einen gruppierten oder nicht gruppierten Index empfehlen? Neuling hier! – user791187

Antwort

1

Es ist einzige Lösung ist, dass die Verwendung der Indexierung auf Spalte, die Sie in der automatischen Vervollständigung in Ihrer Datenbank angezeigt werden sollen, diese Hoffnung werden Ihnen helfen,

+1

Es könnte mehr Lösungen geben, aber diese ist die erste zu versuchen :) –

+0

hat wunderbar funktioniert! Vielen Dank! – user791187

0

Ja, die Antwort auf Ihr Problem ist ein Index für den (Autor, Titel) Gruppe von Spalten. Dadurch wird der von der DB verwendete Speicherplatz vergrößert und die Leistung bei INSERT, UPDATE, DELETE in dieser Tabelle verringert, aber die Abfrageleistung wird erhöht.

+0

würden Sie einen nicht gruppierten Index oder einen Clustered empfehlen? Ich entschuldige mich, ich bekomme gerade in diesem Programmierbereich meine Füße nass! – user791187

+0

sollten Sie zuerst eine nicht gruppierte versuchen. Nur wenn die Leistung nicht zufriedenstellend ist, können Sie zu einem gruppierten Index wechseln. Der gruppierte gruppiert die Datensätze physisch neu. Das ist eine harte Kernaufgabe. –

0

make index auf Autor und Titel kann Ihnen helfen, die Leistung zu verbessern.

0

Syntax Hilfe für diejenigen, die nicht begreifen, die über Antwort

ALTER TABLE Your_table_name ADD INDEX ( COLUMN_TITLE );

Verwandte Themen