我有三个表:Test,Amp和Fluorescence。测试是连接表的Amp和Fluorescence的外键。每个test_id的荧光行数介于50到100之间,而Amp通常少于2行。
我需要获取荧光中而不是Amp中不同的test_id的列表。这两个子查询都指定了一个频道。
现在,我正在使用以下查询:
SELECT test FROM db_test WHERE test NOT IN
(SELECT test_id FROM db_amp WHERE channel=0)
AND test IN (SELECT test.id FROM db_fluorescence WHERE channel=0);
虽然此查询有效,但需要0.5秒。这已经比我想要的更长,并且随着数据库的增长,它将会变得更长。
我对SQL还是很陌生,所以我知道有一种更有效的方法。
我还在考虑一种解决方法,例如在“测试”表中添加一个字段,以指示状态:
1. 0 - In neither Amp/Fluorescence
2. 1 - In Amp
3. 2 - In Fluorescence
4. 3 - In Both
然后对其查询:
SELECT test FROM db_test WHERE ch0_grade = 2;
虽然这肯定会更快,但我认为我应该能够通过改进原始查询来找到更好的解决方案。另外,我认为第二种选择破坏了常规性,因为该字段完全是数据库中其他信息的衍生。
答案 0 :(得分:0)
此查询应准确且具有足够的索引性能:
SELECT test
FROM db_test
JOIN db_fluorescence ON db_fluorescence.test_id = db_test.test
LEFT JOIN db_amp ON db_amp.test_id = db_test.test
WHERE db_amp.test_id IS NULL;
由于我们需要高性能的查询,因此我将添加辅助哈希索引以加快执行速度。
索引用于非常快速地从数据库检索数据。用户看不到索引,它们只是用来加速搜索/查询。
CREATE INDEX index1
ON db_fluorescence(test_id);
CREATE INDEX index2
ON db_test(test_id);
CREATE INDEX index3
ON db_amp(test_id);
注意:使用索引更新表要比不使用表更新表花费更多的时间(因为索引也需要更新)。因此,仅在经常搜索的列上创建索引。