阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

132次阅读
没有评论

共计 2068 个字符,预计需要花费 6 分钟才能阅读完成。

索引分类

单值索引

的意思就是单列的值,比如说有一张数据库表,表内有三个字段,分别是 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+SQ L 语句;

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

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

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

解说:

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

select_type: 查询类型

table: 你在操作哪一张表

type: 类型

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

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

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

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

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

Extra:额外的优化信息

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

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

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计2068字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中