问题描述
大家好,我有这个查询,但是我不知道如何优化这个查询。如果有人能提前在这里指导我,我将不胜感激。
let campgrounds = [
{ number: 1,view: 'ocean',partySize: 8,isReserved: false },{ number: 5,partySize: 4,{ number: 12,isReserved: true },{ number: 18,view: 'forest',{ number: 23,isReserved: true }
]
function getCamp(campgrounds,view,size) {
return campgrounds.filter(ground => !ground.isReserved && view === ground.view && ground.partySize >= size)
}
console.log(getCamp(campgrounds,"ocean",4));
我知道这是一个很长的查询,但我必须优化此选项,因此需要专业人士的指导谢谢
解决方法
低效模式
OR Jobs.restriction LIKE '%キャビンアテンダント%'
OR Jobs.remarks LIKE '%キャビンアテンダント%'
OR Personalities.name LIKE '%キャビンアテンダント%'
这是一种常见的但效率很低的模式。
-
OR
禁止使用索引 -
LIKE
中通配符领先导致无法使用索引 -
WHERE
子句涉及多个表的伤害。
可能的解决方法
我确实看到了可以转化为优化的模式。您似乎正在对照大量列检查用户提供的字符串。如果可以使用LIKE
而不是使用FULLTEXT
,那么可以找到一种更快的解决方案。 (对不起,我不知道日语是否可以与FULLTEXT
一起使用;您可能需要MySQL 8.0,它对UTF-8进行了很多改进。)
这是技巧:
- 将所有这些搜索列(限制,说明,名称等)中的数据收集到一个列中,甚至可以收集到一个新表中。
- 将
FULLTEXT
应用于该列。 - 仅在该列中搜索;获取匹配的ID,然后
JOIN
到所有其他表。
后备广告
即使FULLTEXT
在亚洲语言中不能很好地工作,将一个字符串应用LIKE
也会有所帮助。
语法错误?
LEFT JOIN jobs_career_paths JobsCareerPaths Page 3 / 4 ON Jobs.id = (JobsCareerPaths.job_id)
看起来像语法错误。
需要综合索引
LEFT JOIN affiliates CareerPaths
ON (CareerPaths.type = 3
AND CareerPaths.id = (JobsCareerPaths.affiliate_id)
AND (CareerPaths.deleted) IS NULL
CareerPaths需要此综合索引:
INDEX(type,id,deleted)
,列以任何顺序排列。 3个单独的索引不是很好。 (还要检查其他JOINs
。)