1),********说一下 ACID 是什么?
******************
原子性(Atomicity)
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的
所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来
说,不可能只执行其中的一部分操作,这就是事务的原子性
一致性(Consistency)
数据库总是从一个一致性的状态转换到另一个一致性的状态。(在
前面的例子中,一致性确保了,即使在执行第三、四条语句之间时
系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交
,所以事务中所做的修改也不会保存到数据库中。)
隔离性(Isolation)
通常来说,一个事务所做的修改在最终提交以前,对其他事务是不
可见的。(在前面的例子中,当执行完第三条语句、第四条语句还
未开始时,此时有另外的一个账户汇总程序开始运行,则其看到支
票帐户的余额并没有被减去200美元。)
持久性(Durability)
一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使
系统崩溃,修改的数据也不会丢失。)
2). *****************说一下乐观锁和悲观锁?
乐观锁:对加锁持有一种乐观的态度,即先进行业务操作,不到最
后一步不进行加锁,"乐观"的认为加锁一定会成功的,在最后一步
更新数据的时候在进行加锁。乐观锁的实现方式一般为每一条数据
加一个版本号
update时判断这个版本号是否和数据库里的一致,提交数据前后是
否冲突。
update是单线程的,及如果一个线程对一条数据进行update操作,
会获得锁,其他线程如果要对同一条数据操作会阻塞,直到这个线
程update成功后释放锁。
悲观锁:悲观锁对数据加锁持有一种悲观的态度。因此,在整个数
据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数
据库提供的锁机制
备注,在MySQL中使用悲观锁,必须关闭MySQL的自动提交,set
autocommit=0。MySQL默认使用自动提交autocommit模式,也即你执
行一个更新操作,MySQL会自动将结果提交
3),*************************排它锁 & 共享锁你了解吗 ?
首先说明:数据库的增删改操作默认都会加排他锁,而查询不会加
任何锁。都是行级锁
|--共享锁:对某一资源加共享锁,自身可以读该资源,其他人也可
以读该资源(也可以再继续加共享锁,即 共享锁可多个共存),但
无法修改。要想修改就必须等所有共享锁都释放完之后。语法为:
select * from table lock in share mode
|--排他锁:对某一资源加排他锁,自身可以进行增删改查,其他人
无法进行任何操作。语法为:
select * from table for update
4). ********************说一下 mysql 的行锁和表锁
行锁的劣势:开销大;加锁慢;会出现死锁
行锁的优势:锁的粒度小,发生锁冲突的概率低;处理并发的能力
强
表锁的优势:开销小;加锁快;无死锁
表锁的劣势:锁粒度大,发生锁冲突的概率高,并发处理能力低
1 InnoDB 支持表锁和行锁,使用索引作为检索条件修改数据时采用
行锁,否则采用表锁。
2 InnoDB 自动给修改操作加锁,给查询操作不自动加锁
3 行锁可能因为未使用索引而升级为表锁,所以除了检查索引是否
创建的同时,也需要通过explain执行计划查询索引是否被实际使用
4 行锁相对于表锁来说,优势在于高并发场景下表现更突出,毕竟
锁的粒度小。
5 当表的大部分数据需要被修改,或者是多表复杂关联查询时,建
议使用表锁优于行锁。
6 为了保证数据的一致完整性,任何一个数据库都存在锁定机制。
锁定机制的优劣直接影响到一个数据库的并发处理能力和性能
若你不清楚InnoDB的行锁会升级为表锁,那以后会吃大亏的
5). 说一下数据库的事务隔离?
更新丢失----read uncommitted(读未提交)
脏读------写禁止读,防止脏读
不可重复读-----repeatable read 可重复读取
幻读(虚读)-------serializable 序列化
6).******mysql 的内连接、左连接、右连接有什么区别?
1.内连接,显示两个表中有联系的所有数据;
select a.*,b.* from a inner join b on a.id=b.parent_id
2.左链接,以左表为参照,显示所有数据,右表中没有则以null显示
select a.*,b.* from a left join b on a.id=b.parent_id
3.右链接,以右表为参照显示数据,,左表中没有则以null显示
select a.*,b.* from a right join b on a.id=b.parent_id
补充:完全连接 显示两个表中所有的数据
select a.*,b.* from a full join b on a.id=b.parent_id
7),mysql 索引是怎么实现的?
索引是满足某种特定查找算法的数据结构,而这些数据结构会以某
种方式指向数据,从而实现高效查找数据。
具体来说 MySQL 中的索引,不同的数据引擎实现有所不同,但目前
主流的数据库引擎的索引都是 B+ 树实现的,B+ 树的搜索效率,可
以到达二分法的性能,找到数据区域之后就找到了完整的数据结构
了,所有索引的性能也是更好的。
8). 怎么验证 mysql 的索引是否满足需求?
使用 explain 查看 SQL 是如何执行查询语句的,从而分析你的索
引是否满足需求。
explain 语法:explain select * from table where type=1。
9). 说一下 mysql 常用的引擎?
InnoDB 引擎:InnoDB 引擎提供了对数据库 acid 事务的支持,并
且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据
容量的数据库系统。MySQL 运行的时候,InnoDB 会在内存中建立缓
冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时
启动也比较的慢,它是不会保存表的行数的,所以当进行 select
count(*) from table 指令的时候,需要进行扫描全表。由于锁的
粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用
会提升效率的。
MyIASM 引擎:MySQL 的默认引擎,但不提供事务的支持,也不支持
行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时
候需要锁定这个表,所以会导致效率会降低。不过和 InnoDB 不同
的是,MyIASM 引擎是保存了表的行数,于是当进行 select count
(*) from table 语句时,可以直接的读取已经保存的值而不需要进
行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需
要事务的支持的,可以将 MyIASM 作为数据库引擎的首选。
10). mysql 问题排查都有哪些手段?
使用 show processlist 命令查看当前所有连接信息。
使用 explain 命令查询 SQL 语句执行计划。
开启慢查询日志,查看慢查询的 SQL。
11). 如何做 mysql 的性能优化?
为搜索字段创建索引。
避免使用 select *,列出需要查询的字段。
垂直分割分表。
选择正确的存储引擎。
12). 如何获取当前数据库版本
使用 select version() 获取当前 MySQL 数据库版本。
13). 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重
启mysql 数据库,又插入了一条数据,此时 id 是几
表类型如果是 InnoDB,那 id 就是 6。
表类型如果是 MyISAM ,那 id 就是 8。
14). 数据库的三范式是什么?
第一范式:强调的是列的原子性,即数据库表的每一列都是不可分
割的原子数据项。
第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是
指不能存在仅依赖主关键字一部分的属性。
第三范式:任何非主属性不依赖于其它非主属性。