【问题标题】:Slow PHP searching in database在数据库中缓慢的 PHP 搜索
【发布时间】:2016-04-03 14:16:14
【问题描述】:

所以我有一个超过 2000 万行的数据库,我需要一个搜索功能。 所以我有一个 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 这样的东西,这对我来说是不可能的,因为我在共享主机上(namecheap)

谁能帮帮我?谢谢。

【问题讨论】:

  • 你有用户名列的索引吗?
  • @kylek 我不太擅长 sql 或那样的事情,我认为我没有索引。我该如何添加它,它只需要在搜索的列(用户名)上还是全部?

标签: php sql pdo


【解决方案1】:

你可能只需要一个索引:

create index idx_dbsearch_username_id on dbsearch(username, id)

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

【讨论】:

  • 索引中包含id列的原因是什么?
  • 对,就是这样!现在确实在这两种方式上都非常快。我也想知道和 kyle k 一样的事情,你需要索引哪一列以及为什么?
  • @kylek 。 . .所以索引将覆盖查询。这意味着 MySQL 不需要引用数据页——所有信息都在索引中。在某些数据库中,索引(或聚集索引)不需要主键,但即使在这种情况下,我也更喜欢明确。
猜你喜欢
  • 2011-07-05
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多