这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战
前言
一说到数据查询慢了,我们第一反应就是加索引,确实加索引就可以明显提升查询速度,但是为什么索引可以优化查询速度,底层又是如何做到的。
生活中的索引
我们在查阅字典的时候,我们会先通过目录,定位到具体的页码,然后快速查找到,那么目录就可以看作是所有文字的索引。
数据表索引的目的
- 索引就是为表建立的一种特殊的"目录"
- 索引的目的就是防止全表扫描(Full Scan)
- 索引存储形式是由存储引擎决定的
数据表索引分类
1. 从存储结构上来划分 :
BTree索引、Hash索引、full-index全文索引、R-tree索引 2. 从应用分层来划分: 普通索引、唯一索引、复合索引 3. 按数据物理存储顺序划分: 聚集索引,非非聚集索引
常用索引
- B+Tree索引 适用于范围查找
- Hash索引 适用于精确查找
MySQL中InnoDb与MyISAM采用的是B+Tree索引- B+Tree索引采用树形链表结构建立数据“目录”
为什么官方建议使用自增主键作为索引?
新增数据后,数据更新的范围最小
InnoDB与MyISAM中BTree索引的区别?
InnoDB采用Id号进行数据的组织 聚集索引MyISAM采用数据物理地址来进行数据的组织 非聚集索引
B-Tree和B+Tree的区别
如何知道当前sql执行是否走了索引?
使用
explain关键字查看执行计划
EXPLAIN SELECT * FROM `sys_user` WHERE user_id = 1
使用基本技巧
- 精确匹配,允许使用BTree索引
- 范围匹配,允许使用BTree索引
- 查询条件中保证数据类型与字段定义类型一致,否则有可能造成索引失效
- 字符串字段BTree索引允许进行“前缀查询”,LIKE "xxx%"
- 不支持后缀查询与模糊匹配,如“LIKE "%xxx%"或"%xxx"
- 复合索引查询条件必须包含左侧列
- <>与not in 会导致不适用索引