【发布时间】:2017-11-19 16:50:09
【问题描述】:
我正在运行一个大型 PHP 脚本来获取适用于搜索查询等的数据库信息。问题是页面的加载时间是几秒钟(本地),而在远程数据库上最多为一分钟。
在优化方面我不是最好的,但我知道查询中的星号,但在这种情况下我需要它,因为我正在使用表中的所有字段。
请记住,它从中获取数据的表总共有超过 800k 行(我没有显示 800k 行,如代码中所示,我正在显示它WHERE = something)
<?php
$getPage = $mysqli->real_escape_string(@$_GET["page"]);
$getSearch = $mysqli->real_escape_string(@$_GET["search"]);
$getUser = $mysqli->real_escape_string(@$_GET["user"]);
if(isset($getPage)) { $page = $getPage; } else { $page = 1; };
$start_from = ($page-1) * 12;
$order = $mysqli->real_escape_string(@$_GET["ord"]);
$order_query = "item_name ASC";
if($start_from >= 0) {
if($getSearch)
{
if($order)
{
if($order == 1)
{
$order_query = "item_name ASC";
}
if($order == 2)
{
$order_query = "item_name DESC";
}
if($order == 3)
{
$order_query = "item_id ASC";
}
if($order == 4)
{
$order_query = "item_id DESC";
}
$shop = $mysqli->query("SELECT * FROM store_inventory WHERE (item_name LIKE '%".$getSearch."%' OR item_type LIKE '%".$getSearch."%' OR item_quality LIKE '%".$getSearch."%') AND steamid = '".$getUser."' GROUP BY item_id ORDER BY ".$order_query." LIMIT $start_from, 28");
}
else
{
$shop = $mysqli->query("SELECT * FROM store_inventory WHERE (item_name LIKE '%".$getSearch."%' OR item_type LIKE '%".$getSearch."%' OR item_quality LIKE '%".$getSearch."%') AND steamid = '".$getUser."' GROUP BY item_id ORDER BY item_name ASC LIMIT $start_from, 28");
}
}
else
{
if($order)
{
if($order == 1)
{
$order_query = "item_name ASC";
}
if($order == 2)
{
$order_query = "item_name DESC";
}
if($order == 3)
{
$order_query = "item_id ASC";
}
if($order == 4)
{
$order_query = "item_id DESC";
}
$shop = $mysqli->query("SELECT * FROM store_inventory WHERE steamid = '".$getUser."' GROUP BY item_id ORDER BY ".$order_query." LIMIT $start_from, 28");
}
else
{
$shop = $mysqli->query("SELECT * FROM store_inventory WHERE steamid = '".$getUser."' GROUP BY item_id ORDER BY item_name ASC LIMIT $start_from, 28");
}
}
} else {
$start_from = 0;
if($getSearch)
{
if($order)
{
if($order == 1)
{
$order_query = "item_name ASC";
}
if($order == 2)
{
$order_query = "item_name DESC";
}
if($order == 3)
{
$order_query = "item_id ASC";
}
if($order == 4)
{
$order_query = "item_id DESC";
}
$shop = $mysqli->query("SELECT * FROM store_inventory WHERE (item_name LIKE '%".$getSearch."%' OR item_type LIKE '%".$getSearch."%' OR item_quality LIKE '%".$getSearch."%') AND steamid = '".$getUser."' GROUP BY item_id ORDER BY ".$order_query." LIMIT $start_from, 28");
}
else
{
$shop = $mysqli->query("SELECT * FROM store_inventory WHERE (item_name LIKE '%".$getSearch."%' OR item_type LIKE '%".$getSearch."%' OR item_quality LIKE '%".$getSearch."%') AND steamid = '".$getUser."' GROUP BY item_id ORDER BY item_name ASC LIMIT $start_from, 28");
}
}
else
{
if($order)
{
if($order == 1)
{
$order_query = "item_name ASC";
}
if($order == 2)
{
$order_query = "item_name DESC";
}
if($order == 3)
{
$order_query = "item_id ASC";
}
if($order == 4)
{
$order_query = "item_id DESC";
}
$shop = $mysqli->query("SELECT * FROM store_inventory WHERE steamid = '".$getUser."' GROUP BY item_id ORDER BY ".$order_query." LIMIT $start_from, 28");
}
else
{
$shop = $mysqli->query("SELECT * FROM store_inventory WHERE steamid = '".$getUser."' GROUP BY item_id ORDER BY item_name ASC LIMIT $start_from, 28");
}
}
}
$countarticles = $mysqli->query("SELECT COUNT(item_id) FROM store_inventory");
$row = $countarticles->fetch_row();
$total_records = $row[0];
$total_pages = ceil($total_records / 28);
$Pages[] = "";
for ($i = 1; $i <= $total_pages; $i++) {
$Pages[] = "<li><a href='?page=".$i."'>".$i."</a></li>";
}
while($fetch_market = $shop->fetch_array())
{
$iInv[] = $fetch_market;
}
如何显着减少脚本/页面的加载时间?
【问题讨论】:
-
首先避免使用 select * 直到并且除非你需要整行
-
@DhavalChheda 正如我所说,我需要整行。
-
你有关于 steamid 的索引吗?
-
不,steamid 上没有索引
-
@P.Nick 当您请求查询优化帮助时,请在查询中为每个表添加
SHOW CREATE TABLE,这样我们就不必猜测数据类型、索引和约束。帮助我们帮助您!
标签: php mysql query-optimization