数据库中的慢速PHP搜索

数据库中的慢速PHP搜索,php,sql,pdo,Php,Sql,Pdo,因此,我有一个包含20mil+行的数据库,我需要一个搜索功能。 所以我有一个PDO代码要搜索,当搜索到的用户名在数据库中时,它不是很快,但是很好,大约0.9秒。但当搜索到的用户名不在数据库中时,需要10秒以上的时间 这是我的密码: $p = $_GET["p"]; $conn = new PDO("mysql:host=localhost;dbname=x", "x", "x"); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMOD

因此,我有一个包含20mil+行的数据库,我需要一个搜索功能。 所以我有一个PDO代码要搜索,当搜索到的用户名在数据库中时,它不是很快,但是很好,大约0.9秒。但当搜索到的用户名不在数据库中时,需要10秒以上的时间

这是我的密码:

$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";
  }
我在stackoverflow上搜索了这个,我只能找到像sphinx这样的东西,这对我来说是不可能的,因为我使用的是共享主机(namescape)


有人能帮我吗?thx.

您可能只需要一个索引:

create index idx_dbsearch_username_id on dbsearch(username, id)

当名称不在表中时速度变慢的原因是数据库必须搜索整个表以确保它不在表中。如果名称在表中,则可以在第一次出现时停止。有了索引,两者都应该非常非常快。

您可能只需要一个索引:

create index idx_dbsearch_username_id on dbsearch(username, id)

当名称不在表中时速度变慢的原因是数据库必须搜索整个表以确保它不在表中。如果名称在表中,则可以在第一次出现时停止。有了索引,两者都应该非常非常快。

你有用户名列的索引吗?@kylek我不太擅长sql或其他方面,我想我没有索引。我如何添加它?它只需要在搜索列(用户名)上还是在所有列上?你有用户名列的索引吗?@kylek我不太擅长sql或其他方面,我想我没有索引。我如何添加它?它只需要在搜索列(用户名)上还是在所有列上?在索引中包含id列的原因是什么?对,就是这样!现在这两方面的速度都非常快。我也想知道和kyle k一样的事情,你需要索引什么列,为什么?@kylek。因此,索引将覆盖查询。这意味着MySQL不需要引用数据页——所有信息都在索引中。在某些数据库中,索引(或聚集索引)不需要主键,但即使在这种情况下,我也希望主键是显式的。在索引中包含id列的原因是什么?没错,就是这样!现在这两方面的速度都非常快。我也想知道和kyle k一样的事情,你需要索引什么列,为什么?@kylek。因此,索引将覆盖查询。这意味着MySQL不需要引用数据页——所有信息都在索引中。在某些数据库中,索引(或聚集索引)不需要主键,但即使在这种情况下,我也希望主键是显式的。