我是使用Laravel PHP框架。
假设我有以下查询:
更新2
我还有这段代码,用于在列
This again can take seconds to load.. (这句话可能需要几秒钟才能加载出来...)
解释查询:
public function order($orderby){
\DB::connection()->disableQueryLog();
if($orderby == "level"){
$clan = Clans::orderBy('level', 'DESC')
->orderBy('exp', 'DESC')
->paginate(100,['id', 'clanid', 'name', 'level', 'exp', 'warwinpercent', 'warswon', 'playercount', 'score']);
}elseif($orderby == "score"){
$clan = Clans::orderBy('score', 'DESC')
->paginate(100,['id', 'clanid', 'name', 'level', 'exp', 'warwinpercent', 'warswon', 'playercount', 'score']);
}elseif($orderby == "warwinpercent"){
$clan = Clans::orderBy('warwinpercent', 'DESC')
->where('warswon', '>=', '100')
->paginate(100,['id', 'clanid', 'name', 'level', 'exp', 'warwinpercent', 'warswon', 'playercount', 'score']);
}else
$clan = Clans::paginate(100,['id', 'clanid', 'name', 'level', 'exp', 'warwinpercent', 'warswon', 'playercount', 'score']);
\DB::connection()->enableQueryLog();
return view('clans.index')->with('clan', $clan);
}
这些需要花费约10-15秒才能运行。
我有一个像这样的:
public function index(){
$clan = Clans::orderBy('clanid', 'ASC')
->paginate(100,['id', 'clanid', 'name', 'level', 'exp', 'warwinpercent', 'warswon', 'playercount', 'score']);
return view('clans.index')->with('clan', $clan);
}
几乎瞬间加载。
为什么前三个查询比最后一个慢那么多?我为需要在表中搜索的所有变量添加了索引,但它仍然需要很长时间才能工作。我需要在 MySql 方面做些什么来重建索引吗?我已经尝试过 Optimize table,并且多次重新启动了 MySql 服务。
如果无法加速查询,那么有没有简单的方法可以在加载页面时向用户显示加载动画?
谢谢!
更新
这是快速查询的 Explain 结果:
explain extended select `id`, `clanid`, `name`, `level`, `exp`, `warwinpercent`, `warswon`, `playercount`, `score` from `clans` order by `clanid` asc limit 100 offset 0
这是针对 orderBy level
查询的解释结果。explain extended select `id`, `clanid`, `name`, `level`, `exp`, `warwinpercent`, `warswon`, `playercount`, `score` from `clans` order by `level` desc, `exp` desc limit 100 offset 0
这里是SHOW INDEX FROM clans
的结果。
![](https://istack.dev59.com/U1EtK.webp)
name
中搜索字符串。public function clans(){
if((isset($_GET['search'])) && $_GET['search'] != ""){
$search = $_GET['search'];
$result = Clans::where('name', 'LIKE', '%'.$search.'%')->paginate(100,['id', 'clanid', 'name', 'level', 'exp', 'warwinpercent', 'warswon', 'playercount', 'score']);
$data = array(
'result' => $result,
'search' => $search
);
return view('search.clans')->with($data);
}else
return view('errors.1')->with('message', 'You entered an invalid search term');
}
This again can take seconds to load.. (这句话可能需要几秒钟才能加载出来...)
解释查询:
explain extended select `id`, `clanid`, `name`, `level`, `exp`, `warwinpercent`, `warswon`, `playercount`, `score` from `clans` where `name` LIKE '%lol%' limit 100 offset 0