【问题标题】:Making my query more efficient让我的查询更有效率
【发布时间】:2015-01-24 15:28:53
【问题描述】:

我目前正在执行从我的数据库中提取字符串的查询。但它必须检查我导入的每一个新行。一个 100k 的文件需要将近 4 个小时才能导入。那太长了。我假设我的 sql 代码检查他是否存在是减慢它的事情。 我听说过索引,但我不知道它是什么或如何使用它。

这是我当前使用的代码:

$sql2 = $pdo->prepare('SELECT * FROM prospects WHERE :ssn = ssn');
$sql2->execute(array(':ssn' => $ssn));
if($sql2->fetch(PDO::FETCH_NUM) > 0){

所以每次 phpscript 读取一个新行时,它都会进行此项检查。问题是,我不能把它放在 sql 代码中的“重复键上”。它必须在去任何 sql 之前检查,因为如果这是空的,那么它应该继续做它的事情。

我能做些什么来提高时间效率?而且,如果索引是要走的路,有人可以通过发布示例、链接指南或 php.net 页面来启发我如何做到这一点。以及我如何从该索引中读取以执行我在代码中的操作

【问题讨论】:

  • 那么也许阅读一些关于indexes 的文章会是一个不错的起点
  • 索引表与 PHP 无关。 ssn 是主键还是外键?
  • SQL 基于“集合”或行集合,大多数效率都集中在这个用例上。将数据转储到数据库端的临时表中并立即对所有内容运行查询可能会总体上产生更好的结果。

标签: php sql indexing


【解决方案1】:

所以你有 100k 条记录而你没有任何索引?然后开始创建一个

CREATE INDEX ssn_index ON prospects (ssn)

现在,每次当您尝试从具有where 条件的ssn 列上的prospects 表中选择某些内容时,MySQL 将通过索引检查它应该在哪里查找记录。如果此列具有很强的选择性(有许多不同的值),则查询将被快速执行。

你可以通过查询来检查你的执行计划

 EXPLAIN SELECT * FROM prospects WHERE :ssn = ssn

【讨论】:

  • 所以说我运行那个创建索引,它会永远存在吗?当我添加新行时它会更新吗?还是您也必须添加到索引中?用同样的方式使用sql代码吗?
  • 是的,它将永久存储并自动更新。如果您导出数据库,它也会被导出。
  • 谢谢,我在该表中为 ssn 添加了索引键。但是,查询根本感觉不到更快。我仍然编写相同的 sql 代码还是以某种方式更改它?
  • 请提供执行计划的结果。
猜你喜欢
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多