MySQL优化学习 | 索引

400 阅读2分钟

这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战

前言

一说到数据查询慢了,我们第一反应就是加索引,确实加索引就可以明显提升查询速度,但是为什么索引可以优化查询速度,底层又是如何做到的。

生活中的索引

我们在查阅字典的时候,我们会先通过目录,定位到具体的页码,然后快速查找到,那么目录就可以看作是所有文字的索引。

数据表索引的目的

  • 索引就是为表建立的一种特殊的"目录"
  • 索引的目的就是防止全表扫描(Full Scan)
  • 索引存储形式是由存储引擎决定的

数据表索引分类

1. 从存储结构上来划分 :

BTree索引Hash索引full-index全文索引R-tree索引 2. 从应用分层来划分: 普通索引、唯一索引、复合索引 3. 按数据物理存储顺序划分: 聚集索引,非非聚集索引

常用索引

  • B+Tree索引 适用于范围查找
  • Hash索引 适用于精确查找
  • MySQLInnoDbMyISAM采用的是B+Tree索引
  • B+Tree索引采用树形链表结构建立数据“目录”

为什么官方建议使用自增主键作为索引?

新增数据后,数据更新的范围最小

InnoDB与MyISAM中BTree索引的区别?

InnoDB 采用Id号进行数据的组织 聚集索引 MyISAM采用数据物理地址来进行数据的组织 非聚集索引

B-Tree和B+Tree的区别 image.png

如何知道当前sql执行是否走了索引?

使用explain关键字查看执行计划

EXPLAIN SELECT * FROM `sys_user` WHERE user_id = 1

image.png

使用基本技巧

  • 精确匹配,允许使用BTree索引
  • 范围匹配,允许使用BTree索引
  • 查询条件中保证数据类型与字段定义类型一致,否则有可能造成索引失效
  • 字符串字段BTree索引允许进行“前缀查询”,LIKE "xxx%"
  • 不支持后缀查询与模糊匹配,如“LIKE "%xxx%"或"%xxx"
  • 复合索引查询条件必须包含左侧列
  • <>与not in 会导致不适用索引