最近新接手公司一个锅,活跃用户在八千左右,但是活跃时间段非常集中,数据量的话,多个表数据在500万以上最多的大概是九百多万的样子,交给我时后台某个列表页面打开需要1.8min,前台排行榜及某些统计页面常年处于数据库请求超时的状态。
因为是基于TP5的项目,在接手后第一时间将一些查询在请求时加了缓存,并将原有的缓存引擎切换为redis,对某些重复的查询有了显著的提高,但是对于一些主要的问题影响不大。以下是一些细节性的问题解决:
1. mysql查询时,where条件里带有大于或小于这些条件时,原本会走range索引,但如果查询(select)的字段里面有未索引字段或者字段索引失效时会导致 range失效
2.对于时间段查询比较频繁的,表分区会有明显提升
3.标签类数据存储,在数据库设计时一定要用字典表形式,千万千万不要逗号分隔存字符串。。。
4.排行榜类型要防止重复查询,目前实现为单进程锁查询后存redis的形式
5.innodb引擎在带有大范围where条件查询时会导致锁表,由于这些表需要事务保证一致性,后面计划用从库改为myisam表的形式(待考虑)
6.除了标签类,某些日志类表可以把用户id等一些无需range的字段做hash索引,效果明显