分页场景SQL如何优化
2016-01-04 23:03
253 查看
分页取数方式
在 数据仓库中有一个重要的基础步骤,就是对数据进行清洗。比如数据源的数据如果以JSON方式存储,在mysql的数据仓库就必须将json中需要的字段提 取出来,做成单独的表字段。这个步骤用sql直接处理很麻烦,所以可以用主流编程语言(比如java)的json库进行解析。解析的时候需要读取数据,一 次性读取进来是不可能的,所以要分批读取(相当于分页了)。
最初的实现方式就是标记住每次取数据的偏移量,然后一批批读取:
这样的代码,在开始几句sql的时候执行速度还行,但是到后面会越来越慢,因为每次要读取大量数据再丢弃,其实是一种浪费。
高效的实现方式,可以是用表中的主键进行分页。如果数据是按照主键排序的,那么可以是这样(这么做是要求主键的取值序列是连续的。假设主键的取值序列我们比较清楚,是从10001-1000000的连续值):
就算数据不是按主键排序的,也可以通过限制主键的范围来分页。这样处理的话,主键的取值序列不连续也没有太大问题,就是每次拿到的数据会比理想中的少一些,反正是用在数据处理,不影响正确性:
这样的话,由于主键上面有索引,取数据速度就不会受到数据的具体位置的影响了。
在 数据仓库中有一个重要的基础步骤,就是对数据进行清洗。比如数据源的数据如果以JSON方式存储,在mysql的数据仓库就必须将json中需要的字段提 取出来,做成单独的表字段。这个步骤用sql直接处理很麻烦,所以可以用主流编程语言(比如java)的json库进行解析。解析的时候需要读取数据,一 次性读取进来是不可能的,所以要分批读取(相当于分页了)。
最初的实现方式就是标记住每次取数据的偏移量,然后一批批读取:
这样的代码,在开始几句sql的时候执行速度还行,但是到后面会越来越慢,因为每次要读取大量数据再丢弃,其实是一种浪费。
高效的实现方式,可以是用表中的主键进行分页。如果数据是按照主键排序的,那么可以是这样(这么做是要求主键的取值序列是连续的。假设主键的取值序列我们比较清楚,是从10001-1000000的连续值):
就算数据不是按主键排序的,也可以通过限制主键的范围来分页。这样处理的话,主键的取值序列不连续也没有太大问题,就是每次拿到的数据会比理想中的少一些,反正是用在数据处理,不影响正确性:
这样的话,由于主键上面有索引,取数据速度就不会受到数据的具体位置的影响了。
相关文章推荐
- Mysql Cluster集群错误“table is full”
- 数据库三范式
- 完全卸载MySQL
- MySQL ERROR 1698 (28000) 错误
- 跟我学习dubbo-ZooKeeper注册中心安装(2)
- mysql 中去除字段内容中指定内容的方法的方法
- oracle新建表空间和用户
- 基于Redis的消息队列php-resque
- **Oracle Client+PL SQL 使用配置**
- SQL多表连接查询
- oracle获取列的备注和数据类型
- Oracle学习之sql共享以及4031解决方法
- 关系型数据库管理系统简介
- SQL--Order By
- SQL 安装时报html help 1.32 update error
- 数据库学习第一天
- Oracle之存储过程
- SQL--空值处理
- 邮件系统服务器搭建记录(一)(Postfix+Cyrus-sasl+Courier-authlib+Dovecot+ExtMail+MySQL)
- 企业生产MySQL主从同步配置