千万级表JOIN 语句的优化原则

-- mysql JOIN 语句的优化原则-- mysql JOIN 语句的优化原则
-- 1.小表驱动大表(EXPLAIN的第一行是驱动表),WHERE 条件驱动表的筛选j出尽量少的数
-- 2.where里有筛选条件,而且可以使用索引,并对驱动表晒选出尽量少的行数
-- 3.非驱动表连接join字段最好是主键索引,无法建立索引的时候,设置足够的Join Buffer Size
-- 4.尽量避免联表数量,避免尽量少返回字段,避免返回字段有计算,越多,嵌套循环算法越慢,
-- 5.join连接表的语句不能再用子查询,COUNT(1) 分页统计返回字段要尽量少。
-- 6.扫描行数必须控制在百万级别,返回行数控制在千级别,且要分页处理.
-- 7.必须遵循以上原则,否则不用join,改单表查询在拼接,或者用es查询在拼接

-- mysql JOIN 语句study
-- 1.小表驱动大表(EXPLAIN的第一行是驱动表),WHERE 条件驱动表的筛选小行数
-- 2.NestedLoopJoin实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,https://blog.csdn.net/qq_27529917/article/details/87904179(细节参考)
-- 3.a.无order by条件时,根据实际情况,使用left/right/inner join即可,根据explain优化;
-- 4.b.有order by a.col条件时,所有join必须为left join,且每个join字段都创建索引,同时where条件中只能有a表的条件,即将其它表的数据关联到a中形成一张大表,再对a的全集进行过滤;
-- 5.通过where预估结果行数,遵循以下规则:https://blog.csdn.net/qq_27529917/article/details/87904179(细节参考)
--    如果where里没有相应表的筛选条件,无论on里是否有相关条件,默认为全表
--      如果where里有筛选条件,但是不能使用索引来筛选,那么默认为全表
--      如果where里有筛选条件,而且可以使用索引,那么会根据索引来预估返回的记录行数
-- 6.mysql只支持一种join算法:Nested-Loop Join(嵌套循环连接),但Nested-Loop Join有三种变种:https://cloud.tencent.com/developer/article/1373839(细节参考)
--     6.1非驱动表走主键索引不用回表,最快,
--     6.2没有所以索引,默认情况下join_buffer_size=256K,在查找的时候MySQL会将所有的需要的列缓存到join buffer当中
--     6.3对s表进行了rn次访问,对数据库开销大
-- select *  from  a  left join b on a.id = b.id left join a.id = c.id,这时是怎么顺序进行执行的呢?
-- 我们得知是a表先和b表进行连接,会生成一张中间临时表,然后这张表的数据再和c表进行连接,最后生成的表的数据就是a left join b left join c 的。
-- EXPLAIN  ALL, index,  range, ref, eq_ref, const, system, NULL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值