关于MySQL百万级数据量查询的优化(PHP版)
最近在开发一个销售数据统计的网站时,客户提供的数据量在百万级以上,这些数据作为基础数据,从中提取,组合出各种类型的字段进行计算汇总,之前没有遇到过这么大的数据量。开始只是用最普通的方法来查询,当测试数据有19万条的时候,整个查询数据异常的慢,完全查询的汇总甚至要两分多,自此开始了各种优化。
1. 程序的优化
以最简单的一张表,需要汇总计算出二十多种数据,查询条件就是上传数据的日期,一开始打算用for,每个数据汇总都用一遍for,当计算到第三个数据,直接就崩了,所以只好构建一个复杂的算法,将二十多种数据的查询全部放在一起,时间复杂度立马降低,但全部查询仍需要2分钟,然后减少数据表查询结果获取到的字段数,尽量只要关键的几个。但这些,都无太大卵用
2. 最关键的到了,优化数据库,
1. 我首先将数据表的字段大小都进行了修改,以前都是用默认的char(255),现在全部根据大小改到varchar(20),关于char和varchar的区别网上有很多说法,这里不进行叙述,
2. 还有能用数字就不用字符,因为MySQL中数字只对比一次,而字符串会一个一个的对比,
3. 删除掉包含汉字的字段,尽量使用id代替,
4. 为某个经常查询的字段设置索引
经过这些优化,速度提升很多了,我在查看网上方法的时候发现,越来mysql的查找是从头开始找,越在后面的数据,查找到的时间用的就越长,这个我测试了一下,查询第三天的要2秒,第五天的就4秒,所以我想出一个新的办法,每次上传数据时记录下起始位置,查找的时候直接去指定位置查,简直一查就准,第五天的数据0秒查完,简直是无敌的方法,但它也有局限性,数据最好固定,不然会打破位置范围造成数据丢失。下面是我测试的结果
300天的数据(包含9天有效的):2分22秒
10天的数据(包含9天有效的):26秒
优化sql字段大小类型后,10天的数据(包含9天有效的):24秒
优化sql字段大小类型后,300天的数据(包含9天有效的):51秒
加索引后的300天数据:2分28秒
优化sql字段大小类型后,加索引后的300天数据:26秒
优化sql字段大小类型后,加索引后的10天数据:24秒
优化sql字段大小类型后,加索引后,指定查找的位置,查找某一天数据,0秒,原本两秒,不加索引,不优化4秒