数据库 数据库基础 事务的概念和特性? 会出现哪些并发一致性问题? 数据库的四种隔离级别? 什么是乐观锁和悲观锁? 常见的封锁类型? 什么是三级封锁协议? 四种隔离级别的实现原理? 什么是两段锁协议? 什么是 MVCC? 数据库的范式? 列举几种表连接方式? 什么是存储过程?有哪些优缺点? Drop/Delete/Truncate的区别? 什么是视图?什么是游标? MySQL 数据库索引的实现原理(B+树) 使用索引的优点 哪些情况下索引会失效? 在哪些地方适合创建索引? 索引的分类? MySQL的两种存储引擎 InnoDB 和 MyISAM 的区别? 如何优化数据库? 什么是主从复制?实现原理是什么? NoSQL/Redis 关系型数据库和非关系型数据库的区别? 参考 事务的概念和特性?
概念:事务(Transaction)是一个操作序列,不可分割的工作单位,以BEGIN TRANSACTION开始,以ROLLBACK/COMMIT结束
特性(ACID):
意向锁是 InnoDB 自动加的, 不需用户干预。
对于 UPDATE、 DELETE 和 INSERT 语句, InnoDB
会自动给涉及数据集加排他锁(X);
对于普通 SELECT 语句,InnoDB 不会加任何锁;
事务可以通过以下语句显式给记录集加共享锁或排他锁:
共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。 其他 session 仍然可以查询记录,并也可以对该记录加 share mode 的共享锁。但是如果当前事务需要对该记录进行更新操作,则很有可能造成死锁。
排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。其他 session 可以查询该记录,但是不能对该记录加共享锁或排他锁,而是等待获得锁
锁的作用:用于管理对共享资源的并发访问,保证数据库的完整性和一致性
MySQL 中提供了两种封锁粒度:行级锁以及表级锁。
封锁粒度小:
SELECT ... LOCK In SHARE MODE; SELECT ... FOR UPDATE;
事务必须严格分为两个阶段对数据进行加锁和解锁的操作,第一阶段加锁,第二阶段解锁。也就是说一个事务中一旦释放了锁,就不能再申请新锁了。
可串行化调度是指,通过并发控制,使得并发执行的事务结果与某个串行执行的事务结果相同。事务遵循两段锁协议是保证可串行化调度的充分条件。
多版本并发控制(Multi-Version Concurrency Control, MVCC),MVCC在每行记录后面都保存有两个隐藏的列,用来存储创建版本号和删除版本号。
通过版本号减少了锁的争用,提高了系统性能;可以实现提交读和可重复读两种隔离级别,未提交读无需使用MVCC
使用 MVCC 读取的是快照中的数据,这样可以减少加锁所带来的开销:
select * from table ...;
当前读读取的是最新的数据,需要加锁。以下第一个语句需要加 S 锁,其它都需要加 X 锁:
select * from table where ? lock in share mode; select * from table where ? for update; insert; update; delete;

存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合。想要实现相应的功能时,只需要调用这个存储过程就行了(类似于函数,输入具有输出参数)。
优点:
缺点:
触发器(TRIGGER)是由事件(比如INSERT/UPDATE/DELETE)来触发运行的操作(不能被直接调用,不能接收参数)。在数据库里以独立的对象存储,用于保证数据完整性(比如可以检验或转换数据)。
约束(Constraint)类型:主键(Primary Key)约束,唯一约束(Unique),检查约束,非空约束,外键(Foreign Key)约束。
InnoDB的索引使用的是B+树实现,B+树对比B树的好处:
哈希索引能以 O(1) 时间进行查找,但是只支持精确查找,无法用于部分查找和范围查找,无法用于排序与分组;B树索引支持大于小于等于查找,范围查找。哈希索引遇到大量哈希值相等的情况后查找效率会降低。哈希索引不支持数据的排序。
缺点:建立和维护索引耗费时间空间,更新索引很慢。
更详细的可以参考:MySQL 数据库的存储引擎与适用场景 - Images
分析慢查询日志:记录了在MySQL中响应时间超过阀值long_query_time的SQL语句,通过日志去找出IO大的SQL以及发现未命中索引的SQL
使用 Explain 进行分析:通过explain命令可以得到表的读取顺序、数据读取操作的操作类型、哪些索引可以使用、哪些索引被实际使用、表之间的引用以及被扫描的行数等问题;
!=、<、>操作符或对字段进行null值判断,否则将引擎放弃使用索引而进行全表扫描;注意会引起索引失效的情况,以及在适合的地方建立索引
主从复制(Replication)是指数据可以从一个MySQL数据库主服务器复制到一个或多个从服务器,从服务器可以复制主服务器中的所有数据库或者特定的数据库,或者特定的表。默认采用异步模式。
实现原理: