用php优化SQL查询

用php优化SQL查询,php,mysql,sql,optimization,Php,Mysql,Sql,Optimization,数据库中的700000个元素 我有一个id的索引 我还有一个关于省的索引,长度为30的varchar,尽管我认为max省的名称长度为12 所以 此页面大约需要2秒钟 $sqlquery = "SELECT DESCRIPTION, ADDRESS, SIZE, BUILTIN, BED, BATH, PRICE FROM listings WHERE PRICE BETWEEN $min and $max AND BED between $minbr AND $max

数据库中的700000个元素 我有一个id的索引 我还有一个关于省的索引,长度为30的varchar,尽管我认为max省的名称长度为12

所以

此页面大约需要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。

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

因此,首先,确保还有一个关于价格、床位、类别和类型的指数

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


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

您的模式中存在多个问题

这个特定的查询可以通过一个多列索引进行优化,例如类型、类别、价格、床位,但在大多数情况下,这可能对您没有什么好处,因为这些标准都不是选择性的——更不用说相关性了。事实上,如果索引被使用,我会感到惊讶,除了在边缘情况下,因为与顺序扫描相比,读取索引的成本太高

选择标准是省,但由于在未编排的字符串上使用的是与中相同的like语句,它以通配符开头,因此不能在其上使用BTree索引。一个临时的解决方案可能是按照之前的建议添加全文索引。从长远来看,您实际上希望以允许空间索引的格式存储此信息:


省份列表应该简短,不应该经常更改。创建一个省表并连接到它,这样您就可以在一个相对较小的表上执行通配符搜索,并在大表上执行完全索引搜索。

获取一个配置文件工具并分析结果。如果您有权访问服务器,请直接通过MySQL控制台运行此查询,并查看日志记录。另外,在您的SELECT前面放一个EXPLAIN命令,以查看幕后发生了什么。这应该是你的第一步。它花了和PHP页面一样长的时间!我还将得到一个轮廓工具。有什么建议吗?如果花了同样的时间,那么你就知道MySQL是瓶颈。运行“解释”,看看会发生什么。尝试在mysql客户端中解释sql,如果需要任何引用,添加索引。这正是我想做的!
    $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>
    ";