Mysql基础——索引

2021-01-02  本文已影响0人  chase_lwf

内容

一 索引基础

二 索引数据结构

mysql索引数据结构采用B+树,采用聚簇索引的方式来组织表,主键索引就是聚餐索引,树的B+树的叶子节点存储行的真实数据,非主键索引的叶子节点存储的是主键的值。

2.1 聚簇索引

每个InnoDB的表都拥有一个索引,称之为聚簇索引,此索引中存储着行记录,一般来说,聚簇索引是根据主键生成的。为了能够获得高性能的查询、插入和其他数据库操作,理解InnoDB聚簇索引是很有必要的。

聚簇索引按照如下规则创建:

Note: 对于选择唯一索引的顺序是按照定义唯一索引的顺序,而非表中列的顺序, 同时选中的唯一索引字段会充当为主键,或者InnoDB隐式创建的自增列也可以看做主键。
聚簇索引整体是一个b+树,非叶子节点存放的是键值,叶子节点存放的是行数据,称之为数据页,这就决定了表中的数据也是聚簇索引中的一部分,数据页之间是通过一个双向链表来链接的,B+树是一棵平衡查找树,也就是聚簇索引的数据存储是有序的,但是这个是逻辑上的有序,但是在实际在数据的物理存储上是,因为数据页之间是通过双向链表来连接,假如物理存储是顺序的话,那维护聚簇索引的成本非常的高。

2.2 B+定义:

B+树满足如下条件,即可称之为m阶B+树:

三 优化器为什么会选错索引?

四 普通索引和唯一所有如何选择?

如果业务不需要唯一索引来控制数据的唯一性,那么尽量优先考虑普通索引,原因在于唯一索引用不上change buffer机制来改进性能,
2.1 change buffer
在实际过程中,mysql利用change buffer对要更新行的数据页不在内存这种情况做了优化,针对数据页不在内存这种情况,如果更新操作总是需要去随机IO磁盘拿取数据,效果会差一些,所以在buffer pool内存中开辟了一段空间change buffer,当有更新、delete、 insert语句时会把这个操作先写入change buffer, 之后在进行merge操作时,再把change buffer记录的操作应用到原数据页;

五 如何给字符串添加索引

六 排序查询如何通过索引进行优化?

6.1 通过联合索引来优化排序

例如有个表:

CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `city` varchar(16) NOT NULL,
  `name` varchar(16) NOT NULL,
  `age` int(11) NOT NULL,
  `addr` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `city` (`city`)
) ENGINE=InnoDB;

执行如下语句时:

select name, city, age from people where city='昆明' order by name limit 100;

6.2 order by 是如何工作的呢?

mysql排序执行方式有两种,分别是:全字段排序和rowid排序。
全字段排序:
例如上面的搜索语句,根据city获取数据,然后根据name排序,其基本流程是:

rowid排序:

引用:《丁奇45讲》

上一篇下一篇

猜你喜欢

热点阅读