【问题标题】:Optimizing SQL queries with php使用 php 优化 SQL 查询
【发布时间】:2013-06-14 20:25:30
【问题描述】:

数据库中有 700,000 个元素 我在 id 上有一个索引 我还有一个关于省的索引,一个长度为 30 的 varchar(尽管我认为最大省的名称长度为 12)

所以

    Create table (
     id serial primary key watever,
      price double not null,
      address varchar(200)not null,               
      province varchar(30)not null,
      description text not null,
      status varchar(8) not null,
      type varchar(30) not null,
      category text not null, 
      size int(11) not null,
      bultin int(4),
      bed int(2),
      bath int(2),
      extras text,
      posted_by int foregin key(user.id or whatever)
    );

这个页面大约需要 2 秒

    $sqlquery = "SELECT DESCRIPTION, ADDRESS, SIZE, BUILTIN, BED, BATH, PRICE 
    FROM listings 
    WHERE PRICE BETWEEN $min and $max AND BED between $minbr AND $maxbr AND CATEGORY = 
    '$cat' AND TYPE = '$type' AND PROVINCE like '%$province%'";

    while ($row = mysqli_fetch_array($listings)) {

      echo $row['DESCRIPTION'] . " Located at " . $row['ADDRESS'] . " " . $province. "         " 
    . $row['SIZE'] . " sqft" . ", built in " . $row['BUILTIN'] . " " . $row['BED'] . "Bedroom, " 
    . $row['BATH'] . " Bathroom for $" . $row['PRICE'] . "
    <br>
    ";

我已经阅读了一些关于提高 SQL 查询效率的教程,但是它们根本没有改变正在发生的事情的速度。 (也许所有速度损失都在PHP中?!?我认为这很有可能,如果是这样我该如何优化php?)

编辑:在 phpmyadmin 上,我运行了查询,它花费了运行 php 页面所需的时间。问题显然是查询而不是 PHP。

【问题讨论】:

  • 获取分析工具并分析结果。
  • 如果您有权访问您的服务器,请直接通过 MySQL 控制台运行此查询并查看它的日志记录。此外,在您的 SELECT 前面放置一个EXPLAIN 命令,以查看幕后发生的情况。这应该是您的第一步。
  • 耗时和PHP页面一样长!我还将获得一个配置文件工具。有什么建议吗?
  • 如果花费相同的时间,那么您知道 MySQL 是瓶颈。运行 'explain 看看会发生什么。
  • 尝试在 mysql 客户端中“解释”你的 sql,如果需要,添加索引。

标签: php mysql sql optimization


【解决方案1】:

如果您不知道索引是如何工作的,那么为您在WHEREORDER BY 部分中使用的所有列添加索引将是一个开始。这远非最佳,但在大多数情况下,它是一种改进。最好使用explainoptimizer 进行检查。

所以首先,确保PriceBedCategoryType 上也有一个索引。

另一件事是您提到您在Province 列上有一个index,但不幸的是,如果您在开头使用带有通配符的LIKE,则不会使用它。它只会使用带索引的第一个通配符之前的部分。所以基本上这将是一个全表扫描,无论你有什么索引。

您可以尝试使用FULLTEXT 索引来加快速度。

【讨论】:

    【解决方案2】:

    省份列表应该很短,并且不应该经常更改。制作一个省表并加入它,这样您就可以在一个相对较小的表上进行通配符搜索,并在您的大表上进行全索引搜索。

    【讨论】:

    • 正是我想做的事!
    【解决方案3】:

    您的架构中有多个问题。

    这个特定的查询可能会通过多列索引进行优化,例如@ 987654322@,但恕我直言,在大多数情况下,这可能对您没有什么好处,因为这些标准都不是选择性的——更不用说相关性了。 (事实上​​,如果索引被使用,我会感到惊讶,除非在边缘情况下,因为与顺序扫描相比,读取索引最终会变得过于昂贵。)

    选择标准是省份,但由于您在未锚定的字符串上使用 like 语句(例如,它以通配符开头),因此您不能在其上使用 BTree 索引。一个临时修复可能是按照已经建议的那样添加全文索引。从长远来看,您实际上希望这些信息以允许空间索引的格式存储:

    http://dev.mysql.com/doc/refman/5.6/en/spatial-extensions.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-30
      • 2021-03-20
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 2013-01-10
      • 2014-02-04
      相关资源
      最近更新 更多