单表千万数据,搜索条件跨越多表,并发不高,如何优化?
如上图示例:
- 搜索条件跨越多张表(三张或三张以上),条件复杂;
- 单表数据1千万左右;
- 列表数据来源多张表(三张或三张以上);
- 列表分页按时间排序;
- 并发并不是很大;
历史原因:
- 现在不想重构表结构,动的太大;
现在做法:
- 列表(不带搜索条件)只能单表查询,两张表join已经出现时间问题了,然后再独立查询其他表;
- 带搜索并且搜索条件跨越多表的列表,暂时是join查询,30多秒出来数据;
技术栈:LNMP
问题:
因为是做的后台项目,整个系统几乎都是这样类似的页面;
如何优化呢?
或者采用什么技术能解决此场景下的性能瓶颈问题?
多谢各位大神!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(16)
单表千万已经是比较大的数据量了,提几个思路:
1、数据能否归档,如只保留最近3个月数据,将单表的数据量降下来;
2、查询条件限制有必填字段,且这些字段在数据库中有合适的索引;
3、考虑表适当做字段冗余,避免表关联查询;
硬件方面如有条件,表数据文件放到SSD硬盘。
千万级数据
30多秒查询
提供一下几个观点:
SSD
数据层优化:
hash
进行分表,来降低单个表的数据量;join
关联的条件,所建索引是否合适;SQL
优化:现有的SQL
是否存在优化空间?是否能用到索引的,没有用索引?是否只查必要的字段值?SQL
在业务层优化为多条SELECT
结构层优化:
SQL
hash
结果为key
,以查询结果为value
,存入redis
只要join的时候能确保用到被连接表的主键或者唯一索引,其实join并不慢
联查的时候确保用上主键与外键, 建相对应的搜索字段的索引
1.读写分离
2.建立相关的索引字段
3.常用列表页和搜索项建立缓存机制
4.加硬件吧(服务器问题影响很大)。
补充点,排序最好不要用
order by created_at desc
,改用自增主键排序order by id desc
,效果一样,性能差多用搜索引擎吧
仅供参考
有模糊搜索吧?
sphinx
阿里云的话走开放搜索
如果索引做的差不多,但是效果并不是很明显的话,可以使用一些sql的函数替代本身的sql查询,达到sql拆分的目的(exists 替代in查询等),其他的也没有什么太好的建议
ps:作为一个问题的读者,请再具体一下问题的描述,这种描述其实很笼统,没有办法直接定位问题的所在
根据描述其实只能给出比较通用的优化方式,建议给出性能问题比较严峻的表的表结构,以及查询使用的SQL
我也面临过这种环境,会员优惠券单表达到快千万级,像like之类的业务,速度慢就不用说了。常用字段添加索引的方式,起到很大作用;并发使用的业务,最好能够减少对数据表的频繁使用。最好能根据业务分离一下数据。当然,服务器配置的强大,是根本。
“不带搜索条件,两张表join都出现时间问题了”
单表千万,但只要索引合理join也是没有任何性能问题的,这锅不是千万数据量和join的。
多有是你join的字段的索引问题,explain一下那条sql看看,对照着结果优化一下索引。
如果join字段两边已经都是索引,那么就该升配置了
单表千万级数据,是需要开始考虑分表的问题了!
就目前形式快速解决提供我的几个思路:
join
的地方不要用join
(我们都知道多张表使用join是做笛卡尔积的,想象下多恐怖)所以不要用join
,换成单表查刚好也在做这么一个分表改造,我的业务实际比你还复杂,我针对app接口查询维度,分成3类表,并且是每类表都是拆分n个表,这就不细说了,我拆成3类表是为了app查询方便,同时后台聚合列表数据因为实时要求不高,我用搜索引擎来处理