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

作者 Stanley 罗昊

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

索引分类

单值索引

的意思就是单列的值,比如说有一张数据库表,表内有三个字段,分别是 id name age,我给age这个字段加一个索引,这就是单值索引,因为只有age这一列是索引;

一个表可以有多个单值索引,我不光可以设置age,我也可以吧name设置成索引,或许更多

唯一索引

顾名思义,就是不能重复,比如age就不能被设置为唯一索引,因为年龄肯定是不唯一的,小明18岁,有可能小李也是18岁,这就重复了,所以age这一列不能被设置成唯一索引;

一般唯一索引就是Id;

复合索引

由多个列构成,相当于书的二级目录,比如我找“赵”这个字,它就先去Z里面找,然后再去zhao里面去找,找两次;

这个时候我把name跟age它两个共同组成一个复合索引,意思就是,我先根据name找人,如果名字重复了,我再根据age去找;

复合索引不一定必须两个列在一起使用,比如找李四,这个表里面就一个李四,就没有必要再去找age进行筛选;

创建索引的方式一

语法:careate 索引类型 索引名 on 表 (字段)//你现在在给那张表的那个字段加索引

创建单值索引

单值索引索引类型就是index;

careate index dept_index on tb(dept)

讲解:我要根据部门进行查询所以我就给部门加一个单值索引,dept_index就是我起的名字,dept就是部门的意思,名字可以随便起,但是要有意义,on后面跟上表名,我的数据库的这张表是tb,所以我写tb,括号里面写字段名;

创建唯一索引

careate  unique index name_index on tb (name)

讲解:unique 与 index 都是索引类型,这里我们就假设name是唯一的,创建方法跟上面一样,无非就多加了一个unique,去掉unique就是单值索引;

创建复合索引

careate  index dept_name_index on tb tb(dept,name);//程序会自动检测,如果你后面参数只有一个,那就判定你为单值,如果是一个以上,就判定你是复合!

讲解:我现在假设dept跟name这俩字段复合,我现在查询一个人的时候,先看他是哪个部门的(dept)如果大家都是开发部门的,那我再根据名字找,如果你不是开发部门的,那我我就直接找到了,就两次截然查询,也就是先根据部门,再根据名字;

创建索引的方式二

语法:alter table 表名 索引类型 索引名(字段)

创建单值索引

alter table tb add index dept_index(dept);

讲解:add就表示给tb这张表添加一个为index类型的索引,并起名为dept_index,要被加的字段是dept;

创建唯一索引

alter table tb add unique index name_index(name)

讲解:照猫画虎,跟上放基本一致,假设name字段是唯一不可重复

创建复合索引

alter table tb add index dept_name_index(dept,name)

讲解:先dept就是先根据dept查,再去根据name查,这个顺序是有意义的!

值得注意的是,两个创建方式的效果是一样的,任选其一,均不需要事物的提交(commit),因为两者都是DDL语句,程序遇到DDL会自动提交,但是你写了也不报错,就是什么也没提交而已;

事物只对DML语句进行操作,也就是增删改操作,这个需要理解!

注意:

如果一个字段是primary key(主键),则该字段默认就是主键索引,即便你没有给他加索引,他也是主键索引!

主键索引与唯一索引基本相似,区别就是,值不能为Null,而唯一索引可以!

主键索引:值不能重复 值不能为null

唯一索引:值不能重复 值可以为null

删除索引

语法:drop index 索引名 on 表名;

drop index name_index on tb;

讲解,我要删除的索引名字为name_index on 它属于 tb 表

查询索引

语法:show index from tb;

解析,看一下tb这张表的索引;

SQL性能问题

1.分析SQSL的执行计划

通过explain,可以模拟SQL优化器执行SQL语句,从而让开发人员知道自己编写的状况;

查询执行计划:explain+SQL语句;

举例:explain select * From bbs_detail,看一下执行结果:

我会在下篇文章详细介绍并且实战优化,在这里各位仅做了解即可;

解说:

id:顾名思义就是查询编号

select_type:查询类型

table:你在操作哪一张表

type:类型

key:实际使用的索引,你到底用了哪些索引

possible_keys:预测你用到了哪些索引,假设你用了八个索引,它这里就会显示八个,但是实际有效的只有五个,所以在key显示就是五个!

key_len:实际使用索引的长度;

ref:表和表之间的引用关系;

rows:通过索引查询到的数据量;

Extra:额外的优化信息

2.MySQL查询优化器会干扰我们的优化

我在前几章说过有关为什么会干扰我们优化好的SQL语句,因为它内置有一个优化器,它会擅自篡改我们优化好的SQL语句;

今日感悟:

自利偏差告诉我们:

    人在失败时会把原因归结到别人身上,

       成功时更倾向把劳务归于自己,

    印象管理告诉我们:

     人在别人的面前,

       会不知不觉地进行自我表演。

        决断效应告诉我们:

         人在选择以后,会通过自我说服,来让自己相信自己的选择是最好的

      自我确定理论告诉我们:

             人一般会喜欢和自己相似的人,这里面的爱,包含了对自己的肯定

               学习心理学,自己能更好的了解自己,并理解他人;

SQL优化 MySQL版 - 索引分类、创建方式、删除索引、查看索引、SQL性能问题的更多相关文章

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

    SQL优化 MySQL版  - -B树索引详讲 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 为什么要进行SQL优化呢?很显然,当我们去写sql语句时: 1会发现性能低 2.执行时间太 ...

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

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

  3. MySQL索引的创建、删除和查看

    MySQL索引的创建.删除和查看 此文转自http://blogold.chinaunix.net/u3/93470/showart_2001536.html 1.索引作用 在索引列上,除了上面提到的 ...

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

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

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

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

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

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

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

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

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

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

  9. mysql怎么创建,删除,查看索引?

    mysql是一个开源的应用非常广泛的数据库.mysql里面的索引能利用利用指针,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍.那么,怎么创建索引 ...

随机推荐

  1. bzoj 3167 SAO

    树dp 定义f[i][j]为i在其已合并子树内排名为j的方案数 O(n2)进行子树合并 转移时枚举他在已合并子树中的排名j和新合并子树中的排名k+1 当他比他儿子大的时候$f[x][j+k]=f[x] ...

  2. Travel 并查集

    题意:给一个图,若干询问,每次询问只经过边权<=w的边,x能到达的点数 并查集啊,对询问和边排序,直接合并,维护size,查询 #include<cstdio> #include&l ...

  3. otter代码在IDEA远程DEBUG方法

    众所周知,Otter的代码打包后,是通过Jetty启动的,Otter代码的启动脚本中自带了开启Jetty远程DEBUG的脚本,所以我们只需要在启动Otter Manager和Otter Node的时候 ...

  4. BZOJ_4756_[Usaco2017 Jan]Promotion Counting_树状数组

    BZOJ_4756_[Usaco2017 Jan]Promotion Counting_树状数组 Description n只奶牛构成了一个树形的公司,每个奶牛有一个能力值pi,1号奶牛为树根. 问对 ...

  5. postman-----使用CSV和Json文件实现批量接口测试

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } span ...

  6. java游戏开发杂谈 - 画布和画笔

    在Eclipse里,编写如下两个类: package game2; import java.awt.Color; import java.awt.Graphics; import javax.swin ...

  7. Gradle中的闭包

    Gradle是基于Groovy的DSL基础上的构建工具,Gradle中的闭包,其原型上实际上即Groovy中闭包.而在表现形式上,其实,Gradle更多的是以约定和基于约定基础上的配置去展现.但本质上 ...

  8. Docker最全教程之使用Docker搭建Java开发环境(十七)

    前言 Java是一门面向对象的优秀编程语言,市场占有率极高,但是在容器化实践过程中,发现官方支持并不友好,同时与其他编程语言的基础镜像相比(具体见各语言镜像比较),确实是非常臃肿. 本篇仅作探索,希望 ...

  9. DSAPI多功能组件编程应用-HTTP监听服务端与客户端_指令版

    前面介绍了DSAPI多功能组件编程应用-HTTP监听服务端与客户端的内容,这里介绍一个适用于更高效更快速的基于HTTP监听的服务端.客户端. 在本篇,你将见到前所未有的超简化超傻瓜式的HTTP监听服务 ...

  10. Java 在PDF文档中绘制图形

    本篇文档将介绍通过Java编程在PDF文档中绘制图形的方法.包括绘制矩形.椭圆形.不规则多边形.线条.弧线.曲线.扇形等等.针对方法中提供的思路,也可以自行变换图形设计思路,如菱形.梯形或者组合图形等 ...