数据库的优化(表优化和sql语句优化)
在这里主要是分为表设计优化和sql语句优化两方面来实现。
首先的是表设计优化:
1.数据行的长度不要超过8020字节。如果是超过这个长度的话这条数据会占用两行,减低查询的效率。
2.能用数字类型就不要用字符串类型。字符串类型的会降低查询的效率并且增加存储。因为引擎在进行查询的的时候会逐个的比较字符串中 的每一个字符,而对应的数值类型的只需要比较一次就可以了。
3.对于不可变字符类型 char 和可变字符类型 varchar 都是 8000 字节,char查询快,但是耗存储空间,varchar 查询相对慢一些但是节省存储空间。在设计字段的时候可以灵活选择,例如用户名、密码等长度变化不大的字段可以选择CHAR,对于评论等长度变化大的字段可以选择 VARCHAR。
4.字段在满足要求的情况下尽量的短一些,这样可以提高查询效率,并且在建立索引的时候可以减少资源的消耗。
查询的优化:就是尽量的避免全表查询
1.应该尽量避免在where条件里面进行null的判断,这样会查询的时候放弃索引而进行全表查询
2.应该尽量避免在where字句中使用!=,<,>这些符号,否则的话就会放弃使用索引而进行全表扫描。这是因为优化器无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。
3.应该尽量的避免在where子句中使用or来连接条件,否则会导致放弃使用索引而进行全表扫描。
例如:
select username from user where id=10 or id=20;
应该改为:
select username from user where id=10
union all
select username form user where id=20;
4.in 和not in也要慎用。因为in会使系统无法使用索引,而只能直接搜索表中的数据。
如(这是对应与连续的值来说的):
select username from user where id in (1,2);
应该改为:
select username from user where id between 1 and 2; .
5. 尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。
见如下例子:
1. Select * FROM T1 Where NAME LIKE ‘%L%’
2. Select * FROM T1 Where SUBSTING(NAME,2,1)=’L’
3. Select * FROM T1 Where NAME LIKE ‘L%’
即使 NAME 字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎
不得不对全表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快
操作。
6.必要时强制查询优化器使用某个索引,如在 where 子句中使用参数,也会导致全表扫描。因为 SQL 只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num.
7.应该尽量避免在where字句中对字段进行表达式操作,这将导致放弃索引而使用全表扫描。
select * from user where math/2=45;
应该改为:
select * from user where math=45*2;
也就是任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
8.应尽量避免在 where 子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
9.不要在where字句的“=” 左边进行函数,算术运算或者其他表达式运算,否则系统无法正确使用索引。
10.在使用索引作为字段条件时,如果是复合索引,那么必须使用该索引中的第一个字段作为条件才能保证系统使用该索引,否则该索引是不会被使用的,并且尽可能的让字段顺序与索引顺序相一致。
11.使用exists替代in
1. elect num from a where num in(select num from b)
select num from a where exists(select 1 from b where num=a.
num)
12.避免使用不兼容的数据类型。例如float 和int、char 和varchar、binary和 varbinary 是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。
13.能用 UNION ALL 就不要用 UNIONUNION ALL 不执行 Select DISTINCT 函数,这样就会减少很多不必要的资源。
14.尽量不要用 Select INTO 语句。Select INOT 语句会导致表锁定,阻止其他用户访问该表。
2017-10-16
数据库的优化(表优化和sql语句优化)的更多相关文章
- 优化数据库的方法及SQL语句优化的原则
优化数据库的方法: 1.关键字段建立索引. 2.使用存储过程,它使SQL变得更加灵活和高效. 3.备份数据库和清除垃圾数据. 4.SQL语句语法的优化.(可以用Sybase的SQL Expert,可惜 ...
- 数据库 基于索引的SQL语句优化之降龙十八掌(转)
一篇挺不错的关于SQL语句优化的文章,因不知原始出处,故未作引用说明! 1 前言 客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急 ...
- 重新学习MySQL数据库12:从实践sql语句优化开始
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a724888/article/details/79394168 本文不堆叠网上海量的sql优化技巧或 ...
- SQL语句优化、mysql不走索引的原因、数据库索引的设计原则
SQL语句优化 1 企业SQL优化思路 1.把一个大的不使用索引的SQL语句按照功能进行拆分 2.长的SQL语句无法使用索引,能不能变成2条短的SQL语句让它分别使用上索引. 3.对SQL语句功能的拆 ...
- MySQL常用SQL语句优化
推荐阅读这篇博文,索引说的非常详细到位:http://blog.linezing.com/?p=798#nav-3-2 在数据库日常维护中,最常做的事情就是SQL语句优化,因为这个才是影响性能的最主要 ...
- 转:sql语句优化
性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化. 为了获得稳定的执行性能,SQL语句越简单越好.对复杂的SQL语句,要设 ...
- 浅谈mysql配置优化和sql语句优化【转】
做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...
- sql语句优化总结
sql语句优化总结 数据库优化的几个原则: 1.尽量避免在列上做运算,这样会导致索引失败: 2.使用join是应该用小结果集驱动大结果集,同时把复杂的join查询拆分成多个query.不然join的越 ...
- MySQL基础操作&&常用的SQL技巧&&SQL语句优化
基础操作 一:MySQL基础操作 1:MySQL表复制 复制表结构 + 复制表数据 create table t3 like t ...
随机推荐
- EIGRP系统复习【转载】
EIGRP理论 简介 EIGRP是Cisco私有协议,它是由距离矢量和链路状态两种路由协议混合而成的一种协议.即像距离矢量协议那样,EIGRP从它的相邻路由器那里得到更新信息:也像链路状态协议那样,保 ...
- js中防止全局变量被污染的方法
(function ($){ var oDiv = $('div1');//获取id为'div1'的页面元素 })(function $(id){ return document.getElement ...
- GUI(国际象棋棋盘)
package com.niit.javagui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridB ...
- [转载] java中静态代码块的用法 static用法详解
一.java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序 ...
- 201521123103 《Java学习笔记》 第七周学习总结
一.本周学习总结 1.以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 二.书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码如下: pub ...
- 201521123079《java程序设计》第7周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boo ...
- Linux如何设置dns
首先打开dns设置文档 空的dns文档如图所示 键入图片中的文本保存即可设置了自己的dns 保存后推出即可.
- 从instr中截取第一个delimiter之前的内容放到outstr中,返回第一个delimiter之后的位置
从instr中截取第一个delimiter之前的内容放到outstr中,返回第一个delimiter之后的位置 char *msstrtok(char *instr, char *outstr, ch ...
- Shiro第二篇【介绍Shiro、认证流程、自定义realm、自定义realm支持md5】
什么是Shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权限框架,它和sp ...
- Linux硬链接软连接
转载原文出处:http://www.cnblogs.com/itech/archive/2009/04/10/1433052.html 1.Linux链接概念 Linux链接分两种,一种被称为硬链接( ...