MySQL视图count速度优化

查看:169
本文介绍了MySQL视图count速度优化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

背景:
程序列表页展示信息,需后台多表关联读取视图,视图内sql已优化(索引、语句),外层增加查询条件后速度基本一致。
VIEW:

CREATE VIEW a
AS
SELECT *
FROM b FORCE INDEX (`idx_b`)
JOIN a ON a.CId = b.Id
JOIN c ON c.CId = b.Id
LEFT JOIN s ON s.No = c.No
LEFT JOIN d ON d.CId = a.Id AND d.EId = c.Id
LEFT JOIN e FORCE INDEX (`idx_e`) ON e.CId = a.Id
WHERE b.isdeleted = 0

环境:
1).mysql 5.7.10 InnoDB引擎 2核4G
2).阿里云RDS 4核8G (貌似效果更差<分片性能会衰减>)
问题:
1.外层增加排序order by条件后,速度变慢,查看执行计划为将试图内数据转化为temp_table后再进行sort;
2.直接count视图的话更加缓慢,已达不能接受地步,列表分页肯定需展示总条数,抛除视图,直接使用sql也是很缓慢。
大神们指点指点怎样优化mysql多表关联的count

解决方案

根据你写的sql语句,有几点建议:
1、b表使用了force index以强制使用索引,在表条目数较多的情况下,索引查询未必是最优的方式,一般情况下让数据库自己选择就可以了。或者自己验证下,用isdeleted = 0的条件查b单表,确认加上force index性能更好,否则就去掉force index。
2、统计数量的sql语句,仅保留a,b,c张表就可以了,其他的几张表是left join,不影响统计结果
3、根据上一步取出的b表字段的主键字段,在php中循环取详情信息。因分页的数量一般较少,多次通过主键取数据的方式速度可能会更快。

另外,如果想让大家分析,最好把sql的执行计划贴出来。

这篇关于MySQL视图count速度优化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆