SQL语句优化

1 企业SQL优化思路

  1、把一个大的不使用索引的SQL语句按照功能进行拆分

  2、长的SQL语句无法使用索引,能不能变成2条短的SQL语句让它分别使用上索引。

  3、对SQL语句功能的拆分和修改

  4、减少“烂”SQL由运维(DBA)和开发交流(确认),共同确定如何改,最终由DBA执行

  5、制定开发流程

2 不适合走索引的场景

  1、唯一值少的列上不适合建立索引或者建立索引效率低。例如:性别列

  2、小表可以不建立索引,100条记录。

  3、对于数据仓库,大量全表扫描的情况,建索引反而会慢

3 查看表的唯一值数量

select count(distinct user) from mysql.user;
select count(distinct user,host) from mysql.user;

4 建立索引流程

  1、找到慢SQL。

show processlist;

    记录慢查询日志。

  2、explain select句,条件列多。

  3、查看表的唯一值数量:

select count(distinct user) from mysql.user;
select count(distinct user,host) from mysql.user;

    条件列多。可以考虑建立联合索引。

  4、建立索引(流量低谷)

force index

  5、拆开语句(和开发)。

  6、like '%%'不用mysql

  7、进行判断重复的行数

查看行数:

mysql> select count(*) from city;
+----------+
| count(*) |
+----------+
| 4079 |
+----------+
1 row in set (0.00 sec)

查看去重后的行数:

mysql> select count(distinct countrycode) from city;
+-----------------------------+
| count(distinct countrycode) |
+-----------------------------+
| 232 |
+-----------------------------+
1 row in set (0.00 sec)

mysql不走索引的原因

1 一些常见的原因

  1) 没有查询条件,或者查询条件没有建立索引

  2) 在查询条件上没有使用引导列

  3) 查询的数量是大表的大部分,应该是30%以上。

  4) 索引本身失效

  5) 查询条件使用函数在索引列上,或者对索引列进行运算,运算包括(+,-,*,/,! 等)

    错误的例子:select * from test where id-1=9; 正确的例子:select * from test where id=10;

  6) 对小表查询

  7) 提示不使用索引

  8) 统计数据不真实

  9) CBO计算走索引花费过大的情况。其实也包含了上面的情况,这里指的是表占有的block要比索引小。

  10)隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误.

    由于表的字段tel_num定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给数据库,这样会导致索引失效.

      错误的例子:select * from test where tel_nume=13333333333;

      正确的例子:select * from test where tel_nume='13333333333';

  11) 注意使用的特殊符号

    1,<>  ,!=

      2,单独的>,<,(有时会用到,有时不会)

  12)like "%_" 百分号在前.

      select * from t1  where name like 'linux培训%';

  13) not in ,not exist.

  14)  in  尽量改成 union 。

  15)当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。

  16)B-tree索引is null不会走,is not null会走,位图索引 is null,is not null 都会走 。

  17)联合索引 is not null 只要在建立的索引列(不分先后)都会走,

  in null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时,其他建立索引的列可以是is null(但必须在所有列 都满足is null的时候),或者=一个值;

  当建立索引的第一位置是=一个值时,其他索引列可以是任何情况(包括is null =一个值),以上两种情况索引都会走。其他情况不会走。

2 需要注意的一些

1)    MyISAM 存储引擎索引键长度总和不能超过1000 字节;
2) BLOB 和TEXT 类型的列只能创建前缀索引;
3) MySQL 目前不支持函数索引;
4) 使用不等于(!= 或者<>)的时候MySQL 无法使用索引;
5) 过滤字段使用了函数运算后(如abs(column)),MySQL 无法使用索引;
6) Join 语句中Join 条件字段类型不一致的时候MySQL 无法使用索引;
7) 使用LIKE 操作的时候如果条件以通配符开始( '%abc...')MySQL 无法使用索引;
8) 使用非等值查询的时候MySQL 无法使用Hash 索引;
9) 在我们使用索引的时候,需要注意上面的这些限制,尤其是要注意无法使用索引的情况,因为这很容易让我们因为疏忽而造成极大的性能隐患。

数据库索引的设计原则

  为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引。

1 那么索引设计原则又是怎样的

1.选择唯一性索引

  唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。

  例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。

2.为经常需要排序、分组和联合操作的字段建立索引

  经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。

如果为其建立索引,可以有效地避免排序操作。

3.为常作为查询条件的字段建立索引

  如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,

  为这样的字段建立索引,可以提高整个表的查询速度。

4.限制索引的数目

  索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。

5.尽量使用数据量少的索引

  如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR(100)类型的字段进行全文检索需要的时间肯定要比对CHAR(10)类型的字段需要的时间要多。

6.尽量使用前缀来索引

  如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。

7.删除不再使用或者很少使用的索引

  表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。

8.小表不应建立索引

  包含大量的列并且不需要搜索非空值的时候可以考虑不建索引

SQL语句优化、mysql不走索引的原因、数据库索引的设计原则的更多相关文章

  1. MYSQL SQL语句优化

    1.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单的示例,标注(1.2.3.4.5)我们要重点关注的数据: type列,连接类型.一个好的SQL语句至少要 ...

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

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

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

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

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

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

  5. MySQL常用SQL语句优化

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

  6. SQL语句优化 -- 以Mysql为例

     本文参考下面的文章:    1: [真·干货]MySQL 索引及优化实战 2:  Mysql语句的执行过程 3:  sql优化的几种方法 我将  sql语句优化分为三个方面,(此处不包括 业务逻辑的 ...

  7. 自制小工具大大加速MySQL SQL语句优化(附源码)

    引言 优化SQL,是DBA常见的工作之一.如何高效.快速地优化一条语句,是每个DBA经常要面对的一个问题.在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤.然而这些步骤重复性的执行,又 ...

  8. mysql的sql语句优化方法面试题总结

    mysql的sql语句优化方法面试题总结 不要写一些没有意义的查询,如需要生成一个空表结构: select col1,col2 into #t from t where 1=0 这类代码不会返回任何结 ...

  9. php面试专题---MySQL常用SQL语句优化

    php面试专题---MySQL常用SQL语句优化 一.总结 一句话总结: 原理,万变不离其宗:其实SQL语句优化的过程中,无非就是对mysql的执行计划理解,以及B+树索引的理解,其实只要我们理解执行 ...

随机推荐

  1. alpakka-kafka(10)-用kafka实现分布式近实时交易

    随着网上购物消费模式热度的不断提高,网上销售平台上各种促销手段也层出不穷,其中"秒购"已经是各种网站普遍流行的促销方式了."秒购"对数据的实效性和精确性要求非常 ...

  2. linux可以这样玩 之 杂乱无章的随笔(不定期更新)

    文章目录 快速重命名 vim的进化 vim高亮当前行 vim列编辑 vim块编辑 vim行编辑 vim 中替换内容 vim保留当前已经编辑的内容,切换到其他用户继续编辑 修改服务的进程限制 CentO ...

  3. INTERSPEECH 2015 | Scalable Distributed DNN Training Using Commodity GPU Cloud Computing

    一般来说,全连接层的前向和后向传递所需的计算量与权重的数量成正比.此外,数据并行训练中所需的带宽与可训练权重的数量成比例.因此,随着每个节点计算速度的提高,所需的网络带宽也随之增加.这篇文章主要是根据 ...

  4. 「Python实用秘技06」逐行监听Python程序的内存消耗

    本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第6期 ...

  5. 云原生 PostgreSQL 集群 - PGO:5分钟快速上手

    前提条件 请确保您的主机上安装了以下实用程序: kubectl git 安装 第 1 步:下载示例 首先,转到 GitHub 并 fork Postgres Operator 示例存储库: https ...

  6. VBS病毒实验

    实验目的 探讨VBS病毒实现原理,为更好的深入防御和查杀病毒 实验原理 VBS病毒发生机理 实验内容 编写简单VBS病毒,并实现功能,学习VBS病毒发生机理 实验环境描述 VPC1(虚拟PC) 操作系 ...

  7. [数分笔记]用Dedekind切割定理证明确界定理

    1.定理内容 Dedekind切割定理:设是实数集的一个切割,则或者有最大数,或者有最小数. 确界定理:非空有上界的数集必有上确界,非空有下界的数集必有下确界. 2.证明过程 设非空数集有上界 记,即 ...

  8. [旧][Android] ButterKnifeProcessor 工作流程分析

    备注 原发表于2016.05.21,资料已过时,仅作备份,谨慎参考 前言 在 [Android] ButterKnife 浅析 中,我们了解了 ButterKnife 的用法,比较简单. 本次文章我们 ...

  9. Smartbi:用Excel制作移动端的九型人格测试

    ​九型人格是一个近年来倍受美国斯坦福大学等国际著名大学MBA学员推崇并成为现今最热门的课程之一,近十几年来已风行欧美学术界及工商界.全球500强企业的管理阶层均有研习九型性格,并以此培训员工,建立团队 ...

  10. Java课程设计---代码及数据库

    点击下载: 代码:StudentSystem 数据库名:db_student 数据表:tb_student tb_class admin