[英]Laravel jQuery auto-complete speed
我正在使用Laravel。 自动完成速度很慢。 我知道这可能是因为我的数据库中有很多信息。 我在表中总共有38432行。 但我确信Facebook,Twitter等比我更多。
如何加快自动完成速度?
这是我的代码:
class AutoCompleteController extends Controller {
public function index() {
return view('layouts.mess');
}
public function aa(Request $request){
$term = $request->get('term');
//$queries=Profile::distinct('cityandstate','LIKE','%'.$term.'%')->take(5)->get();
$queries = all::where('cityandstate', 'like', $term . '%')->offset(5)->limit(15)->orderBy('cityandstate','dec')->get();
foreach ($queries as $query) {
$results[] = ['value' => $query->cityandstate ];
}
return response()->json($results);
}
}
JavaScript的:
<script type="text/javascript">
$( function() {
$( "#location-input" ).autocomplete({
//html : html,
source: "display-searches",
minLength: 1,
select:function(e,ui) {
$("#location-input").val(ui.item.label);
}
});
});
</script>
“慢”是一个相对术语。 我建议测量你的选择语句速度,让读者了解你的意思,也许还有你正在寻找什么样的速度改进。 在PHP中,您可以使用microtime(true)
来获取时间的浮点表示。
您的硬件可能是第一个开始的地方。 您是在开发机器或共享PHP主机或具有大量RAM的专用VPS上运行它吗? 这个东西很重要。 如果问题是在现场展示,那么也许你的数据库服务器不符合要求。
建议您使用索引。 它们是一种数据库功能,可以更快地搜索数据,但代价是插入速度,而且它们通常是个好主意。 但是,在MySQL上,索引不用于LIKE %x%
查询 - 前面的通配符表示它们无法使用。 需要进行“全表扫描”,即没有索引时会发生这种情况(这就是为什么你发现它们没有区别)。
如果你真的无法升级你的数据库服务器,你可以创建一个连接到你的表的新表来分割你的所有单词,这样你就可以只在一侧进行匹配。
例如,考虑这个地址部分:
Greenwich, London
我从您的查询中假设您希望自动完成在用户开始键入以下任一项时匹配:
Gre
Lon
但是,如果你没有得到这些匹配,这并不可怕:
wich
don
因此,从您的表中,加入另一个名为words
表,因此上面的条目在words
表中获得两个相关的条目:
Greenwich
London
您需要创建一个进程以使单词表与cities表保持同步。 然后,你可以这样做:
SELECT *
FROM address
INNER JOIN word ON (words.address_id = address.id)
WHERE word.word LIKE '?%'
的?
然后将用用户的当前单词替换,这可以在JavaScript中完成(在空间上拆分)。 然后奖励是您找到了匹配项,您可以根据需要建议单词或整个地址短语。 好消息是MySQL可以再次使用索引,因为你已经避开了左侧的百分比!
要查看索引是否有任何区别,请尝试使用EXPLAIN
语法在数据库客户端中输入查询。 例如,尝试以上查询:
EXPLAIN
SELECT *
FROM address
INNER JOIN word ON (words.address_id = address.id)
WHERE word.word LIKE '?%'
您已经了解了如何使用CREATE INDEX
(您可以直接在数据库客户端中运行它,您不必在PHP中执行它),并且您也可以使用DROP INDEX。 这些将帮助您在运行特定查询时发现差异(如果有)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.