Php 如何加快查询速度?

Php 如何加快查询速度?,php,mysql,database-design,Php,Mysql,Database Design,我有代码从DB生成四辆车,并附上它们的照片: $l=$database->query("SELECT car,brand,exactprice FROM $table ORDER BY rand() LIMIT 4"); $buffer=""; foreach($l as $l){ $buffer.="<li><h3>{$l['car']}</h3><p>Price {$l['exactprice']}</p>";

我有代码从DB生成四辆车,并附上它们的照片:

$l=$database->query("SELECT car,brand,exactprice FROM $table ORDER BY rand() LIMIT 4");
$buffer="";
foreach($l as $l){
    $buffer.="<li><h3>{$l['car']}</h3><p>Price {$l['exactprice']}</p>";
    $k=$database->query("SELECT logo FROM logo WHERE brand='{$l['brand']}'");
    $buffer.="<img src='{$base_addr}/{$k[0]['logo']}'><br>";
}
$l=$database->query(“从$table ORDER BY rand()LIMIT 4中选择汽车、品牌、exactprice”);
$buffer=“”;
foreach($l作为$l){
$buffer.=“
  • {$l['car']}Price{$l['exactprice']}

    ”; $k=$database->query(“从商标='{$l['brand']}'所在的商标中选择商标”); $buffer.=“
    ”; }
  • 这是我目前的密码。我是否可以重写MySQL命令,以便在第一次选择时从
    logo
    获取
    logo


    当前加载此页面需要4.32秒。

    您没有提供
    $table
    的内容,但无论哪种方式,您都可以在brand列上使用
    连接(假设此列是适当的外键)

    就性能而言,您可以在经常使用的列上创建索引,并通过在上面的查询前面添加
    EXPLAIN
    进行基准测试

    请参阅以下参考资料:


    您没有提供
    $table
    是什么,但是无论哪种方式,您都可以在品牌列上使用
    连接(假设此列是适当的外键)

    就性能而言,您可以在经常使用的列上创建索引,并通过在上面的查询前面添加
    EXPLAIN
    进行基准测试

    请参阅以下参考资料:


    选择车,$table.brand,exactprice,logo FROM$table在$table上加入logo。brand=logo.brand ORDER BY rand()限制4
    应该通过将
    brand
    表加入查询来实现。

    选择车,$table.brand,exactprice,logo FROM$table在$table上加入logo。brand=logo.brand ORDER BY rand()限制4应通过将
    品牌
    表加入到查询中来完成此操作。

    将脚本更改为:

    $l=$database->query("SELECT $table.car, logo.logo, $table.exactprice FROM $table join logo on logo.brand= $table.brand ORDER BY rand() LIMIT 4");
            $buffer="";
            foreach($l as $l){
                $buffer.="<li><h3>{$l['car']}</h3><p>Price {$l['exactprice']}</p>";
                $buffer.="<img src='{$base_addr}/{$l['logo']}'><br>
    
    $l=$database->query(“从logo.brand=$table.brand的$table连接logo中选择$table.car、logo.logo、$table.exactprice());
    $buffer=“”;
    foreach($l作为$l){
    $buffer.=“
  • {$l['car']}Price{$l['exactprice']}

    ”; $buffer.=“

  • 将脚本更改为:

    $l=$database->query("SELECT $table.car, logo.logo, $table.exactprice FROM $table join logo on logo.brand= $table.brand ORDER BY rand() LIMIT 4");
            $buffer="";
            foreach($l as $l){
                $buffer.="<li><h3>{$l['car']}</h3><p>Price {$l['exactprice']}</p>";
                $buffer.="<img src='{$base_addr}/{$l['logo']}'><br>
    
    $l=$database->query(“从logo.brand=$table.brand的$table连接logo中选择$table.car、logo.logo、$table.exactprice());
    $buffer=“”;
    foreach($l作为$l){
    $buffer.=“
  • {$l['car']}Price{$l['exactprice']}

    ”; $buffer.=“

  • 从$table left中选择汽车、品牌、exactprice、徽标在($table.brand=logo.brand)上按兰德订购($table.brand=logo.brand)限制4

    从$table left中选择汽车、品牌、exactprice、徽标在($table.brand=logo.brand)按兰德订购()限制4当前有两个问题。首先,应该执行此查询。执行此查询的查询已在其他答案中出现,因此我不再重复


    另外,如果您想知道为什么速度慢,它还与
    ORDER BY rand()
    有关。为此,您可以检查目前有两个问题。首先,应该完成此查询。其他答案中已经提供了执行此查询的查询,因此我不再重复


    此外,如果您想知道它为什么慢,它还与
    ORDER BY rand()
    有关。为此,您可以检查请通过执行以下操作修复SQL注入漏洞:

    $allowed_tables = array('table1', 'table2');
    $table = $_POST['table']; //or wherever table come from.
    if (in_array($table, $allowed_tables)) {
        $query = "SELECT car,brand,exactprice FROM `$table` ORDER BY rand() LIMIT 4";
        $l=$database->query($query);
        ......
    }
    
    使用参数或
    mysql\u real\u escape\u string()
    对您没有帮助,因为您使用的是动态表名。

    另请参见此问题:

    请通过执行以下操作修复SQL注入漏洞:

    $allowed_tables = array('table1', 'table2');
    $table = $_POST['table']; //or wherever table come from.
    if (in_array($table, $allowed_tables)) {
        $query = "SELECT car,brand,exactprice FROM `$table` ORDER BY rand() LIMIT 4";
        $l=$database->query($query);
        ......
    }
    
    使用参数或
    mysql\u real\u escape\u string()
    对您没有帮助,因为您使用的是动态表名。

    另请参见此问题:

    根据您的表大小、索引和结构,您可能会遇到其他问题(请使用
    解释选择
    ),但在
    按兰德排序()
    中存在一个潜在问题,即对整个表进行排序,调用
    兰德()
    对每一行进行查询,然后扔掉其中的大部分并给出前四行;效率极低。但是,您可以对子查询进行巧妙的处理,例如:


    请注意,只要不存在任何已删除的行(或它们是均匀分布的),这只会给您随机分布的结果;这可能是问题,也可能不是问题,这取决于您的查询目的。有关深入讨论,请参阅那篇文章:

    根据您的表大小、索引和结构,您可能会遇到其他问题(使用
    EXPLAIN SELECT
    )进行检查,但是
    ORDER BY RAND()
    中存在一个潜在的问题,即调用
    RAND()对整个表进行排序
    对每一行进行查询,然后扔掉其中的大部分并给出前四行;效率极低。但是,您可以对子查询进行巧妙的处理,例如:


    请注意,只要没有任何已删除的行(或它们是均匀分布的),这将只提供随机分布的结果;这可能是问题,也可能不是问题,具体取决于您的查询目的。请参阅那篇文章进行深入讨论:

    -1,SQL可注入代码。您应该知道这个问题,您以前听说过:它不可注入,$database->query会过滤并进行安全的输入和输出,感谢您的帮助,它不仅用于值,不适用于表/列/数据库名称,有关详细信息,请参阅我的答案和其中的链接。这对我来说没有意义:
    $database->query
    接收到一个字符串,没有任何提示它应该是什么意思。如果
    $l['brand']
    ==
    ”;DROP TABLE logo;--
    ,$database->query如何确切地知道,
    从logo中选择logo,其中brand='';DROP TABLE logo;--'
    不是您想要的?-1,SQL可注入代码。您应该知道这个问题,您以前听说过:$database->qu是不可注入的