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 update4). ********************说一下 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_id7),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). 数据库的三范式是什么?
第一范式:强调的是列的原子性,即数据库表的每一列都是不可分
割的原子数据项。第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是 指不能存在仅依赖主关键字一部分的属性。第三范式:任何非主属性不依赖于其它非主属性。