近来面试找工作经常会遇见这种问题: 做过数据库优化吗?大数据量基础过吗?系统反应慢怎么查询?

  这咱也没背过啊,面试还老问,现在的网站主要的压力都来自于数据库,频繁的数据库访问经常会使系统瘫痪,这样就需要进行sql优化。明天去58面试,今天来梳理一下。

1. 写明查询具体某几列,减少*的使用,表名过长时,尽量使用表的别名

  *和列名一样

2,在业务密集的SQL当中尽量不采用IN操作符,用EXISTS 方案代替。

  in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。

  in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。

3、模糊查询like,尽量少用%
  关键词%yue%,由于yue前面用到了“%”,因此该查询必然走全表扫描,除非必要,否则不要在关键词前加%,

4, 二者都能使用尽量使用where (与having比较)
  where 先过滤(数据就少了)再分组  
5,尽量使用多表连接(join)查询(避免子查询)

  子查询效率特别低,而一般的子查询都可以由关连查询来实现相同的功能,关联查询的效率要提高很多,所以建议在数据查询时避免使用子查询(尤其是在记录很多时),而最好用关联查询来实现。

6,建立索引

  较频繁地作为查询条件的字段,唯一性不太差的字段适合建立索引,更新不太频繁地字段适合创建索引,不会出现在where条件中的字段不该建立索引

7,多使用内部函数提高SQL效率

  例如多用concat连接,代替'||' 的符号连接

8,应尽量避免在 where 子句中使用 != 或 <> ,in 或 not in

  最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库 (不然会进行全表扫描,影响效率)

9,尽可能的使用 varchar/nvarchar 代替 char/nchar (节省字段存储空间)

最新文章

  1. python 培训之 装饰器
  2. POJ 1837 DP
  3. 关于拦截器实现日志存储到db的代码调试
  4. nyoj 68 三点顺序
  5. jsp中页面间传汉字参数转码
  6. struts2,hibernate,spring整合笔记(1)
  7. DDD领域驱动设计仓储Repository
  8. linux无法解析主机地址(could not resolve host)解决办法
  9. centos下美团sql优化工具SQLAdvisor的安装
  10. 最新swift4.0 图片进行尺寸大小及体积压缩
  11. TortoiseSVN设置忽略文件和目录文件夹
  12. Excel技巧--巧用分列功能整理日期格式
  13. HDU 6214.Smallest Minimum Cut 最少边数最小割
  14. hive orc update
  15. Windows-universal-samples学习笔记系列四:Data
  16. java时区转化相关工具方法
  17. 智能引导式报错(Class file name must end with .class)
  18. android 自己定义视频播放器之2/1
  19. c++模板与泛型编程基础
  20. Android Studio 学习笔记1.1 创建自己的第一个安卓项目并且打包APK

热门文章

  1. MySQL防止重复插入唯一限制的数据 4种方法
  2. Jafka Broker代码阅读之总览
  3. db2 设置表 not null
  4. 蓝桥杯 第三届C/C++预赛真题(6) 大数乘法(数学题)
  5. 【转】MySQL常用命令总结
  6. JavaScript文件操作(1)-基础
  7. session和cookie的联系与区别
  8. Android无线测试之—KEYCODE键值对应大全
  9. 54、Android 粒子效果之雨(下雨的效果)
  10. boost::interprocess::shared_memory_object(1)(基本类型)