数据库索引
1、索引是什么?
索引一种数据数据结构,既结构数据,大白话说:索引就是一种组织数据的方式
那么索引到底如何组织数据的呢?
为表中的一条条记录创建建立索引就跟为书的一页页内容创建目录很类似,但不太一样
不一样的是,创建索引分为两步:
1、以索引字段为key与数据对应,例如
create index idx_id on t1(id); -- key为id
创建索引
key
记录1 <- 1
记录2 <- 2
记录3 <- 3
记录4 <- 4
记录5 <- 5
。。。
2、以key为基础构建B+树,那么什么是B+树???
介绍下列树的原理结构以及特点-》讲明白下列树是如何提速查询的,以及每种树的问题和演变升级过程
二叉树
平衡二叉树
B树
B+树
特点总结:
1、节点内放的key+value:二叉树、平衡二叉树、B树
在叶子节点放value,其余节点只放key值:B+树
2、放等量数据的前提下,B+树的高度最低,查询速度最高
2、索引分类及区别
hash索引
b+树
3、 B+树索引分类
聚簇索引:构建原理,只能有一个
典型特点:叶子节点放key:一整条完整记录
辅助索引:构建原理,可以有多个
典型特点:叶子节点放的是key:该记录对应的主键id
4、覆盖索引与回表操作
命中辅助索引是否一定需要回表,如果不,解释原因
5、联合索引,索引的最左前缀匹配原则-》举例说明
6、索引下推技术
7、举例说明,命中索引之后是否一定对加速有明显的提升------》等同于回答了如何正确使用索引!!!
范围过大
索引字段占用空间过多
索引字段的区分度低
索引字段参与运算
索引字段放入函数
explain命令简介
8、常识
单表300w条记录-》硬盘空间200m
uv:user view单日累计用户访问
2-5w
pv:page view单日累计页面被点击的次数
20w-50w
最大并发(同时在线人数最大多少):一天内,某一时刻的并发量
1000人同时在线
数据库(读多写少):
累计2w的UV,平均每人往数据库中写入一条数据,
那么单日新增数据条数为2w条
2w条数据库-》占用空间大概2M
结论:以2-5w uv为例,单日数据库空间增长量从几M到几十M不等
9、MySQL 建立索引时,应该注意什么?
三点:
1. 对区分度高的列做索引, 对于那种只有两三个值的做索引并没有多大意义。
2. 建立联合索引时要满足最左匹配原则,例如 SELECT * FROM TABLE WHERE A=1 AND B=2 AND C=3, 此时需要对ABC建联合索引, 对ABC 单独建三个索引是没用的。 那我对BAC建联合索引就命中不了索引了吗?也是可以命中的,其实MySQL在很久以前就在查询优化器里加入了这个feature,确实是可以命中的。 3. 只对需要作为查询条件的列建索引,否则会拖慢插入速度。
数据库事务
举例说明事务特性ACID
事务开启的三种方式
事务可以设置保存点
数据库读现象
脏读
不可重复
幻读
数据库锁
粒度:行级 < 页级 < 表级 # innodb数据存储结构见:https://egonlin.com/?p=492
级别越高并发越低,考虑到性能,innodb默认支持行级锁,但是只有在命中索引的情况下才锁行,否则锁住所有行,本质还是行锁,
但是此刻相当于锁表了
行级锁有三种算法:
Record lock
Gap lock
Next-key lock(默认)= Record lock+ Gap lock ------》 解决幻读问题
级别:排他、共享
排他
共享
使用方式:悲观、乐观
事务隔离机制
解决:
脏读
不可重复
幻读
方案:
RR机制+innodb存储引擎的Next-key lock行级锁算法
MVCC:解释原理
快照读
select 。。。
当前读
其他都是