我在mysql数据库中有一个表格,其结构有点像
id |parent_id| project_id | name | file_type
-------------------------------------------
1 | NULL | p1 | abc1 | f1
2 | NULL | p1 | abc2 | f2
3 | 1 | p1 | abc3 | f2
4 | NULL | p2 | abc4 | f1
5 | 1 | p1 | abc5 | f3
6 | NULL | p2 | abc6 | f3
7 | 4 | p2 | abc7 | f1
8 | NULL | p1 | abc8 | f2
9 | 7 | p2 | abc9 | f1
我正在尝试获取所有 parent_id 必须为null和 project_id 必须为'p1'和 file_type 可以是'f1'或'f2'
根据我目前的进度,此查询对我有用
从testtable中select * where(project_id ='p1',parent_id为null 和file_type ='f1')或(project_id ='p1',parent_id为null,并且 file_type ='f2');
是否有一些更好的方法来获取所需的记录,例如使用加入?高性能的方法是可取的。
也是因为我正在使用file_type过滤记录。
因此,在file_type列上添加索引是否不错?
此列的数据类型是Varchar(50)
您可以尝试此(绝对不需要使用加入):
SELECT * FROM testtable
WHERE project_id = 'p1' AND parent_id Is NULL AND file_type IN ('f1','f2') ;
这应该有效:
SELECT
*
FROM
testtable
WHERE
parent_id IS NULL
AND project_id = 'p1'
AND file_type IN ('f1','f2')
SELECT * FROM testtable WHERE project_id = 'p1' AND parent_id is NULL AND file_type in ('f1', 'f2');
在project_id
和file_type
上创建复合索引。使用UNION
优化响应时间。
SELECT * FROM testtable
WHERE parent_id IS NULL
AND project_id = 'p1'
AND file_type = 'f1'
UNION
SELECT * FROM testtable
WHERE parent_id IS NULL
AND project_id = 'p1'
AND file_type = 'f2'
在OR
子句中违反了Index
的目的。将查询分解并使用UNION
合并结果肯定会完全使用索引。