1

数据库中有 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。

4

3 回答 3

1

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

因此,首先,请确保在 、 和 上也PriceBed一个Category索引Type

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

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

于 2013-06-14T11:02:12.983 回答
1

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

于 2013-06-14T12:25:30.093 回答
0

您的架构中有多个问题。

这个特定的查询可能会在 eg 上使用多列索引进行优化(Type, Category, Price, Bed),但恕我直言,在大多数情况下这可能对你没有什么好处,因为这些标准看起来都不是选择性的——更不用说相关性了。(事实上​​,如果索引被完全使用,我会感到惊讶,除非在边缘情况下,因为与顺序扫描相比,读取索引最终成本太高。)

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

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

于 2013-06-14T11:52:58.547 回答