高性能的大型系统经验 -- 数据查询与分页

     本文讨论针对大型数据表(记录数2千万以上)进行数据查找与分页的可行的高效方案。

     首先,恰当的索引是必须的。

     没有索引的支持,在大数据表中进行查询是不可思议的。关键点在于如何创建索引?

1.建立正确的聚集索引(clustered index)。由于聚集索引的叶子节点就是记录本身,所以选择哪个索引为聚集索引非常关键。通过聚集索引扫描记录更快。

2.根据你的系统的需求总结常用的单个查询条件或综合性的查询条件,对于常用的单个查询条件建立单列索引,对常用的综合性查询条件建立联合索引

3.关于数据库查询引擎如何利用索引,要注意以下几点:

(1)对于单列索引,只要条件列中出现索引列,无论在什么位置,都能利用索引查询。

(2)查询条件中出现联合索引第一列,或者全部,则能利用联合索引。

(3)条件列中只要条件相连在一起,无论前后,都会利用上联合索引。

(4)查询条件中没有出现联合索引的第一列,而出现联合索引的第二列,或者第三列,则都不会利用联合索引查询。 

    

     接下来,我们看如何进行分页。

1.利用索引(或联合索引)将满足条件的记录的主键列INTO到一个临时表(只有一列,与目标表的主键对应)。

2.Count (*) 临时表获取满足条件的记录的总数。

3.从临时表中获取第N页的主键值集合。

4.根据主键值集合从目标表中取出对应的记录以构成所要的Page。

5.释放临时表。      

     按照这种方式进行分页查询,如果满足条件的记录数在几万以内,分页查询都可在1秒内返回。

     最后提醒一句,不要轻易的在大数据表上执行不带条件的Select Count(*) From Table,该操作将非常耗时,而且由于扫描时会在目标表上加S锁,这段期间对目标表的Insert/update/delete操作将被阻塞,从而可能引发Insert/update/delete操作执行超时。 

 

注:本文源于我的SqlServer经验,可能在Oracle中有更好的办法,呵呵:)

时间: 2024-10-03 16:13:06

高性能的大型系统经验 -- 数据查询与分页的相关文章

高性能的大型系统经验 -- 将数据分类、并缓存

    对大多数大型系统而言,数据库往往是最容易出现瓶颈的地方,而通过使用恰当的缓存技术可以非常有效地减轻数据库的负载.          将系统中用到的所有数据进行分类,分别对待不同种类的数据而不是一视同仁,有利于正确地做出缓存哪些数据.以及如何缓存的决策.     我通常将系统中用到的数据分为四类:恒定不变的数据,只发生增量的数据,偶尔改变的数据,经常改变的数据. (1)对于恒定不变的数据,采用普通的恒定缓存,即这种缓存在系统启动后初始化一次就不再改变了. (2)对于只发生增量的数据,采用智

为什么我们要开源自己研发的高性能容器编排系统 Eru2

本文讲的是为什么我们要开源自己研发的高性能容器编排系统 Eru2[编者的话]原则上来说 Eru 只是将 Docker 作为容器最小单元引擎,并不做过强的耦合和依赖.通过架构层面上的设计和优化,使得 Eru 可以支持上千甚至上万台物理机器集群,满足小型到大型公司平台层面的调度编排需求. [烧脑式Kubernetes实战训练营]本次培训理论结合实践,主要包括:Kubernetes架构和资源调度原理.Kubernetes DNS与服务发现.基于Kubernetes和Jenkins的持续部署方案 .Ku

数据查询--SELECT语句

   数据库是为更方便有效地管理信息而存在的人们,希望数据库可以随时提供所需要的数据信息.因此,对用户来说,数据查询是数据库最重要的功能.本章将讲述数据查询的实现方法. 在数据库中,数据查询是通过SELECT 语句来完成的.SELECT 语句可以从数据库中按用户要求检索数据,并将查询结果以表格的形式返回.我们在"Transact-SQL 语言"章节及前面的章节中已经初步接触到了SELECT 语句的一些用法,在本章中将分类讲述其具体用法. 本节讲述SELECT 语句完整的锓ń峁梗馐且桓

开源大数据查询分析引擎现状

引言 大数据查询分析是云计算中核心问题之一,自从Google在2006年之前的几篇论文奠定云计算领域基础,尤其是GFS.Map-Reduce. Bigtable被称为云计算底层技术三大基石.GFS.Map-Reduce技术直接支持了Apache Hadoop项目的诞生.Bigtable和Amazon Dynamo直接催生了NoSQL这个崭新的数据库领域,撼动了RDBMS在商用数据库和数据仓库方面几十年的统治性地位.FaceBook的Hive项 目是建立在Hadoop上的数据仓库基础构架,提供了一

如何设计一个高性能的日志系统

问题描述 如何设计一个高性能的日志系统 需求: 1.系统采用B/S架构,要求能够记录客户端的任何事件,比如单击了某个按钮或者链接: 2.要求能够记录用户每次操作时后台代码使用到的SQL和参数,比如添加数据时的SQL语句和具体的Parameter: 3.将1和2串联或者合并起来,意思就是我在分析日志时,能够在查询客户端事件时也能看到后台的SQL语句和参数: 4.2年内数据达到20亿条记录,采用什么样的数据库比较合适,非关系行的MongoDB还是关系型的Oracle: 解决方案 4.什么数据库都没关

系统 应用 数据缺一不可 云优化三步走

本文讲的是系统 应用 数据缺一不可 云优化三步走,2012年9月13日消息,由盛拓传媒旗下的IT168.ChinaUnix.ITPUB联合主办为期三天(2012年9月13日~2012年9月15日)的第四届中国系统架构师大会于在北京永泰福朋喜来登酒店隆重召开.来自百度.淘宝.腾讯.IBM.新浪.网易.奇虎360等IT巨头的讲师分享了业界最先进的技术经验与趋势. ▲架构师大会更多资讯(请点这里) 在本届系统架构师大会上我们非常激动的看到,对于IT运维来讲已经不再像过去将系统建设.将运维流程.讲技术细

基于NoSQL数据库的大数据查询技术的研究与应用

基于NoSQL数据库的大数据查询技术的研究与应用 朱建生  汪健雄  张军锋 基于NoSQL数据库理论,根据应用场景的不同,将NoSQL数据库分为面向高性能读写.面向文档和面向分布式计算的3种类型.对比分析这3种类型数据库的6种代表产品的优缺点,结合铁路客票实名制售票信息综合分析系统中的大数据操作的需求,选用NoSQL数据库中的面向分布式计算的Cassandra数据库.基于Cassandra数据库,提出铁路客票实名制信息综合分析系统的技术架构,并设计反向索引以构建客票实名制乘车信息的查询策略和查

PHP到MySQL数据查询过程概述

HP层到MySQL层 Php到sql组件层次如下图所示: ext/mysqli和ext/mysql 是客户端的扩展程序库(库函数) ,在客户端脚本层面的扩展库. Mysqli库是mysql库的扩展版本,扩展版本增加了列版定(Bind Column)绑定.PDO (PHP Data Object) 是另外一种面向数据对象的 扩展库.这些扩展库直接面向编程者,而它的底层实现是mysql连接引擎(如mysqlnd和libmysql )(参考 http://bbs.chinaunix.net/threa

运用 ADO.NET 对象优化数据查询代码

ado|对象|数据|优化    毫无疑问,ADO.NET 向人们提供了一种功能强大.仿真数据库的对象模型,它可以将数据记录保存到内存中.尤其是ADO.net 的 DataSet 类,它不但在功能上相当于数据库表的集中存储器(central repository),而且支持表间的各种约束和逻辑关系.进一步说来,DataSet 对象其实是一种离线数据容器.     乍一看,只要把 DataSet 类的所有特性联合起来,就能消除 SQL 查询命令中的复杂子句,比如那些泛滥成灾且层层嵌套的 INNER