【问题标题】:Optimization - PHP sqlsrv large database queries loading too slow优化 - PHP sqlsrv 大型数据库查询加载太慢
【发布时间】:2016-02-04 15:32:15
【问题描述】:

更新:在速度更快的计算机上尝试过,100,000 次查询需要 8-10 秒。但是,我仍然无法通过数百万行。

我正在尝试创建一个带有用户界面的搜索引擎,以便在 SQLSRV 数据库的一个巨大表中搜索特定数据。我有 php 作为后端。整个数据库有几百万行,我想要一个选项,让我还可以显示数据库中的所有行并导出它们。但是从看起来数据库太大而无法显示每一行的未过滤视图。是否可以加载和显示每一行?我已经尝试删除 php 的超时和内存限制,但是搜索通常会崩溃或超过 5 分钟没有任何反应。我在本地主机上运行它并查询远程服务器上的数据库。我的电脑是 5GB 内存的 i7。

主要目标

我将有 3 个选项。 我的主要一般搜索查询将包括一系列 WHERE COL1 'LIKE % %' OR COL2 LIKE % % OR ... 等,它基本上检查每一列是否有类似的匹配,这将是第一个选项和另一个选项 WHERE COL1 ' LIKE % %' AND COL2 LIKE % % AND ... 最后一个选项是显示数据库中的所有内容。对于每一列的一般搜索(一系列 OR 或 UNION),您认为在每一列上添加单个索引会起作用吗?以及带有一系列 AND 的高级搜索。覆盖指数在这两种情况下都有帮助吗?还是为每列添加一个索引?

我试过用这个来测试

<?php
$connection = sqlsrv_connect($server, $info);
if(!$connection){
    die("Error: " . mysql_error());
}

$queryResults = sqlsrv_query($connection, "SELECT id FROM myDatabase");
if($queryResults){
    for ($i = 0; $i < 100000; $i++){
        $row = sqlsrv_fetch_array($result);
                   echo "<tr>";
                   echo "<td>" .  $row['id'] . "</td>";
                   echo "</tr>";
    }
} else { echo "failed"; }
?>

这是我的测试代码的简短摘录,我尝试将显示限制为仅一列,即使这样它也无法查询超过 100,000 行的任何内容。事实上,100,000 行大约需要 10 秒。我还尝试使用可滚动、缓冲和前向游标进行查询设置,也将其删除,因为它没有帮助。

这种类型的查询可以用 php 和 sqlsrv 吗?有没有更快更好的解决方案来制作带有 UI 的数据库搜索引擎,我可以用 php 做到这一点吗?我希望你能帮忙。在此先感谢您的宝贵时间。

【问题讨论】:

  • for ($i = 0; $i &lt; 100000; $i++){ 不是您限制结果的方式,您可以使用LIMIT 0,100000 在 SQL 中执行此操作
  • 我正在使用 sqlsrv 所以它是一种不同的语法,但问题是我想显示超过这个限制并用它来查看我现在是否可以显示 100,000 并搜索整个数据库中的每一列由于速度,类似的模式是另一个问题。

标签: php sql-server database performance search


【解决方案1】:

不要使用 LIKE %search%,不是 sargable,使用 LIKE 'search%'。如果必须,使用全文索引,添加必要的覆盖索引会提高速度,非聚集索引如果只需要一列,只选择必要的列,不建议显示每一行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2021-06-23
    • 2011-10-24
    相关资源
    最近更新 更多