我正在使用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>
答案 0 :(得分:2)
&#34;慢动作&#34;是一个相对的术语。我建议测量你的选择语句速度,让读者了解你的意思,也许还有你正在寻找什么样的速度改进。在PHP中,您可以使用microtime(true)
执行此操作以获得时间的浮点表示。
您的硬件可能是第一个开始的地方。您是在开发机器或共享PHP主机或具有大量RAM的专用VPS上运行它吗?这个东西很重要。如果问题在实时中展示,那么您的数据库服务器可能无法使用。
建议您使用索引。它们是一种数据库功能,可以更快地搜索数据,但代价是插入速度,而且它们通常是个好主意。但是,在MySQL上,索引不用于LIKE %x%
查询 - 前面的通配符表示它们无法使用。 A&#34;全表扫描&#34;是必需的,这是当你没有索引时会发生的事情(这就是你发现它们没有区别的原因)。
如果你真的无法升级你的数据库服务器,你可以创建一个连接到你的表的新表来分割你所有的单词,这样你就可以只在一方进行匹配。
例如,请考虑此地址部分:
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作为好。这些将帮助您在运行特定查询时发现差异(如果有)。