m0_37724533 2022-02-28 15:41 采纳率: 0%
浏览 58

MySQL优化方案对比(酬谢一百起步)

背景:

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));

哪个方案更好?

  • 写回答

2条回答 默认 最新

  • CSDN专家-sinJack 2022-02-28 16:16
    关注

    对两个sql执行计划进行分析,执行计划的结果分别是什么。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月28日