SQL优化 MySQL版  - -B树索引详讲

作者:Stanley 罗昊

转载请注明出处和署名,谢谢!

为什么要进行SQL优化呢?很显然,当我们去写sql语句时:

1会发现性能低

2.执行时间太长,

3.或等待时间太长

4.sql语句欠佳,以及我们索引失效

5.服务器参数设置不合理

SQL语句执行过程分析

1.编写过程:

编写过程就是我们平常写sql语句的过程,也可以理解为编写顺序,以下就是我们编写顺序:

select from join on where 条件 group by 分组 having过滤组 order by排序 limit限制查询个数

我们虽然是这样去写的,但是它mysql的引擎去解析时,并不是依照我们以上编写的这样的顺序

它并不是先解析select 而是先解析from,也就说,我们的解析过程跟编写过程是不一致的,所以我们看下发的解析顺序

2.解析过程:

from on join where group by having select order by limit 

以上就是mysql的解析过程,我们发现,跟我们编写的过程完全不一致!

索引

什么是索引(index)?简单的来讲就是书的目录

比如说我现在要通过字典来查“王”这个字,如果你在没有目录的情况下去找“王”这个字,你就需要把这个字典从头到尾的翻一遍,如果有一千页,你就必须一页一页的去翻,直到找到为止;

索引就相当于目录,查这个“王”之前先去翻看目录发现“W”在300页,因为王首字母是“W”,我们直接去在300页中找,这样找起来就非常快;

索引在数据库中是关键字index,用官方的定义的意思来说,索引就是帮助MySQL快速高效的获取数据的数据结构;

索引是一个数据结构,它是一个为了高效查询数据的数据结构;

那它到底是什么数据结构呢?

其实它就是一个树,我们用的比较多的就是B树、Hash树,在MySQL里面,用的就是B树索引

B树索引

首先我画一个图,假装这个是数据表,并且给age列加一个索引:

就把这个索引当成一个目录,也就是age为50的,就指向第一行,age为33的,指向第五行;

下面我会将B树索引画出来,看看到底是怎么索引了:

我们给age加了索引列后,它就会像树一样,把小的放到左边,把大的放到右边第一列为50,比50小的在左边,23,比23小的继续向左排列,

33比23大,就向右边排列20比22小就在22后面继续向左排列,以此类推!

比如我们现在需要查33:

select * From 表名 where age = 33;

不加索引的话,就会从50开始查,50不是 23,不是22不是....,不加索引就一个个去找;

如果加索引的话,找33,发现33比50小,第一次,再去找23,第二次,33比23大,第三次,仅需三次就查到了:

索引的弊端

1.索引本身很占空间,可以存放在内存/硬盘(通常)

2.索引不是所有情况均可适用比如:少量数据、频繁更新的字段(如果数据表中的某一列经常会发生改变,那么这一列就不适合做索引)

3.索引确实可以提高查询效率,但是同时会降低增删改的效率,比如:

我们没有索引,你改44,改成45,很好改,直接改就行了,如果你有索引,我不光要改表里面的44,我需要把B树里面的44也要改

有些人就觉得不划算了,提升一个降低三个,这样就很不划算了,其实很划算的!

因为我们大部分情况下都是在查询,增删改很少,因为查询影响性能很大的,所以非常有必要使用它

索引的优势

1.提高了查询效率

客户端到服务端,链接服务端是通过IO,通过输入输出流,所以说,提高查询效率就是降低了IO的使用率

2.降低CPU使用率

比如说我sql里面有一个order by desc 根据年龄降序或升序,如果没有索引,你需要把age全部拿出来全部排个序,但是如果有了索引,你就不需要排序了,B树本身就是一个排好序的结构,最左边必然是最小的,最最右边必然是最大的:

只需要根据一定的规则遍历出来就行了。

今日感悟:

很多父母或者年轻人找工作细化追求一份“铁饭碗”,

认为稳定最重要,

但在这个世界上,唯一不变的铁律就是变化,

不管是公务员,还是国企,都只有靠能力,在岗位上才能站稳脚,

什么是真正的铁饭碗?

铁饭碗绝不是在一个单位干一辈子,

而是到了那儿,你都有饭吃,荒年饿不死手艺人,能力才是硬道理!

SQL优化 MySQL版 - B树索引详讲的更多相关文章

  1. SQL优化 MySQL版 - 多表优化及细节详讲

    多表优化及细节详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:本文章需要MySQL数据库优化基础或观看前几篇文章,传送门: B树索引详讲(初识SQL优化,认识索引):htt ...

  2. SQL优化 MySQL版 - 单表优化及细节详讲

    单表优化及细节详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:本文章需要MySQL数据库优化基础或观看前几篇文章,传送门: B树索引详讲(初识SQL优化,认识索引):htt ...

  3. SQL优化 MySQL版 - 索引分类、创建方式、删除索引、查看索引、SQL性能问题

    SQL优化 MySQL版  - 索引分类.创建方式.删除索引.查看索引.SQL性能问题 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 索引分类 单值索引 单的意思就是单列的值,比如说有 ...

  4. SQL优化 MySQL版 -分析explain SQL执行计划与笛卡尔积

    SQL优化 MySQL版 -分析explain SQL执行计划 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 首先我们先创建一个数据库,数据库中分别写三张表来存储数据; course: ...

  5. SQL优化 MySQL版 - 避免索引失效原则(一)

    避免索引失效原则(一) 精力有限,剩余的失效原则将会在 <避免索引失效原则(二)>中连载出来,请谅解 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 避免索引失效的一些原 ...

  6. SQL优化 MySQL版 - 避免索引失效原则(二)

    避免索引失效原则(二) 注:继上一篇文章继续讲解: 避免索引失效原则(一)https://www.cnblogs.com/StanleyBlogs/p/10482048.html#4195062 作者 ...

  7. SQL优化 MySQL版 -分析explain SQL执行计划与Type级别详解

    type索引类型.类型 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:看此文章前,需要有一定的Mysql基础或观看上一篇文章,该文章传送门: https://www.cnblo ...

  8. SQL优化 MySQL版 -分析explain SQL执行计划与Extra

    Extra 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:此文章必须有一定的Mysql基础,或观看执行计划入门篇传送门: https:.html 终于总结到哦SQK执行计划的最 ...

  9. (1.9)SQL优化——mysql导入导出优化

    (1.9)SQL优化——mysql导入导出优化 1.大批量插入数据 [1.1]MyISAM: (1)如果存在表且有数据,插入前先关闭所有非唯一索引. (2)如果表是空的,默认就是先导入数据再创建索引, ...

随机推荐

  1. Html5列表元素

    <ol> 有序列表: 属性:type(设置样式),reversed(倒序) <ul>无序列表 <li>表示列表中的项(在<ol>和<ul>中 ...

  2. Page_Load不要忘了if (!IsPostBack)

    Page_Load不要忘了if (!IsPostBack) 问题:在DropDownList的SelectedIndexChanged事件中绑定数据,运行时,DropDownList控件的Select ...

  3. 洛谷 P1430 解题报告

    P1430 序列取数 题目描述 给定一个长为\(n\)的整数序列\((n<=1000)\),由\(A\)和\(B\)轮流取数(\(A\)先取).每个人可从序列的左端或右端取若干个数(至少一个), ...

  4. 一种轻量级的微信小程序日志监控的方法

    今天一个活动要写个H5,明天一个功能要用小程序,天天都在写bug.用户反馈小程序用起来有问题还特么还不知道到底出了啥bug,反馈多了,老板要扣工资了!看来挖了太多坑不填也不行,程序异常还是要主动追踪, ...

  5. 十八、Hadoop学记笔记————Hbase架构

    Hbase结构图: Client,Zookeeper,Hmaster和HRegionServer相互交互协调,各个组件作用如下: 这几个组件在实际使用过程中操作如下所示: Region定位,先读取zo ...

  6. py文件转换为exe文件

    遇到这个问题时在网上找了一会资料,很多博客的方法很旧了,介绍一种最简单的,pyinstaller. 时间比较早的资料还在介绍如何安装pip(python的包管理器),其实python中已经自带pip了 ...

  7. Libevent教程001: 简介与配置

    本文内容大致翻译自 libevent-book, 但不是照本翻译. 成文时, libevent最新的稳定版为 2.1.8 stable. 即本文如无特殊说明, 所有描述均以 2.1.8 stable ...

  8. Sublime Text 3安装SFTP插件

    前言: 最近在学习网页设计,陆续接触到了HTML.CSS和JavaScript,写的代码越来越多了,也越来越感觉到将代码上传到服务器上的流程太繁琐了.一开始我是用虚拟主机提供的控制面板下载上传网页代码 ...

  9. mybatis通用mapper的使用

    项目中持久层封装了两套,一个hibernate,一个是mybatis.hibernate中封装了一些通用的方法,但是mybatis中没有,基于这个需求开始使用mybatis的通用mapper.     ...

  10. C#中的is和as

    is检查一个对象是否兼容于指定的类型,不返回Boolean值.注意is操作符永远不会抛异常.is操作符通常这样使用: if(o is Employee) { Employee e=(Employee) ...