mysql索引的失效和解决方案

问题场景:

今天在公司遇到一个紧急的bug,弄了很久,请教了公司的大神,各种实验才解决这个问题。
这个bug就是查询一个月已完成的订单,查询订单系统超时,我开始大致查了下,原因就是数据量太大了导致查询时间过长超过了30s。
先说说我这个项目的数据量级一天两万单,一个月是六十多万订单,项目运行一年多,表里大概是五百多万条订单。
于是我开始优化,很多人说优化sql,没错我开始也这么想,可是我看了下sql是多条件多表连接的查询,发现很难优化,表里该加的索引都加了,有人也会说分表分库,但是我这个数据量级感觉还没到这种程度。
下面说解决方案,问了下公司的大神,然后他告诉我,把原来的分页查询分两个接口查询,前端展示的表格数据一个接口不分页查询数据库一页数据比如十条,另外一个接口返回订单总数,果然这样优化之后发现会快很多。
然后后面又发现一个问题,就是这个总数出不来,由于这个总数是带查询条件多表查询的,数据量又比较大,总数出不来,又去请教大神,感觉自己是个渣渣,公司大神查了下原因说是服务器的原因,因为公司另外一个项目订单量达到了每月三百万,表里数据达到亿级别,能查询一两个月的订单没有问题,我这个项目用的是腾讯云,那个项目用的是阿里云,
后来在深入查了下原因,explain查询sql的执行计划,对比发现,阿里云查询一个月的订单数用了查询条件的索引,而腾讯云没用索引是all,发现是腾讯云的服务器很垃圾数据量到一定程度就不用索引了但是又没超过30%,真的很垃圾必须吐槽一下,阿里云这点优化就很好,查两个月也没问题速度也可以。
下面说说这个问题的解决方案
没加索引只能强制加索引把你要查询的那个字段强制使用索引,果然加上去后,不仅不超时而且速度很快,但是查询两个月的就比较慢了,服务器硬件原因,不过算是满足了当前需求,解决了这个bug。

**

强制使用索引

**

FORCE INDEX(ADDTIME)

多表强制使用索引

SELECT COUNT(1) FROM tra_1 AS d 
INNER JOIN tra_2 AS l FORCE INDEX(ADDTIME) ON d.id = l.id 
LEFT JOIN tra_3 AS tpr ON tpr.orderid = l.id
WHERE  l.isvalid = 1 AND
d.isvalid = 1  AND l.addtime >= 1561910400000 AND  l.addtime <= 1564588799999
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值