需要过滤结果优化查询
Need filtered result optimised query
我有一个 table 叫 Device
:
Device Table
id deviceName genId description overview
1 PV motor 5 motor capacity 5 motor load is good
2 puf pannel 6 puf capacity 2 puf is for small load
3 gd motor 5 motor capacity 7 motor load is very good
4 rg motor 5 capacity is 3 low capacity
现在假设这个 table 有数千条记录,我需要添加行搜索,例如 genId=5 and description Like = '%motor%' OR Overview Like='%motor%'
搜索结果将是
1 PV motor 5 motor capacity 5 motor load is good
3 gd motor 5 motor capacity 7 motor load is very good
我需要构造查询,首先从 table 搜索 genId 5, 然后搜索描述和概述有像 motor 这样的文本。因为如果我的 table 有 100 条记录并且其中只有 5 条记录的 genId 设置为 5,那么我的文本搜索查询将在这 5 行而不是 100 行上执行。
我的搜索查询:
Select *
From Device
where (genId=5) And (description Like '%motor%' Or overview Like '%motor%')
任何人都可以帮助我创建优化查询吗?
这种情况下可以去子查询
Select *
From (Select * From Device where (genId=5))
where description Like '%motor%' Or overview Like '%motor%'
这里先执行子查询,再应用where条件。这就是我所知道的
我认为最好不要使用 OR
运算符并减少使用 Like
运算符,如下所示:
SELECT *
FROM Device
WHERE (genId = 5)
AND (1 = CASE WHEN description Like '%motor%' THEN 1
WHEN overview Like '%motor%' THEN 1
ELSE 0
END)
或者这个
SELECT *
FROM Device
WHERE (genId = 5)
AND (description || ':' || overview Like '%motor%')
那为什么要分开搜索呢?只需将 AND 更改为 OR,您的查询将获取所有可能的场景。
SELECT * FROM
Device
WHERE
genId = 5
OR
description Like '%motor%'
OR
overview Like '%motor%';
您的查询已经尽可能优化。
LIKE本身并不慢;它慢的是从磁盘加载所有 table 行,而 LIKE 通常需要这样做,因为它无法使用索引优化其查找。
但是,当 genId
列上没有索引时,无论如何都需要加载所有行 以检查这些值,因此插入一个额外的步骤将是不必要的努力:
> EXPLAIN QUERY PLAN Select * From Device where (genId=5) And (description Like '%motor%' Or overview Like '%motor%');
0|0|0|SCAN TABLE Device
另一方面,如果是 genId
列上的索引,那么您不需要进行任何手动优化,因为数据库将自动在索引中查找匹配的 genId
行,然后仅在这些行上检查 LIKE 数学:
> CREATE INDEX genId_index ON Device(genId);
> EXPLAIN QUERY PLAN Select * From Device where (genId=5) And (description Like '%motor%' Or overview Like '%motor%');
0|0|0|SEARCH TABLE Device USING INDEX genId_index (genId=?)
我有一个 table 叫 Device
:
Device Table
id deviceName genId description overview
1 PV motor 5 motor capacity 5 motor load is good
2 puf pannel 6 puf capacity 2 puf is for small load
3 gd motor 5 motor capacity 7 motor load is very good
4 rg motor 5 capacity is 3 low capacity
现在假设这个 table 有数千条记录,我需要添加行搜索,例如 genId=5 and description Like = '%motor%' OR Overview Like='%motor%'
搜索结果将是
1 PV motor 5 motor capacity 5 motor load is good
3 gd motor 5 motor capacity 7 motor load is very good
我需要构造查询,首先从 table 搜索 genId 5, 然后搜索描述和概述有像 motor 这样的文本。因为如果我的 table 有 100 条记录并且其中只有 5 条记录的 genId 设置为 5,那么我的文本搜索查询将在这 5 行而不是 100 行上执行。
我的搜索查询:
Select *
From Device
where (genId=5) And (description Like '%motor%' Or overview Like '%motor%')
任何人都可以帮助我创建优化查询吗?
这种情况下可以去子查询
Select *
From (Select * From Device where (genId=5))
where description Like '%motor%' Or overview Like '%motor%'
这里先执行子查询,再应用where条件。这就是我所知道的
我认为最好不要使用 OR
运算符并减少使用 Like
运算符,如下所示:
SELECT *
FROM Device
WHERE (genId = 5)
AND (1 = CASE WHEN description Like '%motor%' THEN 1
WHEN overview Like '%motor%' THEN 1
ELSE 0
END)
或者这个
SELECT *
FROM Device
WHERE (genId = 5)
AND (description || ':' || overview Like '%motor%')
那为什么要分开搜索呢?只需将 AND 更改为 OR,您的查询将获取所有可能的场景。
SELECT * FROM
Device
WHERE
genId = 5
OR
description Like '%motor%'
OR
overview Like '%motor%';
您的查询已经尽可能优化。
LIKE本身并不慢;它慢的是从磁盘加载所有 table 行,而 LIKE 通常需要这样做,因为它无法使用索引优化其查找。
但是,当 genId
列上没有索引时,无论如何都需要加载所有行 以检查这些值,因此插入一个额外的步骤将是不必要的努力:
> EXPLAIN QUERY PLAN Select * From Device where (genId=5) And (description Like '%motor%' Or overview Like '%motor%');
0|0|0|SCAN TABLE Device
另一方面,如果是 genId
列上的索引,那么您不需要进行任何手动优化,因为数据库将自动在索引中查找匹配的 genId
行,然后仅在这些行上检查 LIKE 数学:
> CREATE INDEX genId_index ON Device(genId);
> EXPLAIN QUERY PLAN Select * From Device where (genId=5) And (description Like '%motor%' Or overview Like '%motor%');
0|0|0|SEARCH TABLE Device USING INDEX genId_index (genId=?)