(一)一个问题引入:mysql数据库优化

在测试的时候录入近千万级的数据,实时的显示历史记录查询出现问题。sql如下所示:

select  * from table_test
    where  date = '2016-01-15'  AND type != 0   ORDER by lottery_date desc   limit 100;

由于这条语句的查询速度较慢导致调用soa dubbo接口的时候超时,所以需要对这条sql进行查询优化。
查询对表table_test的索引:

数据库索引查询

可以看出where条件中,type和date只有date在索引中,且date的Cardinality属性只有18,Cardinality表示散列程度,当Cardinality数值过小时和扫描全表的效率相差不大,且当mysql超过百万级的数据量时性能会下降。
explain 这条sql语句如下图所示:

explain执行sql

所以最终的解决方案是,当数据量过千万级别的时候,就要想法通过其他方式进行 优化,由于需求是需要显示最新的历史数据,所以可以不根据这个字段进行查询,这样在千万级的数据量访问时,就不会出问题。

实际中的数据有90w,查询使用秒数0.734也可以接受啦,为了保证万无一失,减少数据库访问压力,在此基础上加行了缓存,并且设置缓存的时间为5分钟,这样在进行压力测试的时候,对于千万条数据,调用接口的成功率可达到百分之九十九了。

总结:

1 、要在常用查询的字段上建立索引。
2、数据量大时,避免多个表的连接查询。
3、当设置某个字段做索引字段,所以种类越多越好。

由此问题抛砖引出关于mysql的优化先关内容。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值