需要过滤结果优化查询

时间:2015-06-30 11:04:41

标签: sql sqlite query-optimization

我有一个名为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

现在假设这个表有数千条记录,我需要添加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

我需要构建首先从表格中搜索genId 5 的查询,然后搜索具有像motor 这样的文本的描述和概述。因为如果我的表有100条记录,并且只有5条记录的genId设置为5,那么我的文本搜索查询将在这5行而不是100行上执行。

我的搜索查询:

Select * 
From Device 
where (genId=5) And (description Like '%motor%' Or overview Like '%motor%') 

任何人都可以帮我创建优化查询吗?

4 个答案:

答案 0 :(得分:0)

在这种情况下,您可以进行子查询

Select * 
From (Select * From Device where (genId=5)) 
where description Like '%motor%' Or overview Like '%motor%'

这里,首先执行子查询,然后执行where条件。这就是我所知道的

答案 1 :(得分:0)

为什么要单独搜索它们呢?只需将 AND 更改为 OR ,您的查询就会抓住所有可能的情况。

SELECT * FROM 
   Device 
WHERE 
    genId = 5 
OR 
    description Like '%motor%' 
OR 
    overview Like '%motor%'; 

答案 2 :(得分:0)

您的查询已尽可能优化。

LIKE本身并不慢;缓慢的是从磁盘加载所有表行,而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=?)

答案 3 :(得分:-1)

我认为最好不要使用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%')