mysql索引选择实例_MySQL索引的使用实例

前言

这是我听老师讲课做的笔记,考试要看的。 这是视频地址

作者:陈运智

关注我的csdn博客,更多Linux笔记知识还在更新

本人只在csdn写博客

一. 慢查询日志

//查看是否开启慢查询日志

mysql> show variables like '%slow%';

//临时开启慢查询日志

mysql> set global slow_query_log=ON;

//查看是否开启慢查询日志

mysql> show variables like '%slow%';1

2

3

4

5

6

d74ec2067d07f9cb176ad69e38f49054.png

//查询超过多少时间就可以记录,上面是如果超过10秒就要记录

mysql> show variables like '%long%';

//改成一秒,如果超过一秒就写到慢日志里面去(一般一秒是最好的)

mysql> set long_query_time=1;

//查看日记存储方式,默认FILE

mysql> show variables like '%log_output%';

// 慢查询日志文件所在位置

mysql> show variables like '%datadir%';1

2

3

4

5

6

7

8

b7a501c8e08d5cca402527ce207eb1de.png

//响应时间是3秒,超过了原先设定的一秒

mysql> select sleep(3);1

2

b07412ce461b827dd8ead715556b8d05.png

我们去文件夹里面查看时发现它已经被存入慢查询日记里面

c7059bcfc52ae5de1b961091253f5684.png

这部分写明了如何通过慢日志找出比较慢的SQL,后面部分要说为什么慢,如何能更快一点。

二. 查询分析器——explain

作用:通过这个可以知道查看sql慢在哪里,需要朝那些方面优化

列:我们创建一个employee数据表

create table employee(

id int not null auto_increment primary key,

name varchar(30) comment '姓名',

sex varchar(1) comment '性别',

salary int comment '薪资(元)',

dept varchar(30) comment '部门'

);

insert into employee(name, sex, salary, dept) values('张三', '男', 5500, '部门A');

insert into employee(name, sex, salary, dept) values('李洁', '女', 4500, '部门C');

insert into employee(name, sex, salary, dept) values('李小梅', '女', 4200, '部门A');

insert into employee(name, sex, salary, dept) values('欧阳辉', '男', 7500, '部门C');

insert into employee(name, sex, salary, dept) values('李芳', '女', 8500, '部门A');

insert into employee(name, sex, salary, dept) values('张江', '男', 6800, '部门A');

insert into employee(name, sex, salary, dept) values('李四', '男', 12000, '部门B');

insert into employee(name, sex, salary, dept) values('王五', '男', 3500, '部门B');

insert into employee(name, sex, salary, dept) values('马小龙', '男', 6000, '部门A');

insert into employee(name, sex, salary, dept) values('龙五', '男', 8000, '部门B');

insert into employee(name, sex, salary, dept) values('冯小芳', '女', 10000, '部门C');

insert into employee(name, sex, salary, dept) values('马小花', '女', 4000, '部门B');

insert into employee(name, sex, salary, dept) values('柳峰', '男', 8800, '部门A');1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

b02d68292ef92560d3c8cda9d44bf603.png

//通过explain解读他,后面加一个\G便于阅读

mysql> explain select * from employee where name='柳峰'\G;

//扫描快捷

mysql> explain select * from employee where id=13\G;1

2

3

4

5

dcf9e5b7c65a6d19b1e1f772cdc3b5ae.png

效果:如下图,可以看之前为什么那么慢,需要四秒响应时间

262ed1f90c3a416fa18e383a5cbc7d93.png

三. 索引的基本使用

mysql> show index from employee\G;

//主键会默认建一个id索引1

2

f73974229a8bc0cf9ed488242e75ffca.png

创建索引 效率提升

//查询分析

mysql> explain select * from employee where name='柳峰';

//创建普通索引

mysql> create index idx_name on employee(name);1

2

3

4

eab37cd28f6251c5ca700f4fe4850e3f.png

//删除

mysql> drop index idx_name on employee;1

2

56027924d06ee9f39894cde63496914d.png

老师 事列:

4a152b27450212929390ae2900927e49.png

如过用like检索,效率还是不变,所以要看你怎么用

e50d6fc7b07534918336fbcc0b1ad500.png

四. 复合索引

//查的时候可以看到一个主键索引

mysql> show index from employee\G;1

2

e9705dcf4858dd0bc4923a6733be05a1.png

目前是all全局扫描

select * from employee where name ='柳峰';

//查询分析

explain select * from employee where name ='柳峰'\G;1

2

3

4151aa6b7034f3278c2d66c67a450d3c.png

创建索引

//创建索引

create index idx_name_salary_dept on employee(name,salary,dept);

//查询分析

explain select * from employee where name ='柳峰'\G;1

2

3

4

d0c0a2e80d9a5b95179994f061db2157.png

验证有name就能索引

// name和salary

mysql> explain select * from employee where name ='柳峰' and salary=8800\G;

//name和dept

mysql> explain select * from employee where name ='柳峰' and dept='部门A'\G;1

2

3

4

5bcf8b17b7af98758c84a0ac9b08cad0.png

没有name就不能使用索引

mysql> explain select * from employee where salary=8800;

mysql> explain select * from employee where dept='部门A';1

2

3

513e259c6c2d1e7ab932e8cb3ea3aa54.png

五. 覆盖索引

按照上面步骤,我们可以看到四个索引,第一个是主键索引,后面是复合索引name_salary_dept

mysql> show index from employee;1

ac26a86b12a371f353374dd2578d1144.png

如何触发

我们用id作为查询数据

mysql> select * from employee;

mysql> select * from employee where id =11;1

2

3

ae62d6f0adaf2e12e991b862a4f972f5.png

只查id

mysql> explain select id from employee employee where id=11\G;

mysql> explain select id from employee\G;1

2

3

d993b608cf9dbeafbb5c63e20c4cd603.png

//查name,salary

mysql> explain select name,salary from employee;

//查name,salary,dept

mysql> explain select name,salary,dept from employee;

//因为没有sxe条件,所以只能做全部扫描type为null

mysql> explain select name,sex,salary,dept from employee;1

2

3

4

5

6

7

8

29bf5b2d6169d7e62e8e51704c0209f6.png

请给我点个赞鼓励我吧

94fd5d406f5126e47ac2532c1d9d7eae.png

文章来源: blog.csdn.net,作者:RodmaChen,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_46654114/article/details/109257999

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值