【2021-09-16】mysql基础学习索引

学习链接:https://www.cnblogs.com/zsql/p/13854191.html

-- https://www.cnblogs.com/zsql/p/13854191.html
show index  from  user; -- 查看city表中的索引信息
show index  from  department; -- 查看city表中的索引信息
create index idx_d_id on user (d_id); -- 创建索引
DROP INDEX idx_d_id ON user; -- 删除索引



-- 哪些慢查询后怎么去分析呢,当然是借助explain啦【一定要用小表驱动大表】
explain select * from department d left join user u on u.d_id = d.id;
/*
可以看到key这一列都是为null,所以两个表都是全表扫描呢
*/


-- [*] 两表left join
create index idx_d_id on user (d_id);
DROP INDEX idx_d_id ON user; -- 删除索引
explain select * from department d left join user u on u.d_id = d.id;
/* 
无索引: 
	USER:全表扫描
	注释:department表在id上有主键索引,但是作为左连接,department需要保留全部的数据,所以建立索引是没什么影响的

有索引:user表d_id
	看结果可以得出user表使用了索引,减少了数据的读取
	注释:可以得出left join主要的优化在于右表的索引的创建,那right join也是一样在于左表的索引的情况
*/


-- [*] 两表inner join
create index idx_d_id on user (d_id);
DROP INDEX idx_d_id ON user; -- 删除索引
explain select * from department d inner join user u on u.d_id = d.id;
/* 
无索引: 
	USER:全表扫描
	注释:department表在id上有主键索引,但是作为左连接,department需要保留全部的数据,所以建立索引是没什么影响的

有索引:user表d_id
	好像优化器会选择把小的表来驱动大的表,全表扫描小的表,大的表走索引。
*/




-- [*] 单表order by DEPARTMENT主键
create index idx_d_id on user (d_id);
DROP INDEX idx_d_id ON user; -- 删除索引
explain select * from user order by d_id;
/* 
无索引: 
输出:
	USER:filesort

有索引:user表d_id
输出:
	USER:filesort
	
原因:创建了索引,没有使用覆盖索引;选择以全部列返回查询时就出现【回表】
*/



-- [*] 单表order by DEPARTMENT主键
create index idx_d_id on user (d_id);
DROP  INDEX  idx_d_id  ON  user; -- 删除索引
explain select d_id from user order by d_id;
/* 
无索引: 
输出:
	USER:filesort

有索引:user表d_id
输出:
	USER:index
	
原因:这里只返回d_id,索引排序使用了索引d_id,会发生【覆盖索引】
*/




-- [*] 两表left join, order by 其他
create index idx_d_id on user (d_id);
DROP  INDEX  idx_d_id  ON  user; -- 删除索引
explain select * from department d left join user u on u.d_id = d.id order by d.d_name; 
/* 
无索引: 
输出:
	DEPARTMENT:临时表,filesort
	USER:全表扫描

有索引:user表d_id
输出:
	DEPARTMENT:filesort
	
原因:未知
*/




-- [*] 两表left join, order by DEPARTMENT主键
create index idx_d_id on user (d_id);
DROP  INDEX  idx_d_id  ON  user; -- 删除索引
explain select * from department d left join user u on u.d_id = d.id order by d.id;
/* 
无索引: 
输出:
	DEPARTMENT:临时表,filesort
	USER:全表扫描

有索引:user表d_id
输出:
	创建索引后user表的rows为1,没有使用filesort和临时表
	
原因:完美
*/


-- [*] 两表left join, order by USER主键
create index idx_d_id on user (d_id);
DROP  INDEX  idx_d_id  ON  user; -- 删除索引
explain select * from department d left join user u on u.d_id = d.id order by u.d_id; 
/* 
无索引: 
输出:
	DEPARTMENT:临时表,filesort
	USER:全表扫描

有索引:user表d_id
输出:
	DEPARTMENT:临时表,filesort
	
原因:把排序条件换成user的字段后,使用了临时表和filesort【有索引】
*/



-- [*] 两表left join, order by 其他
create index idx_d_id on user (d_id);
DROP  INDEX  idx_d_id  ON  user; -- 删除索引
explain select * from department d left join user u on u.d_id = d.id order by d.d_name; 
/* 
无索引: 
输出:
	DEPARTMENT:临时表,filesort
	USER:全表扫描

有索引:user表d_id
输出:
	USER:filesort
	
原因:把排序字段换成department表的d_name列(没有索引),使用了filesort【有索引】
*/





-- [*] 两表inner join, order by USER主键和其他
create index idx_d_id on user (d_id);
DROP  INDEX  idx_d_id  ON  user; -- 删除索引
explain select * from department d inner join user u on u.d_id = d.id order by d.d_name,u.id; 
/* 
无索引: 
输出:
	USER:全表扫描,filesort

有索引:user表d_id
输出:
	DEPARTMENT:临时表,filesort
	
原因:使用了user表的id排序,新增临时表【有索引】
*/

		

-- [*] 两表inner join, order by USER主键和其他
create index idx_d_id on user (d_id);
DROP  INDEX  idx_d_id  ON  user; -- 删除索引
explain select d.* from department d inner join user u on u.d_id = d.id order by d.d_name,u.id;
/* 
无索引: 
输出:
	USER:全表扫描,filesort

有索引:user表d_id
输出:
	DEPARTMENT:临时表,filesort
	USER:index
		
原因:这里只返回department表的全部列,还是使用了临时表和filesort
*/


-- [*] 两表inner join, order by 其他【department表全部字段】
create index idx_d_id on user (d_id);
DROP  INDEX  idx_d_id  ON  user; -- 删除索引
explain select d.* from department d inner join user u on u.d_id = d.id order by d.d_name;
/* 
无索引: 
输出:
	USER:全表扫描
	DEPARTMENT:临时表,filesort

有索引:user表d_id
输出:
	DEPARTMENT:filesort
	USER:index
		
原因:去掉user的id列排序后少了临时表【有索引】
*/



-- [*] 两表inner join, order by DEPARTMENT主键【department表全部字段】
create index idx_d_id on user (d_id);
DROP  INDEX  idx_d_id  ON  user; -- 删除索引
explain select d.* from department d inner join user u on u.d_id = d.id order by d.id; 
/* 
无索引: 
输出:
	USER:全表扫描
	DEPARTMENT:临时表,filesort

有索引:user表d_id
输出:
	USER:index
		
原因:使用department的id排序,没了filesort【有索引】
*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL是一种开源的关系型数据库管理系统,是Web开发中最常用的数据库之一。以下是学习MySQL基础知识的几个关键点: 1. 数据库基础知识 你需要了解以下的基础知识: - 数据库的概念和特点 - 数据库管理系统(DBMS)和关系型数据库管理系统(RDBMS) - SQL语言的基础知识,包括SELECT、INSERT、UPDATE和DELETE等基本操作 2. 数据库设计 在设计数据库时,你需要考虑以下问题: - 数据库范式:数据库范式是一种规范化的设计方法,用于减少数据冗余和提高数据一致性。 - 数据库表的设计:如何分解数据,创建关联表以及定义主键和外键等。 - 数据库索引索引可以提高数据库查询效率,你需要了解如何创建索引并选择正确的索引类型。 3. 数据库管理 在管理数据库时,你需要了解以下的内容: - 数据库安装和配置 - 数据库备份和恢复 - 数据库性能调整,包括查询优化、索引优化、缓存优化等。 - 数据库安全,包括用户管理、权限管理和数据加密等。 4. 数据库编程 在应用程序中,你需要使用编程语言来访问数据库。以下是一些你需要了解的内容: - 数据库连接:如何连接到数据库并执行SQL查询。 - 数据库事务:如何使用事务来保证数据的一致性。 - 数据库异常处理:如何处理数据库操作中可能出现的异常。 5. MySQL工具和技术 MySQL有许多工具和技术,可以帮助你更有效地管理和使用数据库,例如: - MySQL Workbench:一个用于管理和开发MySQL数据库的集成开发环境(IDE)。 - phpMyAdmin:一个用于管理MySQL数据库的Web界面。 - MySQL Cluster:一个用于处理大数据和高可用性需求的分布式数据库系统。 - MySQL Replication:一个用于复制MySQL数据的技术,用于实现数据备份和负载均衡等。 以上是MySQL基础知识的一些关键点,掌握这些知识可以帮助你更好地理解和使用MySQL数据库

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值