赞
踩
MyISAM:不支持外键和事务,只支持表级锁
InnoDB:默认引擎,支持外键和事务,支持表级锁和行级锁
第一范式:确保每列保持原子性,数据表中的所有字段值都是不可分解的原子值
第二范式:确保表中的每列都和主键相关
第三范式:确保每列都和主键列直接相关而不是间接相关
整数,浮点数,字符串,日期
1.优缺点?
优点:
缺点:
空间角度考虑:建立索引需要占用物理空间,耗费资源
时间角度考虑:创建和维护索引都需要花费时间
索引创建原则:
应该创建索引的列:
不该创建索引的列:
索引的数据结构:
1.B-TREE
B-树就是B树,多路搜索树,树高一层意味着多一次的磁盘I/O
特征:
2.B+TREE
B+树是B-树的变体,也是一种多路搜索树
特征:
3. HASH
哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。
懒得看每个的特点那你就看我给你总结好的也就是面试官爱问的
1.B树和B+树的区别?
2. Hash索引和B+树索引的区别?
因为两者的数据结构不同,所以导致他们的场景也不同,哈希索引一般用于精确查找,B+树索引则多用于除了精确的等值查找外的其他查找,但是在绝大多数情况下都是用B+树索引。
3. 数据库为什么使用B+树索引而不是B树索引?
你可以答B树与B+树的区别,你也可以从特点答:
索引分类:
功能分类:
1. 普通索引:一张表可以创建多个普通索引,一个普通索引可以包含多个字段,允许数据重复,允许 NULL 值插入。实现代码:
CREATE INDEX IndexName ON TableName(字段名(length));
或者
ALTER TABLE TableName ADD INDEX IndexName(字段名(length));
2. 唯一索引:数据列不允许重复,允许为 NULL 值,一张表可有多个唯一索引,索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。实现代码:
CREATE UNIQUE INDEX IndexName ON TableName(字段名(length));
或者
CREATE UNIQUE INDEX IndexName ON TableName(字段名(length));
3. 主键索引:一张表只能有一个主键索引,不允许重复、不允许为 NULL;
ALTER TABLE TableName ADD PRIMARY KEY(column_list);
4. 全文索引:它查找的是文本中的关键词,主要用于全文检索。(接着看 mybro)
物理分类:
1. 聚簇索引:不是单独的一种索引类型,而是一种数据存储方式。这种存储方式是依靠B+树来实现的,根据表的主键构造一棵B+树且B+树叶子节点存放的都是表的行记录数据时,方可称该主键索引为聚簇索引。聚簇索引也可理解为将数据存储与索引放到了一块,找到索引也就找到了数据。
聚簇是为了提高某个属性(或属性组)的查询速度,把这个或这些属性(称为聚簇码)上具有相同值的元组集中存放在连续的物理块。
2. 非聚簇索引:数据和索引是分开的,B+树叶子节点存放的不是数据表的行记录。
注意:虽然InnoDB和MyISAM存储引擎都默认使用B+树结构存储索引,但是只有InnoDB的主键索引才是聚簇索引,InnoDB中的辅助索引以及MyISAM使用的都是非聚簇索引。每张表最多只能拥有一个聚簇索引。
一天一个小扩展:聚簇索引优缺点?
优点:
缺点:
弯道超车小tips
Mysql中key 、primary key 、unique key 与index区别
key 与 index 区别:
key 种类:等价普通索引 key 键名 (列)
约束作用(constraint),主键约束(unique,not null,一表一主键,唯一标识记录),规范存储主键和强调唯一性为这个key建立主键索引
约束作用(constraint),unique约束(保证列或列集合提供了唯一性)为这个key建立一个唯一索引
约束作用(constraint),外键约束,规范数据的引用完整性为这个key建立一个普通索引
最左匹配原则:
从左边为起点开始连续匹配,遇到阀内查询(<、>、between、like)会停止匹配
前缀索引:
有时候需要索引很长的字符列,这会让索引变得大且慢。通常可以以某列开始的部分字符作为索引,这样可以大大节约索引空间,从而提高索引效率。但这样也会降低索引的选择性。索引的选择性是指不重复的索引值和数据表的记录总数的比值,索引的选择性越高则查询效率越高。
两个小思考:
使用索引查询一定能让性能提升吗?
不一定,因为创建索引和维护索引需要花费时间和空间代价,所以如果没有合理使用索引反而会使查询性能下降
非聚簇索引一定会进行回表查询吗?
回表查询:上面说了非聚簇索引的叶子结点存储的是主键,也就是说要先通过非聚簇索引找到主键,在通过聚簇索引找到主键对应的数据,后面在通过聚簇索引找到主键对应的数据的过程就是回表查询。
答案是不一定的,这里涉及到一个索引覆盖的问题,如果查询的数据在辅助索引上完全能获取到便不需要回表查询。
通过索引覆盖就能解决非聚簇索引回表查询的问题
索引失效:
事务四大特性:
数据库的并发一致性问题
当多个事务并发执行时,可能会出现以下问题:
数据库隔离级别:
隔离级别是如何实现的:
事务的隔离机制只要是依靠锁机制和MVCC(多版本并发控制)实现的,提交读和可重复读可通过MVCC实现,串行化可以通过锁机制实现
MVCC:
MVCC是一种控制并发的方法,主要提高数据库的并发性能。
在了解MVCC之前需要先了解当前读和快照读
- 当前读:读取的是数据库的最新版本,并且在读取是要保证其他事务不会修改当前记录,所以会对读取的记录加锁。
- 快照读:不加锁读取操作即为快照读,使用MVCC来读取快照中的数据,避免加锁带来的性能损耗
由此可以看出MVCC的作用就是在不加锁的情况下,解决数据库读写冲突的问题,并且解决脏读、幻读以及不可重复读。但是不能解决丢失修改问题
MVCC的实现原理:
- 版本号
- 行记录隐藏的列
- undo日志
什么是数据库的锁?
当数据有并发事务的时候,保证数据访问顺序的机制称为锁机制
数据库的锁和隔离级别的关系?
隔离级别 | 实现方式 |
未提交读 | 总是读取最新的数据,无需加锁 |
提交读 | 读取数据时加共享锁,读取数据后释放锁 |
可重复读 | 读取数据时加共享锁,读取数据后释放锁 |
串行化 | 锁定整个范围的键,一致持有锁直到事务结束 |
数据库锁的类型?
按照锁的粒度可以将MySQL锁分为三种:
MySQL锁类别 | 资源开销 | 加锁速度 | 是否会出现死锁 | 锁的粒度 | 并发度 |
表级锁 | 小 | 快 | 不会 | 大 | 低 |
行级锁 | 大 | 慢 | 会 | 小 | 高 |
页面锁 | 一般 | 一般 | 不会 | 一般 | 一般 |
MyISAM默认采用表级锁,InnoDB默认采用行级锁
从锁的类别上区分:
MySQL中的InnoDB引擎的行锁模式是如何实现的?
行锁模式:
在存在行锁和表锁的情况下,一个事务相对某个表加X锁时,需要先检查是否有其他事务对这个表加了锁或对这个表的某一列加了锁,对表的每一行都进行检测一次,这是效率非常低的,为了解决这种问题,实现了多粒度锁机制,InnoDB还有两种内部使用的意向锁,两种意向锁都是表锁
- 意向共享锁:简称IS锁,一个事务打算给数据行加共享锁之前必须先获得该表的IS锁
- 意向排他锁:简称IX锁,一个事务打算给数据行加排他锁之前必须先获得该表的IX锁
有了意向锁,一个事务想对某个表加X锁,只需检查是否有其他事务对这个表加了X/IX/S/IS锁即可
锁的兼容性:
行锁实现方式:
InnoDB的行锁是通过给索引上的索引项加锁实现的,如果没有索引,InnoDB将通过稳藏的聚簇索引来对记录进行加锁
InnoDB行锁主要分为三种情况:
InnoDB行锁的特性:如果不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,实际产生的效果和表锁是一样的。
乐观锁和悲观锁以及实现
死锁:
死锁是指两个或者两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。在MySQL中,MyISAM是一次获得所需的全部锁,要么全部满足,要么全部等待,所以不会出现死锁,在InnoDB存储引擎中,除了单个SQL组成的事务外,锁都是逐步获得的,所以存在死锁问题。
如何避免死锁或者锁冲突:
SQL语句分类:
子查询:
把一个查询结果在另一个查询中使用
连接查询:
drop、delete、truncate的区别?
一般来说,删除整个表使用drop,删除表的部分数据使用delete,保留表的结构删除表的全部数据使用truncate。
UNION和UNION ALL的区别?
union和union all的作用都是将两个结果集和并在一起
SQL语句优化:
视图:
视图是一种虚拟的表,具有和物理表相同的功能,可以对视图进行增改查操作,对视图的修改不影响基本表,使得我们获取数据更容易,相比多表查询
大表数据查询如何优化?
了解慢查询吗?统计过吗?如何优化?:
慢查询一般用于记录执行时间超过某个临界值的SQL语句的日志
相关参数:
如何对慢查询优化?
主键一般用自增ID还是UUID?
一般情况MySQL推荐使用自增ID,因为在MySQL的InnoDB的存储引擎中,追歼索引是一种聚簇索引,主键索引的B+树的叶子结点按照顺序存储主键值及数据,如果主键索引是自增ID,只需要按照顺序往后排列即可,如果是UUID,id是随机生成的,在数据插入的时候会造成大量的数据移动,产生大量的内存碎片,造成插入性能下降
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。