2016-04-03 62 views
0

所以我有一个20mil +行的数据库,我需要一个搜索功能。 所以我有一个PDO代码进行搜索,当搜索到的用户名在数据库中时,它不是很快但很好,大约0.9秒。但是,当搜索的用户名不在数据库中时,需要超过10秒。缓慢的PHP在数据库中搜索

这里是我的代码:

$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不需要引用数据页面 - 所有信息都在索引中。在一些数据库中,主键不需要索引(或聚集索引),但我更愿意在这种情况下显式。 –