数据库
首页 > 数据库> > MySQL知识点汇集

MySQL知识点汇集

作者:互联网

索引的本质

索引是帮助MySQL高效获取数据的排好序的数据结构;

比如现在一百个数,那么如何快速获取中间值,常见的可以用二叉树,来快速定位数据,减少查询的次数;

索引的选择

常见的数据结构有:

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 这个网页可以帮助理解各种树

MySQL最终选择的是B+树

假如一个节点是16KB,且主键是Bigint(占用内存8B) ,主键间存储的内存地址假设占用内存B,那么一层可以存储1170个节点;依次类推,这样的高度为3的B+树大概可以存储2000W数据;

存储引擎

MySQL存储引擎是形容表的;

MyISAM存储引擎

文件存储格式为三个:

采用B+树 树的子节点存储的是数据的地址,获取到数据地址后再去MYD文件查询具体数据;

这种查询方式的索引也叫做非聚集索引

INNODB存储引擎

文件存储格式为两个:

采用B+树 树的子节点存储的就是数据,减少了回表。根据索引可以直接查询到数据;

这种查询方式的索引叫做聚集索引 也叫聚簇索引

为什么INNODB要求必须有主键且推荐采用自增主键,而MyISAM却不需要?
联合索引是怎么样的?

理解以上联合索引后,我们可以很清晰的理解索引的匹配原则;

MySQL 索引匹配原则

在我们了解到MySQL底层数据结构B+树后,这些规则其实很好理解;

索引匹配原则如下:

假设现在有一张表student_score,表中有5个字段,id,class, name,course,score,其中id为主键,有四条数据

并且我们以class、name、course建立了联合索引;

等值匹配

假设现在有一条sql如下

select * from student_score where class = '1班' and name = '张三' and course = '数学'

这条语句中就会用到所有的索引字段,首先找class,然后查找name,最后查找course

最左侧列匹配

假设有一条sql如下

select * from student_score where course = '数学'

该SQL语句就不会用到索引,因为B+树中,索引的使用是从左到右的,不能跳过左边的,直接查找右边的,我们可以用explain来看一下

确定这里是没有用到索引的,这条SQL可以改成

select * from student_score where class = '1班' and name = '张三'

这样就可以用到索引了

因此在建立索引的时候,我们需要考虑表中的字段,到底哪些字段是最常被用于查找的

最左前缀匹配

这条原则适用于模糊匹配的时候,也就是需要用到like的时候,假设有一条SQL如下

select * from student_score where class like '1%'

这里是可以用到索引的,印在B+索引树中,数据都是按照字段来排序的,比如这里有联合索引 key(class、name、course) ,那么数据会按照class排序

但是如果你把SQL写成了下面这样,就用不到索引了,因为匹配不到最左前缀

select * from student_score where class like '%班'

范围查找

我们可以通过> 、 <这种范围比较来查找数据

select * from student_score where class > '1班' and class < '3班'

通过explain,可以看到,这条sql是用到了索引的
但是如果你把sql改成下面这样的,就不会用到索引了

select * from student_score where name > '张三'

因为该联合索引的B+树中只能根据class字段来进行范围查找,也就是联合索引中最左侧的字段

等值匹配+范围查找

假设有一条SQL如下

select * from student_score where class = '1班' and name > '张三' and course > '数学'

通过explain分析后,可以看到,这里也会用到索引

并发事务带来的问题

Mysql隔离级别

MySQL 锁

表锁 & 行锁
锁算法
行锁算法
表锁算法
锁的实现
共享锁 & 排它锁

是行锁与表锁的一个具体实现

某个事务获取数据的排它锁,其他事务不能获取该数据的任何锁,并不代表其他事务不能无锁读取该数据;

标签:知识点,事务,name,索引,where,汇集,MySQL,数据,class
来源: https://www.cnblogs.com/heyouxin/p/14127129.html