在这里主要是分为表设计优化和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语句优化)的更多相关文章

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

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

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

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

  3. 重新学习MySQL数据库12:从实践sql语句优化开始

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a724888/article/details/79394168 本文不堆叠网上海量的sql优化技巧或 ...

  4. SQL语句优化、mysql不走索引的原因、数据库索引的设计原则

    SQL语句优化 1 企业SQL优化思路 1.把一个大的不使用索引的SQL语句按照功能进行拆分 2.长的SQL语句无法使用索引,能不能变成2条短的SQL语句让它分别使用上索引. 3.对SQL语句功能的拆 ...

  5. MySQL常用SQL语句优化

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

  6. 转:sql语句优化

    性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化. 为了获得稳定的执行性能,SQL语句越简单越好.对复杂的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. (三)、LNMP的搭建,并制作rpm包

    中小型规模网站集群架构:yum仓库搭建 : 矮哥linux运维群:93324526 编译的三条命令的规则 ./configure 就是在本地创建了一个Makefile文件 (也就是指定一下各种配置参数 ...

  2. idea插件之——在markdown复制粘贴图片

    Markdown paste image 每次在idea的markdown中要粘贴图片的时候,要么复制链接,要么需要将软件手动上传到七牛云,本人根据了holgerbrandl/pasteimages这 ...

  3. 5th-个人总结(Alpha阶段)

    一. 总结自己的Alpha过程 1.团队的整体情况 在团队中这次担任队长的职务. alpha阶段完成情况还算理想,大家都完成了指定的任务.但是也少不了犯错,一些需求没有划分的足够细致,后来功能完成后发 ...

  4. 团队作业八——第二次团队冲刺(Beta版本)第5天

    团队作业八--第二次团队冲刺(Beta版本)第5天 一.每个人的工作 (1) 昨天已完成的工作 完成界面跳转界面. (2) 今天计划完成的工作 简单模式逻辑代码涉及与相关功能的具体实现 (3) 工作中 ...

  5. 201521123103 《Java程序设计》第三周学习总结

    一.本周学习总结 二.书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; pub ...

  6. Shiro第五篇【授权过滤、注解、JSP标签方式、与ehcache整合】

    授权过滤器测试 我们的授权过滤器使用的是permissionsAuthorizationFilter来进行拦截.我们可以在application-shiro中配置filter规则 <!--商品查 ...

  7. Mybatis第四篇【多表连接】

    Mybatis多表连接 我们在学习Hibernate的时候,如果表涉及到两张的话,那么我们是在映射文件中使用<set>..<many-to-one>等标签将其的映射属性关联起来 ...

  8. JDBC数据库之添加数据

    通过JDBC向数据库中添加数据,可以使用INSERT语句实现插入数据SQL语句,对于SQL语句中的参数可以只用占位符"?"代替,然后通过PreparedStatement对其赋值以 ...

  9. HTTP属性管理器详解

      1)HTTP Cache Manager 2)HTTP Cookie 管理器 3)HTTP 信息头管理器 4)HTTP 授权管理器 5)HTTP 请求默认值 为什么会有这些http属性的配置元件? ...

  10. iOS开发-AFNetworking参数和多文件同时上传【多文件上传】

    1. 前言 在项目开发中,我们经常需要上传文件,例如:上传图片,上传各种文件,而有时也需要将参数和多个文件一起上传,不知道大家的项目中遇到了没有,我在最近的项目中,就需要这样的一个功能:同时上传参数. ...