数据库系列(MySQL)—— MySQL优化之多表join,多个in或or查询的速率优化逻辑

今天在优化一个sql查询,因为是一个订单的查询,需要验证一些订单的查看权限,其中逻辑需要join到多个其他表格,同时也用到很多in和or,导致多表都是用到全表扫描,速率及其慢。
比如订单中的商品的标签字段需要做过滤,下面模拟表格order(订单表),item(商品表),tag(标签表)
一般的逻辑大致上是这样的
select * from order
where (某些过滤语句)
where tag.name not in (tags)
left join item on item.tid = order.tid
left join tag on item.id = tag.item_id

优化方案是这样的,先根据tags 获取到对应的item_ids,即要不需要过滤掉的item_ids,然后根据item_ids获取到对应得tids,最后语句为
select * from order
where (某些过滤语句)
where tid in (tids)

可能表述有些乱,因为个人感觉这个数据库设计得有些问题,可能是经过几次的需求改动。或者是因为订单需要做快照,即下单之后订单的数据不会随着产品数据的修改而变动。
但是我要表述的优化逻辑就是,可以用反向的思维去,先把join的表格中的数据根据条件筛选出符合的数据,而不是一味地进行连表操作。

你可能感兴趣的:(MySQL系列,数据库,mysql)