如何加快此查询?

时间:2011-06-12 22:01:15

标签: php mysql database-design

我有代码从数据库中生成四辆车及其照片:

$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>";
}

这是我目前的代码。我可以重写我的MySQL命令,这样我就可以从logo获得logo第一个选择吗?

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

7 个答案:

答案 0 :(得分:5)

您没有提供$table的内容,但无论哪种方式,您都可以在品牌列上使用JOIN假设此列是相应的外键

SELECT $table.car, $table.brand, $table.exactprice, logo.logo
FROM $table JOIN logo ON $table.brand = logo.brand
ORDER BY rand() LIMIT 4

就性能而言,您可以考虑在频繁使用的列上创建索引,并在上面的查询前面添加EXPLAIN进行基准测试。

一些参考文章:

答案 1 :(得分:1)

SELECT car, $table.brand, exactprice, logo FROM $table JOIN logo ON $table.brand=logo.brand ORDER BY rand() LIMIT 4应该通过将brand表加入查询来实现。

答案 2 :(得分:1)

将您的脚本更改为:

$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>

答案 3 :(得分:1)

目前有2个问题。首先,此查询应该完成using a JOIN。在其他答案中已经提到了这样做的查询,所以我不再重复了。

另外,如果你想知道为什么它很慢,它也与ORDER BY rand()有关。为此,您可以查看This Stackoverflow question

答案 4 :(得分:1)

请通过执行以下操作修复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_real_escape_string()对您没有帮助,因为您使用的是动态表名 另请参阅此问题:How to prevent SQL injection with dynamic tablenames?

答案 5 :(得分:1)

根据您的表格大小,索引和结构,您可能还有其他问题(请查看EXPLAIN SELECT),但ORDER BY RAND()中存在潜在问题 - 对整个表进行排序,调用{{1对于每一行,然后抛出大部分,并给你前四行;非常低效。但是,您可以使用子查询做一个巧妙的技巧,例如this one from @Jan Kneschke's article

RAND()

请注意,只要没有任何已删除的行(或它们均匀分布),这只会为您提供随机分布的结果;这可能是也可能不是问题,具体取决于查询的目的。请参阅该文章进行深入讨论:http://jan.kneschke.de/projects/mysql/order-by-rand/

答案 6 :(得分:0)

选择汽车,品牌,exactprice,logo FROM $ table left join logo on($ table.brand = logo.brand)ORDER BY rand()LIMIT 4