MySQL存储引擎和索引

存储引擎是数据如何存储到文件,如何更新、查询,如何建立索引的一种机制。

MySQL核心两点就是存储引擎和索引。

第一部分 存储引擎

存储引擎是如何存储、更新、查询数据,以及为存储的数据建立索引的技术。存储引擎是针对表的,每一张表可以使用单独的存储引擎。

一、常见存储引擎
0、InnoDB
支持事务
支持行锁(锁粒度小,发生锁冲突的概率低,系统消耗的成本比较高)
支持B树索引
支持Hash索引
支持奔溃恢复(根据事务日志)

1、MyIsAm
不支持事务
支持表锁
支持B树索引
不支持Hash索引

2、Memory
数据都在内存中
数据处理速度开
数据安全性低

二、比较
MyISAM和InnoDB都使用B+树作为默认索引存储结构, 差异如下:

0、MyISAM 主索引B+树叶节点存储的是对应数据行的地址; 二级索引(辅助索引)B+树叶节点存储的也是对于行数据的地址,只是key可以重复。
1、MyISAM 索引文件和数据文件是分离的,索引文件仅保持数据记录的地址。

2、InnoDB 主索引B+树叶节点存储的是完整的行数据,InnoDB下的的主键索引基于整个表数据构建了一颗B+树,所以也叫聚集索引,查找效率比较高。
3、InnoDB 二级索引(非聚集索引)B+树叶节点存储的是数据行的主键ID,查找的时候需要先找到主键ID,然后在主键索引这颗B+树上二次查找。(这个过程俗称回表)
(Mysql 存储引擎的区别和比较B树(B-Tree)的由来、数据结构、基本操作以及数据库索引的应用)

说明:
解决回表:覆盖索引,在查询中索引已经覆盖了查询需求,不需要回表。查询的字段是多列索引(B+树的样子是怎样的),都在索引树上。覆盖索引避免回表原因
MySQL 的覆盖索引与回表

第二部分 索引

索引是特定列值的数据结构(B+树),分聚集索引和非聚集索引。
0、聚集索引即主键索引,把主键列的值构造成一颗B+树,叶子节点指向相应的行。按照主键查询的时候,直接在B+树上搜索,找到对应的记录。
1、非聚集索引,即普通列索引,把普通列的值复制出来构造成一颗B+树,叶节点指向相应的主键值,查找的时候根据值在B+树上找到主键,在根据主键在主键的B+树上找到对应的行。【如果是多列索引,可以不用找主键,直接找到值】
2、索引是用过B+树这种数据结构来存储的,具体存在什么地方呢,数据表中,磁盘文件中?
3、每次索引数据列改变(增删改)后数据库系统需要重新维护索引结构,增加性能开销。
4、每次给数据列添加索引,列中的数据就会被复制一份,用于生成索引,会增加表的体积,占有磁盘存储空间。
5、索引是在存储引擎层实现的,不是在服务层实现的。

索引按存储类型分类
0、B+Tree索引[大部分存储引擎都支持]
主键索引
唯一索引
普通索引
多列索引

1、RTree索引

2、Hash索引

3、Full Text索引

索引选择原则
0、较频繁的作为查询、排序、分组条件的字段应该创建索引
1、唯一性太差的字段不适合单独创建索引,即使是作为查询条件。
2、更新频繁的字段不适合作为索引。
3、不会出现在查询、排序、分组条件的字段不适合作为索引。
4、表记录少不适合加索引。
5、选择性低的字段不适合加索引。

索引最左前缀原则(示例)
最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整

范围列可以用到索引(必须是最左前缀),但是范围列后面的列无法用到索引。同时,索引最多用于一个范围列,因此如果查询条件中有两个范围列则无法全用到索引。
inx(a, b, c)
select a from test where a = ? and b = ? and c = ? (abc)
select a from test where a > ? and b > ? and c = ?(a)
select a from test where a > ? and b = ? and c = ?(a)
select a from test where a = ? and c = ? (a)
select a from test where b = ? and c = ? (无)

查看索引

show index from table;
show keys from table;

分析索引使用情况
explain sql

参考
数据库存储引擎MySQL索引
极客时间:MySQL实战45讲 林晓斌 深入浅出索引(上)
24个经典的MySQL索引问题,你都遇到过哪些【阿里云开发者社区】

发表评论

电子邮件地址不会被公开。 必填项已用*标注