打卡--MySQL8.0 四 (索引及执行计划)

一、索引的创建与使用

1、索引的分类

MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。
(1)从 功能逻辑 上说,索引主要有 4 种,分别是普通索引、唯一索引、主键索引、全文索引。
(2)按照 物理实现方式 ,索引可以分为 2 种:聚簇索引和非聚簇索引。
(3)按照 作用字段个数 进行划分,分成单列索引和联合索引

玩转Mysql 七 (索引的创建与设计原则)-CSDN博客

解析:聚簇索引和非聚簇索引的区别

聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。聚集索引存储记录是物理上连续存在,物理存储按照索引排序,而非聚集索引是逻辑上的连续,物理存储并不连续,物理存储不按照索引排序。

聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索引顺序与数据物理排列顺序无关。正是因为如此,所以一个表最多只能有一个聚簇索引。

索引是一种特殊的数据结构。两种索引:聚集索引(Clustered Index,也称聚类索引、簇集索引、聚簇索引)和非聚集索引(Nonclustered Index,也称非聚类索引、非簇集索引)。创建的索引,如复合索引、前缀索引、唯一索引,都是属于非聚簇索引,在有的书籍中,又将其称为辅助索引(secondary index)。在后文中,我们称其为非聚簇索引,其数据结构为B+树。

聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。Innodb通过主键聚集数据,如果没有定义主键,innodb会选择非空的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引。

二、mysql哪些情况下不走索引?

MySQL是一种常用的关系型数据库,它使用索引来提高查询性能。然而,并非所有的SQL语句都能充分利用索引。在本文中,我们将介绍几个无法使用到索引的MySQL SQL语句。

1. 使用函数:当SQL语句中使用函数时,索引将无法被应用。例如,下面的SQL语句使用了函数UPPER,这将导致MySQL无法使用索引进行查询。
SELECT * FROM customers WHERE UPPER(name) = 'JOHN';

2. 使用LIKE模糊查询:在使用LIKE语句进行模糊查询时,如果通配符放在开头(例如%john),MySQL也将无法使用索引。这是因为MySQL只能利用索引执行前缀匹配,而不能利用索引进行后缀匹配。
SELECT * FROM customers WHERE name LIKE '%john';

3. 使用逻辑或操作符:当SQL语句中使用了逻辑或操作符(OR)时,索引也无法被应用。例如,下面的SQL语句使用了逻辑或操作符,这将导致MySQL无法使用索引进行查询。
SELECT * FROM customers WHERE name = 'john' OR age = 30;

4. 使用不等于操作符:当SQL语句中使用了不等于操作符(<>或!=)时,索引将无法被应用。例如,下面的SQL语句使用了不等于操作符,这将导致MySQL无法使用索引进行查询。
SELECT * FROM customers WHERE age <> 30;

5. 使用NULL值:当SQL语句中使用了NULL值作为查询条件时,索引也无法被应用。这是因为索引无法用于查找缺失的值。例如,下面的SQL语句使用了NULL值作为查询条件,这将导致MySQL无法使用索引进行查询。
SELECT * FROM customers WHERE name IS NULL;

在使用MySQL时,我们需要注意以上几种语句可能无法使用索引。如果需要提高查询性能,可以考虑优化SQL语句,避免使用这些无法使用索引的语句。

3、什么是回表查询?

这先要从InnoDB的索引实现说起,InnoDB有两大类索引:

聚集索引(clustered index)

普通索引(secondary index) 

InnoDB聚集索引和普通索引有什么差异?

InnoDB聚集索引的叶子节点存储行记录,因此, InnoDB必须要有,且只有一个聚集索引:

(1)如果表定义了PK,则PK就是聚集索引;

(2)如果表没有定义PK,则第一个not NULL unique列是聚集索引;

(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;

画外音:所以PK查询非常快,直接定位行记录。

 InnoDB普通索引的叶子节点存储主键值。

画外音:注意,不是存储行记录头指针,MyISAM的索引叶子节点存储记录指针。

举个栗子,不妨设有表:

  t(id PK, name KEY, sex, flag);

画外音:id是聚集索引,name是普通索引。

表中有四条记录:

  1, shenjian, m, A

  3, zhangsan, m, A

  5, lisi, m, A

  9, wangwu, f, B

两个B+树索引分别如上图:

  (1)id为PK,聚集索引,叶子节点存储行记录;

  (2)name为KEY,普通索引,叶子节点存储PK值,即id;

 

既然从普通索引无法直接定位行记录,那普通索引的查询过程是怎么样的呢?

通常情况下,需要扫码两遍索引树。

例如:

select * from t where name='lisi'; 

是如何执行的呢?

如粉红色路径,需要扫码两遍索引树:

(1)先通过普通索引定位到主键值id=5;

(2)在通过聚集索引定位到行记录;

四、执行计划

MySQL 执行计划详解 | 京东物流技术团队 - 知乎

关于Mysql的执行计划讲解最好的一篇文章! - 知乎

面试官:不会看 Explain执行计划,简历敢写 SQL 优化?

https://www.cnblogs.com/linuxmysql/p/16204900.html

1、查看SQL是否使用索引

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值