在测试的时候录入近千万级的数据,实时的显示历史记录查询出现问题。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语句如下图所示:
所以最终的解决方案是,当数据量过千万级别的时候,就要想法通过其他方式进行 优化,由于需求是需要显示最新的历史数据,所以可以不根据这个字段进行查询,这样在千万级的数据量访问时,就不会出问题。
实际中的数据有90w,查询使用秒数0.734也可以接受啦,为了保证万无一失,减少数据库访问压力,在此基础上加行了缓存,并且设置缓存的时间为5分钟,这样在进行压力测试的时候,对于千万条数据,调用接口的成功率可达到百分之九十九了。
总结:
1 、要在常用查询的字段上建立索引。
2、数据量大时,避免多个表的连接查询。
3、当设置某个字段做索引字段,所以种类越多越好。由此问题抛砖引出关于mysql的优化先关内容。