开发直播软件平台,数据表查询优化方案
直播软件开发,业内通常使用Mysql进行数据库方面的开发,以下是云豹科技常用的几种数据表查询优化方案,分享给大家。
方法1:
优化方法:
1. 查询条件调整,把时间查询单独摘出来用TP5新增的whereTime方法,这个方法的作用是专门针对于时间查询的.(演示1: 要是用下演示代码的话,需单独加一个addtime索引)
2. 接口:分页的查询的地方,可以调整一下limit(0,10)方式,一般是limit起始值是个变量,随着传入的页数进行改变,随着起始值的增大,查询的速度会越来越慢,导致响应的时间也会延长.优化:可以采用where条件进行查询,(演示2 )
举例演示:
(1)$list_day=Db::name('user_coinrecord')
->field("uid,sum(totalcoin) as total")
->where(" action in ('1','2') and touid='{$uid}' ")
->whereTime(“addtime”,”between”,[$today_start,$today_end])
->group("uid")
->order("total desc")
->limit($page_nums)
->select()
->toArray();
(2) 第一步:先查出最大的一条数额
$info=DI()->notorm->user_coinrecord
->select('sum(totalcoin) as totalcoin,touid as uid')
->where(‘ addtime >={$dayStart} and addtime<={$dayEnd} and type=0 and action in ('1','2')’)
->group('touid')
->order('totalcoin desc')
->fetchOne();
If(!$info){
$info[‘totalcoin’]=’0’;
}
第二步:在加到查询条件中
$list=DI()->notorm->user_coinrecord
->select('sum(totalcoin) as totalcoin,touid as uid')
->where(‘ addtime >={$dayStart} and addtime<={$dayEnd} and type=0 and action in ('1','2') and totalcoin<={$info['totalcoin']} ’)
->group('touid')
->order('totalcoin desc')
->limit(50)
->fetchAll();
方法2:
优化方法:
1.优化表字段的长度
例如:giftid ,giftcount, totalcoin使用的是int类型,长度为20,字节长度有点太长了,占用资源,可以根据使用情况缩短字节或者可以采用 tinyint 类型.
2.根据查询条件创建索引,最多不要超过6个.
3.主播排行榜控制器(Contribute)中 查询条件是touid ,索引中是uid,索引未生效.
4.为使用order by和group by的字段创建索引.
5.升级服务器配置,使用云数据库.
方法3: (非必要时,不建议采取)
优化方法: 更改MySQL配置文件my.cnf中的配置, Innodb_buffer_pool_size(默认128M)此函数是配置InnoDB缓存池的大小,用于缓存索引、行的数据、自适应哈希索引、插入缓存(Insert Buffer)、锁 还有其他的内部数据结构,最大值不能超过服务器物理内存的80%;
配置注意:
1. 设置不合适或过大,会导致浪费资源,影响数据库性能,导致数据库不能正常运行,重启等操作时,响应时间会过长.
2. 合理的计算公式(仅供参考):
Innodb_buffer_pool_size = 系统可用内存 - 系统正常运行内存 - (峰值时的连接数 * 每个连接需要的内存)若算出的值过大,根据实际情况,压低一下
总结:方法1,2,3 可根据需求和实际情况,逐一配置,也可以一块配置到是不冲突.(仅代表个人想法)
声明:以上内容为云豹科技作者本人原创,未经作者本人同意,禁止转载,否则将追究相关法律责任www.yunbaokj.com