2016-04-03 8 views
0

So habe ich eine Datenbank von 20mil + Zeilen, und ich brauche eine Suchfunktion. Also ich habe einen PDO-Code zu suchen, und wenn der gesuchte Benutzername in der Datenbank ist, ist es nicht sehr schnell aber gut, etwa 0,9 Sekunden. Aber wenn der gesuchte Benutzername nicht in der Datenbank ist, dauert es mehr als 10 Sekunden.Langsame PHP-Suche in der Datenbank

Hier ist mein Code:

$p = $_GET["p"]; 
    $conn = new PDO("mysql:host=localhost;dbname=x", "x", "x"); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $sth = $conn->prepare("SELECT `id` from `dbsearch` WHERE `username` = :p LIMIT 1"); 
    $sth->bindParam(':p', $p); 

    $sth->execute(); 
    $result = $sth->fetchAll(); 

    if($result) 
    { 
    foreach($result as $row) 
    { 
     echo $row["id"]; 
    } 
    } 
    else { 
    echo "none"; 
    } 

ich dafür auf Stackoverflow gesucht und ich konnte nur Dinge wie Sphinx finden, was für mich nicht möglich ist, da ich auf einem Shared-Hosting-bin (Namecheap)

Wer kann mir helfen? Danke.

+3

Haben Sie einen Index für die Spalte Benutzername? –

+0

@kylek Ich bin nicht sehr gut in SQL oder Dinge auf diese Weise, ich glaube nicht, dass ich einen Index habe. Wie füge ich das hinzu und muss es nur in der gesuchten Spalte (Benutzername) oder auf allen sein? – wtm

Antwort

4

Sie müssen wahrscheinlich nur einen Index:

create index idx_dbsearch_username_id on dbsearch(username, id) 

Der Grund ist es langsamer geht, wenn der Name nicht in der Tabelle ist, da die Datenbank die gesamte Tabelle suchen, muss sicher sein, es ist nicht da. Wenn der Name in der Tabelle steht, kann er beim ersten Auftreten anhalten. Mit einem Index sollten beide sehr, sehr schnell sein.

+2

Aus welchem ​​Grund wird die ID-Spalte in den Index aufgenommen? –

+0

Richtig, das war es! Es ist jetzt wirklich sehr schnell in beiden Richtungen. Ich frage mich auch die gleiche Sache wie Kyle k, welche Spalte müssen Sie indizieren und warum? – wtm

+0

@ kylek. . . Daher wird der Index die Abfrage abdecken. Dies bedeutet, dass MySQL nicht auf die Datenseiten verweisen muss - alle Informationen sind im Index enthalten. In einigen Datenbanken wird der Primärschlüssel nicht für einen Index (oder für einen gruppierten Index) benötigt, aber ich bevorzuge es, auch in diesem Fall explizit zu sein. –