数据库学习进阶一
来源:互联网 发布:php curl 大文件 编辑:程序博客网 时间:2024/04/30 22:03
一:问题的产生:
在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提高系统的可用性。
原因分析
主要原因1:后台数据库中的数据过多,没做数据优化导致后台查询数据很慢
次要原因2:前端数据请求-解析-展示过程处理不当
次要原因3:网络问题所致
那么我们应该怎么做后台数据优化呢?
1、缓存,在持久层或持久层之上做缓存
使用ehcache缓存,这个一般用于持久层的缓存,提供持久层、业务层的快速缓存,hibenate默认使用的二级缓存就是ehcache;
2、数据库表的大字段剥离
假如一个表的字段数有100多个,学会拆分字段,保证单条记录的数据量很小;
3、恰当地使用索引
必要时建立多级索引,分析MySQL的执行计划,通过表数据统计等方式协助数据库走正确的查询方式,该走索引就走索引,该走全表扫描就走全表扫描;
4、表的拆分
表分区和拆分,无论是业务逻辑上的拆分(如一个月一张报表、分库)还是无业务含义的分区(如根据ID取模分区);
5、字段冗余
减少跨库查询和大表连接操作;,数据通过单个或多个JOB生成出来,减少实时查询;
6、从磁盘上做文章
数据存放的在磁盘的内、外磁道上,数据获取的效率都是不一样的;
7、放弃关系数据库的某些特性
引入NoSQL数据库;
换种思路存放数据,例如搜索中的倒排表;
在上面谈到数据库查询速度优化方案我们讲到了,数据优化的几种方案。接下来,一起看如何实际到具体的操作上.也就是我们在写数据时我们应该注意些什么?
1、对查询进行优化,应尽可能避免全表扫描
首先应考虑在 where 及 order by 涉及的列上建立索引。
下面我们来以一个表中177条数据比较一下,全表扫描与建立索引之后性能的一个比较.
1.1 全表查询
select * from table
1.2 建立索引查询
select * from table where pay = 1 and order by enter
1.3 结论
从这两种方式查询数据库结果看,建立索引之后查询速度提高了些,现在数据量还不明显,如果表中有10万条速度,差异就会很明显了.
2、写数据语句时尽可能减少表的全局扫描
2.1 减少where 字段值null判断
select * from table where pay_status = null;
如何这样做,就会导致引擎放弃使用索引而进行全表扫描
应该这样去设置(也就是在没有值时,我们在存数据库时自动默认给个o值,而不是什么都不写):
select * from table where pay_status = 0;
2.2 应尽量避免在 where 子句中使用!=或<>操作符
select * from table where pay_status != 0;select * from table where pay_status <> null;
这样写将导致引擎放弃使用索引而进行全表扫描。
2.3 应尽量避免在 where 子句中使用 or 来连接条件
select * from table where pay_status != null or entertime = null;
这样将导致引擎放弃使用索引而进行全表扫描
可以这样操作:
select * from table where pay_status != null union allselect * from table where entertime = null;
2.4 in 和 not in 也要慎用
select * from table where rowed in [1,2,3,4];或者select * from table where rowed not in [1,2,3,4];
这样操作,也会导致全表扫描
select * from table where rowed between 1 and 5;
2.5 少使用模糊匹配like
select * from table where entertime like '%2016-09-08%';
2.6 尽量避免在where子句中对字段进行表达式操作
select * from table where rowed/4 = 100
这样写将导致引擎放弃使用索引进行全盘扫描
select * from table where rowed = 4*100
任何时候都不要用通配符去查询所有
以通配符*去查询所有数据,这样做也是非常耗时的,我们应该需要什么字段就查询什么字段.
- 数据库学习进阶一
- Lua学习进阶一
- Android_Fragment 学习进阶(一)
- Spring进阶学习一
- jaee学习进阶一
- 8.5 js进阶学习一
- Fragment学习进阶<一>-------静态
- python学习进阶(一)
- Hibernate进阶学习(一)
- JavaScript进阶学习(一)
- PHP进阶学习之session写入数据库
- android学习笔记(19)数据库sqlite进阶
- 以Oracle数据库为目标的数据库进阶(一)
- struts 2学习进阶 初识struts2(一)
- 前端进阶学习之路(一)
- Android进阶学习笔记(一) ---- 前言
- 深度学习之TensorFlow进阶教程一
- Python进阶学习笔记(一)
- Java编程思想笔记(一)——static
- android studio 符号大全
- 自定义底部显示并没有标题栏的Dialog
- JSP基础---java server page
- Leetcode 461 Hamming Distance
- 数据库学习进阶一
- linux下包监控程序[C语言]
- c++ 数据结构 字符串的自定义类 (文章最后解释了KMP算法)
- 算法题整理
- 第一章 Single Threaded Execution
- 【知其所以然】-对链接的思考
- 从零开始,深度学习(一)
- 周期信号的傅里叶级数表示
- lintcode,全排列