2016-04-03 9 views
0

私は20mil +行のデータベースを持っており、検索機能が必要です。 私は検索するPDOコードを持っています。検索されたユーザー名がデータベースに入っているとき、それは非常に高速ではありませんが、約0.9秒です。しかし、検索されたユーザー名がデータベースにない場合は、10秒以上かかることがあります。ここで 遅いPHPデータベース検索

は私のコードです:私はstackoverflowの上で、この検索

$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"; 
    } 

と私は、私は、共有ホスティング(namecheap)

にしていますので、私のために可能ではないスフィンクス、のようなものを見つけることができます

私を助けることができる人?どうも。

+3

ユーザー名列のインデックスはありますか? –

+0

@kylek私はSQLやそのような方法ではあまり良くありません。私は索引を持っているとは思われません。どのように追加すればいいですか?それは検索された列(ユーザー名)またはすべての列にあるだけですか? – wtm

答えて

4

あなたはおそらくインデックスを必要とする:データベースは、それが存在しないことを確認するために、テーブル全体を検索する必要があるため

create index idx_dbsearch_username_id on dbsearch(username, id) 

名前が表にないとき、それは遅く行く理由があります。名前が表内にある場合は、最初のオカレンスで停止することができます。インデックスでは、どちらも非常に速くなければなりません。

+2

インデックスにid列を含める理由は何ですか? –

+0

そうです、それでした!それは本当に両方の方法で非常に高速です。また、私はkyle kと同じことを思い出しています。どの列をインデックス化する必要がありますか? – wtm

+0

@kylek。 。 。したがって、インデックスはクエリをカバーします。これは、MySQLがデータページを参照する必要がないことを意味します。すべての情報はインデックスにあります。一部のデータベースでは、主キーは索引(またはクラスタード索引)には必要ありませんが、その場合でも明示的にすることをお薦めします。 –