背景:
id是primary key
存在company_id+sn+person_id的联合索引
每个company_id对应一个公司,一个公司会存在多张项目人力分配单据,每张单据都有唯一的sn号,每张单据里会有多个person_id,每个person_id代表一个人,每个person_id可以存在于多张单据里,但一张单据里不会有重复的goods_id
某公司的项目人力分配单据数量特别大(十万级别),需要支持根据单据中是否存在某个人或某些人(当搜索两个人时,只要有一个人在该单据中,该单据就会被展示出来)进行查询
目前存在两张表,第一张表是item表,存储了项目人力分配单据的概要信息(存储了id、company_id、sn),第二张表是detail表,存储了项目人力分配单据的详细信息(存储了id、company_id、sn和person_id)
方案一:
EXPLAIN SELECT * FROM item WHERE company_id = 123 AND id IN(select distinct item.id from item as item
left join detail as detail
on item.company_id = detail.company_id
and item.sn = detail.sn
where
item.company_id= 123
and detail.person_id in (123, 321));
方案二:
EXPLAIN SELECT * FROM item where company_id = 123 AND sn IN (
SELECT distinct sn from detail as detail
where detail.company_id = 123
and detail.person_id in (123, 321));
哪个方案更好?