Php 如何加快查询速度?
我有代码从DB生成四辆车,并附上它们的照片: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>";
$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是不可注入的