作者:莫那鲁道来源:http://thinkinJAVA.cn/1.索引索引,类似书籍的目录,可以根据目录的某个页码立即找到对应的内容 。
索引的优点:1. 天生排序,2. 快速查找 。
索引的缺点:1. 占用空间,2. 降低更新表的速度 。
注意点:小表使用全表扫描更快,中大表才使用索引 。超级大表索引基本无效 。
索引从实现上说,分成 2 种:聚集索引和辅助索引(也叫二级索引或者非聚集索引)
从功能上说,分为 6 种:普通索引,唯一索引,主键索引,复合索引,外键索引,全文索引 。
详细说说 6 种索引:
1、普通索引:最基本的索引,没有任何约束 。
2、唯一索引:与普通索引类似,但具有唯一性约束 。
3、主键索引:特殊的唯一索引,不允许有空值 。
4、复合索引:将多个列组合在一起创建索引,可以覆盖多个列 。
5、外键索引:只有InnoDB类型的表才可以使用外键索引,保证数据的一致性、完整性和实现级联操作 。
6、全文索引:MySQL 自带的全文索引只能用于 InnoDB、MyISAM,并且只能对英文进行全文检索,一般使用全文索引引擎(ES,Solr) 。
注意:主键就是唯一索引,但是唯一索引不一定是主键,唯一索引可以为空,但是空值只能有一个,主键不能为空 。
另外,InnoDB 通过主键聚簇数据,如果没有定义主键且没有定义聚集索引,MySql 会选择一个唯一的非空索引代替,如果没有这样的索引,会隐式定义个 6 字节的主键作为聚簇索引,用户不能查看或访问 。
简单点说:
1、设置主键时,会自动生成一个唯一索引,如果之前没有聚集索引,那么主键就是聚集索引 。
2、没有设置主键时,会选择一个不为空的唯一索引作为聚集索引,如果还没有,那就生成一个隐式的 6 字节的索引 。
MySql 将数据按照页来存储,默认一页为 16kb,当你在查询时,不会只加载某一条数据,而是将这个数据所在的页都加载到 pageCache 中,这个其实和 OS 的就近访问原理类似 。
MySql 的索引使用 B+ 树结构 。在说 B+ 树之前,先说说 B 树,B 树是一个多路平衡查找树,相较于普通的二叉树,不会发生极度不平衡的状况,同时也是多路的 。
B 树的特点是:他会将数据也保存在非页子节点 。
看图可知:
文章插图
而这个特点会导致非页子节点不能存储大量的索引 。
而 B+ Tree 就是针对这个对 B tree 做了优化 。如下图所示:
文章插图
我们看到,B+ Tree 将所有的 data 数据都保存到了叶子节点中,非也子节点只保存索引和指针 。
我们假设一个非页子节点是 16kb,每个索引,即主键是 bigint,即 8b,指针为 8b 。那么每页能存储大约 1000 个索引(16kb/ 8b + 8b).
而一颗 3 层的 B+树能够存储多少索引呢?
如下图:
文章插图
大约能够存储 10 亿个索引 。通常 B+ 树的高度在 2-4 层,由于 MySql 在运行时,根节点是常驻内存的,因此每次查找只需要大约 2 -3 次 IO 。可以说,B+ 树的设计,就是根据机械磁盘的特性来进行设计的 。
知道了索引的设计,我们能够知道另外一些信息:
1、MySql 的主键不能太大,如果使用 UUID 这种,将会浪费 B+ 树的非叶子节点 。
2、MySql 的主键最好是自增的,如果使用 UUID 这种,每次插入都会调整 B+树,从而导致页分裂,严重影响性能 。
那么,如果项目中使用了分库分表,我们通常都会需要一个主键进行 sharding,那怎么办呢?在实现上,我们可以保留自增主键,而逻辑主键用来作为唯一索引即可 。
2.锁机制关于 Mysql 的锁,各种概念就会喷涌而出,事实上,锁有好几种维度,我们来解释一下 。
1.类型维度
共享锁(读锁 / S 锁)
排它锁(写锁 / X 锁)
类型细分:
- 意向共享锁
- 意向排他(互斥)锁
乐观锁(使用版本号字段,类似 CAS 机制,即用户自己控制 。缺点:并发很高的时候,多了很多无用的重试)
2.锁的粒度(粒度维度)
表锁
页锁(Mysql BerkeleyDB 引擎)
行锁(InnoDB)
3.锁的算法(算法维度)
Record Lock(单行记录)
Gap Lock(间隙锁,锁定一个范围,但不包含锁定记录)
推荐阅读
- MySQL基于GTID的多线程同步方案
- 11条MySQL规范,你知道的有几个? Java架构师追风 2019-08-28 16:36:08
- MySQL索引原理
- MySQL、SQL Server、Oracle对比,你必须了解的三大数据库区别
- MySQL 百万级数据量分页查询方法及其优化
- Python连接MySQL数据库方法介绍
- MySQL高压缩引擎TokuDB 揭秘
- 世界上最好的玫瑰 有几种玫瑰
- 如何创建MySQL用户帐户和授予权限
- 茶席布置三大要素之二 音乐的选播