我正在使用 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>
最佳答案
“慢”是一个相对术语。我建议测量您的 select 语句速度,以便让读者了解您的意思,以及您正在寻求什么样的速度改进。在 PHP 中,您可以使用 microtime(true)
来获取时间的浮点表示形式。
您的硬件可能是第一个开始的地方。您是否在开发机器或共享 PHP 托管或具有充足 RAM 的专用 VPS 上运行此程序?这件事很重要。如果问题在现场出现,那么也许你的数据库服务器没有达到标准。
已向您推荐索引。它们是一种数据库功能,可以加快数据搜索速度,但会降低插入速度,而且它们通常是一个好主意。但是,在 MySQL 上,索引不用于 LIKE %x%
查询 - 前面的通配符意味着它们不能使用。需要“全表扫描”,这就是当您没有索引时会发生的情况(这就是为什么您发现它们没有区别)。
加速策略
如果您确实无法升级数据库服务器,您可以创建一个新表来连接到拆分所有单词的表,这样您就可以只在一侧进行匹配。
例如,考虑以下地址部分:
Greenwich, London
我从您的查询中假设您希望在用户开始输入以下任一内容时自动完成功能匹配:
Gre
Lon
但是,如果您没有与这些匹配,也并不可怕:
wich
don
因此,从您的表中联接到另一个名为 words
的表,因此上述条目会在 words
表中获取两个相关条目:
Greenwich
London
您需要创建一个流程来保持单词表与城市表同步。然后,您可以这样做:
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 用作出色地。这些将帮助您在运行特定查询时发现差异(如果有)。
关于javascript - Laravel jQuery 自动完成速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48913297/