Mysql where in 的范围非常多时如何优化?
问题描述:
数据库Mysql8,某个单表几百万的数据量,产品层面上做分页查询,业务上存在select count(*) from records where sale_id in (list) and create_time between start and end
和select * from records where sale_id in (list) and create_time between start and end order by create_time desc limit 0, 10
的需求,list
的数量可能会非常多,可能会几千个,导致查询非常慢,接口超时。
之所以list
非常多是因为,选项是个多级树形结构,产品层面可以跨级多选父级,代码在做查询的时候会把选中的sale_id
统一转化为叶子节点这一级,叶子总量有1W+, 目前如果只勾选1个1级节点,list有几千个,查询需要6s。
考虑过冗余记录 parent_id
序列,但是这个层级对应关系会时长发生变动,如果冗余记录parent_id
序列,对应关系变动时会引发大批量的历史数据的更新。
请问目前这种问题应当如何进行优化?
推荐文章: