之前接手一个数据统计处理的小程序,本来逻辑上并没什么,只是数据量略大,某些表的数据达到了千万级别..因为是统计,所以免不了各种连接各种查询,结果这个小程序写完后运行一次要1个小时..这的确有点出乎意料,所以着手优化一下..

1.添加索引

平时不注意或是数据量比较小的时候可能会忽略这个,加或是不加基本没差别,但是当数据量很大的时候差别就非常明显,没有索引的情况下,在1万条以内和10万条以上的数据中查询所用的时间差别已经能分辨出了.这里有2点需要特别注意:

1)默认情况下我们创建表,数据库会自动给我们添加一个默认索引,但是当采用create table 表名 as select 语句创建表时,数据库是不会自动创建索引的,此时我们需要手动添加索引.

2)哪些字段需要添加索引?那些在我们查询语句中起到桥梁(连接)作用的字段需要添加索引.因为只有在查询条件中包含有索引字段才能享用索引带来的速度提升.

可以说索引是提高查询速度最明显最简单的方法,它可以令一个数分钟的查询在毫秒内完成,效率提升不是一点半点..

2.缩小查询集合

既然是查询,那一定有要查询的集合,也就是 from 后面的集合.如果能缩小这个集合,那么查询遍历一遍的时间也会缩减不少,整体的查询时间自然会减少.主要有几个手段:

1)创建临时查询表.如果一个表的数据量很大,而我们只在其中满足某些特定条件的数据集合中查询,那么我们完全可以首先从这个表中查询出所有满足特定条件的数据集合并创建成一个表,典型应用就是create table xx as select XX where xx ,这样我们就得到一个比原始表小很多的临时表,之后的所有查询工作都从这张新表中进行即可..

2)优化查询语句顺序.where后的条件语句是从右向左执行的,所以我们可以把能排除掉更多数据的条件放到最右面,这样执行后余下的数据集合会更小,接下来的条件查询也就更快.同一思想,当我们采用子查询的时候,让某些子查询排除掉更多的数据也会让整体效率提高.

3)去重,去重本来是一个比较耗时的操作,但是如果某个集合是反复被使用的,那么对这个集合进行去重处理也会带来效率的提升.

经过优化后那个小程序在5分钟内就执行完毕..可见sql语句的优化带来的提升还是很可观的..当然由于我这个小程序一开始就处理的不是太好,所以优化后提升很多,但是这也说明,如果注意sql语句的优化,在程序的处理时候就多加注意的话,一定程度上能避免不少性能问题..

2014年小结之sql语句优化的更多相关文章

  1. sql语句优化原理

    前言 网上有很多关于sql语句优化的文章,我这里想说下为什么这样...写sql语句,能够提高查询的效率. 1 sql语句优化原理 要想写出好的sql,就要学会用数据库的方式来思考如何执行sql,那么什 ...

  2. 优化数据库的方法及SQL语句优化的原则

    优化数据库的方法: 1.关键字段建立索引. 2.使用存储过程,它使SQL变得更加灵活和高效. 3.备份数据库和清除垃圾数据. 4.SQL语句语法的优化.(可以用Sybase的SQL Expert,可惜 ...

  3. oracle之sql语句优化

    oracle之sql语句优化 sql语句的优化 1.在where子句中使用 is null 或 is not null 时,oracle优化器就不能使用索引了. 2.对于有连接的列,即使最有一个是静态 ...

  4. 数据库 基于索引的SQL语句优化之降龙十八掌(转)

    一篇挺不错的关于SQL语句优化的文章,因不知原始出处,故未作引用说明! 1 前言      客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急 ...

  5. 数据库的优化(表优化和sql语句优化)

    在这里主要是分为表设计优化和sql语句优化两方面来实现. 首先的是表设计优化: 1.数据行的长度不要超过8020字节.如果是超过这个长度的话这条数据会占用两行,减低查询的效率. 2.能用数字类型就不要 ...

  6. MySQL常用SQL语句优化

    推荐阅读这篇博文,索引说的非常详细到位:http://blog.linezing.com/?p=798#nav-3-2 在数据库日常维护中,最常做的事情就是SQL语句优化,因为这个才是影响性能的最主要 ...

  7. 浅谈mysql配置优化和sql语句优化【转】

    做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...

  8. sql语句优化总结

    sql语句优化总结 数据库优化的几个原则: 1.尽量避免在列上做运算,这样会导致索引失败: 2.使用join是应该用小结果集驱动大结果集,同时把复杂的join查询拆分成多个query.不然join的越 ...

  9. MySQL基础操作&&常用的SQL技巧&&SQL语句优化

    基础操作     一:MySQL基础操作         1:MySQL表复制             复制表结构 + 复制表数据             create table t3 like t ...

随机推荐

  1. asp.net学习之Repeater控件

    asp.net学习之Repeater控件 文章摘自:http://www.cnblogs.com/shipfi/archive/2009/10/19/1585703.html Repeater控件和D ...

  2. C#的Raw Socket实现网络封包监视

    同Winsock1相比,Winsock2最明显的就是支持了Raw Socket套接字类型,使用Raw Socket,可把网卡设置成混杂模式,在这种模式下,我们可以收到网络上的IP包,当然包括目的不是本 ...

  3. Android开发总是难以入门

    发现自己很难入门,是真的太难,还是自己主观拒绝.

  4. String系列

    String 简介 String 是java中的字符串,它继承于CharSequence.String类所包含的API接口非常多.为了便于今后的使用,我对String的API进行了分类,并都给出的演示 ...

  5. EffectiveJava——复合优先于继承

    继承时实现代码重用的重要手段,但它并非永远是完成这项工作的最佳工具,不恰当的使用会导致程序变得很脆弱,当然,在同一个程序员的控制下,使用继承会变的非常安全.想到了很有名的一句话,你永远不知道你的用户是 ...

  6. 《JAVA与模式》之组合模式

    定义(GoF<设计模式>): 将对象组合成树形结构以表示“部分整体”的层次结构.组合模式使得用户对单个对象和使用具有一致性. 及角色: 1.Component 是组合中的对象声明接口,在适 ...

  7. python flask应用部署

    失败版本:flask+uwsgi ini配置文件 [uwsgi] callable = app ;//程序内启用的application变量名 home = /home/jcuan/code/pyth ...

  8. ArrayList,Hashtable,List<T>,Dictionary<K,V>

    1.ArrayList ArrayList list = new ArrayList(); //for遍历 ; i < list.Count; i++) { SE se=(SE)list[i]; ...

  9. 【iOS】Quartz2D图形上下文

      一.绘图的完整过程 程序启动,显示自定义的view.当程序第一次显示在我们眼前的时候,程序会调用drawRect:方法,在里面获取了图形上下文(在内存中拥有了),然后利用图形上下文保存绘图信息,可 ...

  10. [翻译]:SQL死锁-阻塞

    一般情况下死锁不是一步到位的,它必须满足特定的条件,然后形成资源的循环依赖才会产生死锁,死锁之前一定会出现阻塞,由阻塞升级才有可能出现死锁,所以我们有必要了解系统中都有哪些已经被阻塞的锁. 我在解决共 ...