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

来源:互联网 发布:能量矩阵 编辑:程序博客网 时间:2024/06/01 10:37

在测试的时候录入近千万级的数据,实时的显示历史记录查询出现问题。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 0
原创粉丝点击