1.聚集索引与非聚集索引的区别
(1)一个表中只能拥有一个聚集索引,而非聚集索引一个表可以存在多个。
(2)聚集索引,索引中键值的逻辑顺序决定了表中相应行的物理顺序;非聚集索引,索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同。
(3)索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。
(4)聚集索引:物理存储按照索引排序;非聚集索引:物理存储不按照索引排序;
2.为什么要用B+树,为什么不用普通二叉树?
可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数,为什么不是普通二叉树,为什么不是平衡二叉树,为什么不是B树,而偏偏是B+树呢?
(1)为什么不是普通二叉树?
如果二叉树特殊化为一个链表,相当于全表扫描。平衡二叉树相比于二叉查找树来说,查找效率更稳定,总体的查找速度也更快。
(2)为什么不是平衡二叉树?
我们知道,在内存比在磁盘的数据,查询效率快得多。如果树这种数据结构作为索引,那我们每查找一次数据就需要从磁盘中读取一个节点,也就是我们说的一个磁盘块,但是平衡二叉树可是每个节点只存储一个键值和数据的,如果是B树,可以存储更多的节点数据,树的高度也会降低,因此读取磁盘的次数就降下来啦,查询效率就快啦。
(3)为什么不是B树而是B+树?
B+树非叶子节点上是不存储数据的,仅存储键值,而B树节点中不仅存储键值,也会存储数据。innodb中页的默认大小是16KB,如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询的效率也会更快。
B+树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的,链表连着的。那么B+树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。
3.Hash索引和B+树索引区别是什么?
· B+树可以进行范围查询,Hash索引不能。
· B+树支持联合索引的最左侧原则,Hash索引不支持。
· B+树支持order by排序,Hash索引不支持。
· Hash索引在等值查询上比B+树效率更高。
· B+树使用like进行模糊查询的时候,like后面(比如%开头)的话可以起到优化的作用,Hash索引根本无法进行模糊查询。
4.什么是最左前缀原则?什么是最左匹配原则?
最左前缀原则,就是最左优先,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。
当我们创建一个组合索引的时候,如(a1,a2,a3),相当于创建了(a1)、(a1,a2)和(a1,a2,a3)三个索引,这就是最左匹配原则。
5.索引不适合哪些场景?
· 数据量少的不适合加索引
· 更新比较频繁的也不适合加索引=区分度低的字段不适合加索引(如性别)
6.索引有哪些优缺点?
(1)优点:
· 唯一索引可以保证数据库表中每一行的数据的唯一性
· 索引可以加快数据查询速度,减少查询时间
(2)缺点:
· 创建索引和维护索引要耗费时间
· 索引需要占物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间
· 以表中的数据进行增、删、改的时候,索引也要动态的维护
7.悲观锁与乐观锁区别?
(1)悲观锁:
每次拿数据时都认为别人会修改,所以每次那数据时都会上锁,别人拿数据时会阻塞直到拿到锁。
(2)乐观锁:
每次拿数据都默认别人不会修改,所以不会上锁,在更新的时候会判断一下在此期间别人有没有去更新这个数据。
实现方式:乐观锁一般会使用版本号机制或CAS算法实现。
MVCC (Multiversion Concurrency Control),即多版本并发控制技术。
MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁
8.MySQL事务得四大特性以及实现原理?
· 原子性:事务是最小的执行单位,不允许分割。作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
· 一致性:执行事务后,数据从一个正确的状态转换到另一个正确的状态。
· 隔离性:多个事务并发访问时,事务之间是相互隔离的,即一个事务不影响其它事务运行效果。简言之,就是事务之间是进水不犯河水的。
· 持久性:表示事务完成以后,该事务对数据库所作的操作更改,将持久地保存在数据库之中。
事务的隔离级别有哪些?MySQL的默认隔离级别是什么?(注意英文)
· 读取未提交(Read Uncommitted)
· 读取已提交(Read Committed)
· 可重复读(Repeatable Read)
· 可串行化(Serializable)
Mysql默认的事务隔离级别是可重复读(Repeatable Read)
9.什么是幻读,脏读,不可重复读?
事务A、B交替执行,事务A被事务B干扰到了,因为事务A读取到事务B未提交的数据,这就是脏读。
在一个事务范围内,两个相同的查询,读取同一条记录,却返回了不同的数据,这就是不可重复读。
事务A查询一个范围的结果集,另一个并发事务B往这个范围中插入/删除了数据,并静悄悄地提交,然后事务A再次查询相同的范围,两次读取得到的结果集不一样了,这就是幻读。
10.InnoDB与MyIsam的区别?
InnoDB 和 MyISAM 是 MySQL 数据库管理系统中最常用的两种存储引擎。它们各自有不同的特性和用途,适合不同的应用场景。
10.1. 事务支持:
- InnoDB 支持事务(Transaction),具有提交(COMMIT)和回滚(ROLLBACK)的能力,适合需要高可靠性和数据完整性的应用。
- MyISAM 不支持事务,适合读密集型的应用场景。
10.2. 行级锁与表级锁:
- InnoDB 支持行级锁(Row-level locking)和外键约束,能够更有效地支持并发访问,减少锁竞争。
- MyISAM 只支持表级锁(Table-level locking),并发写操作时可能会锁定整个表,影响性能。
10.3. 数据恢复:
- InnoDB 提供了更加强大的数据恢复能力,通过日志(如事务日志)来实现。
- MyISAM 在遇到崩溃后的数据恢复方面表现不如 InnoDB。
10.4. 全文索引:
- MyISAM 早期支持全文索引(Full-text indexing),适合文本搜索应用。但从 MySQL 5.6 版本开始,InnoDB 也支持全文索引。
- InnoDB 现在也支持全文索引,且随着版本更新,其全文索引的性能和功能都在不断增强。
10.5. 存储限制:
- InnoDB 文件大小一般受到操作系统文件大小的限制,可以支持较大的数据量。
- MyISAM 的表大小限制较小,这在一些操作系统上可能成为限制。
11.delete drop的区别?
DELETE 和 DROP 是 SQL 语句中用于删除数据的两个不同命令,它们的作用范围和影响也不同。
DELETE:
- DELETE 用于删除表中的一行或多行记录,并且可以有条件地选择删除哪些行。
- 使用 DELETE 删除记录后,表的结构仍然存在,且可以再次插入新的数据。
- DELETE 操作可以回滚(如果在事务中使用),不会立即释放空间,除非执行了数据库的压缩或清理操作。
- DELETE 操作相对较慢,因为它逐行删除数据,并且记录日志以便于事务回滚。
DROP:
- DROP 用于删除整个表或数据库,包括表中的数据和表的结构。
- 使用 DROP 命令后,表或数据库被完全移除,无法回滚(在非事务性存储引擎中),且相关的空间会被立即释放。
- DROP 操作执行速度快,因为它不逐行处理数据,而是直接移除整个结构。
- DROP 除了用于删除表和数据库外,也可以用于删除索引、视图等数据库对象。
简而言之,DELETE 主要用于删除表中的部分或全部数据,而不影响表结构;而 DROP 用于彻底删除表或数据库,包括其结构和数据。
12 连接 (内连接,外连接)
在 SQL 中,连接(JOIN)用于结合两个或多个表中的行。连接主要分为内连接和外连接,每种连接都有其特定用途。
内连接(INNER JOIN):
- 内连接返回两个表中匹配的行。如果在一个表中的行在另一个表中有对应的行,则这些行会被内连接返回。
- 如果某行在任一表中没有匹配,则不会返回该行。
- 内连接可以看作两个表的交集。
外连接(OUTER JOIN):
- 外连接返回至少包含一个表中的所有行,即使另一个表中没有匹配的行。外连接分为左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。
- 左外连接(LEFT OUTER JOIN):返回左表的所有行,即使右表中没有匹配的行。如果右表中没有匹配的行,则结果集中右表的部分将为 NULL。
- 右外连接(RIGHT OUTER JOIN):返回右表的所有行,即使左表中没有匹配的行。如果左表中没有匹配的行,则结果集中左表的部分将为 NULL。
- 全外连接(FULL OUTER JOIN):返回左表和右表中的所有行。如果某些行在另一表中没有匹配,则那一部分将为 NULL。
13 数据库三大范式
数据库的范式(Normalization)是为了减少数据冗余和提高数据完整性而设计的一组规则。每一级范式都建立在前一级范式的基础上:
第一范式(1NF):
- 数据表中的所有字段都是不可分割的原子值,确保每列的原子性。
- 数据表的每一列都是唯一的。
第二范式(2NF):
- 在第一范式的基础上,所有非主属性完全依赖于主键。即表必须有一个主键,非主属性不能依赖于主键的一部分(对于复合主键而言)。
- 解决了部分依赖问题。
第三范式(3NF):
- 在第二范式的基础上,非主属性不依赖于其他非主属性,即消除了传递依赖。
- 一个表中没有任何属性依赖于其他非主键的属性。
范式化的目标是减少数据冗余,避免数据异常,提高数据的逻辑一致性。然而,过度范式化可能会导致查询性能下降,因为可能需要更多的表连接操作。在实际应用中,设计数据库时需要在范式化和性能之间做出平衡。
以及数据库的查询等等的语句,建议多刷题!!