✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:Java面试题总结
✨特色专栏:国学周更-心性养成之路
🥭本文内容:MySQL数据库高级面试题(1)
更多内容点击👇
MySQL数据库基础面试题
本文目录
- Q1. 数据库的三范式是什么
- Q2. 数据库引擎有哪些
- Q3. InnoDB与MyISAM的区别
- Q4. 什么是事务?
- Q5. 事务的特性
- Q6. 什么是索引
- Q7. mysql有几种不同的索引
- Q8. 简述你进行过的SQL优化
- Q9. 简单说一说drop、delete与truncate的区别
- Q10. 什么是视图
- Q11. 什么是内联接、左外联接、右外联接?
- Q12. 并发事务带来哪些问题?
- Q13. 事务隔离级别有哪些?MySQL的默认隔离级别是?
- Q14. 大表如何优化?
- Q15. 分库分表之后,id主键如何处理?
- Q16. mysql有关权限的表都有哪几个
- Q17. 创建索引的三种方式,删除索引
- Q18. 介绍几个MySQL存储引擎
- Q19. 简单的介绍索引
- Q20. 触发器的作用?
- Q21. 什么是存储过程?用什么来调用?
- Q22. 索引的作用?和它的优点缺点是什么?
- Q23. 维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?
- Q24. 什么是事务?什么是锁?
- Q25. 什么叫视图?游标是什么?
- Q26. 您如何确一个带有名为Fld1字段的TableB表格里只具有Fld1字段里的那些值,而这些值同时在名为TableA的表格的Fld1字段里?
- Q27. 对一个投入使用的在线事务处理表格有过多索引需要有什么样的性能考虑?
- Q28. 维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?
- Q29. 使用索引查询一定能提高查询的性能吗?为什么
- Q30. 列举几种表连接方式,并写出SQL语句? 什么是相关子查询?关联查询和相关子查询的区别?
- Q31. 如何优化数据库,如何提高数据库的性能?
- Q32. 设计数据库应注意那些问题
- Q33. 游标的作用?如何知道游标已经到了最后?
- Q34. 事前触发和事后触发有何区别?语句级触发和行级触发有何区别?
- Q35. 什么是数据模型?什么是规范化?
- Q36. 几种索引类型?
- Q37. 数据库的乐观锁和悲观锁是什么?数据库表锁和行锁又是什么?
- Q38. 简单说一说drop、delete与truncate的区别
- Q39. MySQL两种引擎InnoDB和MyISAM的区别?
- Q40. 请基于mysq设计表,初步实现一个发帖回帖系统,简要说明表的设计思路给出表结构。
- Q41. 表锁都有什么?
- Q42. mysql索引
- Q43. mysql数据库存储引擎
- Q44. 数据库的锁机制
- Q45. 四种隔离级别
- Q46. mysql主从复制
- Q47. MHA主从原理,选举机制
- Q48. 热备份和冷备份的区别
- Q49. 存储过程的优缺点?
- Q50. 存储过程与函数的区别
Q1. 数据库的三范式是什么
第一范式:列不可再分
第二范式:行可以唯一区分,主键约束
第三范式:表的非主属性不能依赖与其他表的非主属性 外键约束
且三大范式是一级一级依赖的,第二范式建立在第一范式上,第三范式建立第一第二范式上。
Q2. 数据库引擎有哪些
mysql常用引擎包括:MYISAM、Innodb、Memory、MERGE
MYISAM:全表锁,拥有较高的执行速度,不支持事务,不支持外键,并发性能差,占用空间相对较小,对事务完整性没有要求,以select、insert为主的应用基本上可以使用这引擎
Innodb:行级锁,提供了具有提交、回滚和崩溃回复能力的事务安全,支持自动增 列,支持外键约束,并发能力强,占用空间是MYISAM的2.5倍,处理效率相对会差一些
Memory:全表锁,存储在内容中,速度快,但会占用和数据量成正比的内存空间且数据在mysql重启时会丢失,默认使用HASH索引,检索效率非常高,但不适用于精确查找,主要用于那些内容变化不频繁的代码表
MERGE:是一组MYISAM表的组合
注:
查看mysql提供的所有存储引擎
mysql> show engines;
Q3. InnoDB与MyISAM的区别
InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;
Q4. 什么是事务?
多条sql语句,要么全部成功,要么全部失败。
Q5. 事务的特性
数据库事务特性:原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)、持久性(Durabiliy)。简称ACID。
原子性:组成一个事务的多个数据库操作是一个不可分割的原子单元,只有所有操作都成功,整个事务才会提交。任何一个操作失败,已经执行的任何操作都必须撤销,让数据库返回初始状态。
一致性:事务操作成功后,数据库所处的状态和它的业务规则是一致的。即数据不会被破坏。
隔离性:在并发数据操作时,不同的事务拥有各自的数据空间,它们的操作不会对彼此产生干扰
持久性:一旦事务提交成功,事务中的所有操作都必须持久化到数据库中。
Q6. 什么是索引
索引是对数据库表中一个或多个列的值进行排序的结构,建立索引有助于快速获取信息。
你也可以这样理解:索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用戶不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。
Q7. mysql有几种不同的索引
-
主键索引(PRIMARY)
数据列不允许重复,不允许为NULL,一个表只能有一个主键。 -
唯一索引(UNIQUE)
数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
可以通过 ALTER TABLE table_name ADD UNIQUE (column); 创建唯一索引
可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2); 创建唯一组合索引 -
普通索引(INDEX)
可以通过 ALTER TABLE table_name ADD INDEX index_name (column); 创建普通索引
可以通过 ALTER TABLE table_name ADD INDEX index_name(column1,column2, column3)创建组合索引 -
全文索引(FULLTEXT)
可以通过 ALTER TABLE table_name ADD FULLTEXT (column); 创建全文索引
索引并非是越多越好,创建索引也需要耗费资源,一是增加了数据库的存储空间,二是在插入和删除时要花费较多的时间维护索引索引加快数据库的检索速度
索引降低了插入、删除、修改等维护任务的速度
唯一索引可以确保每一行数据的唯一性
通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能索引需要占物理和数据空间
Q8. 简述你进行过的SQL优化
1、查询语句中不要使用select *
2、尽量减少子查询,使用关联查询(left join,right join,inner join)替代
3、减少使用IN或者NOT IN ,使用exists,not exists或者关联查询语句替代
4、or 的查询尽量用 union或者union all 代替(在确认没有重复数据或者不用剔除重复数据时, union all会更好)
5、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
6、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0
Q9. 简单说一说drop、delete与truncate的区别
SQL中的drop、delete、truncate都表示删除,但是三者有一些差别
delete和truncate只删除表的数据不删除表的结构速度,一般来说: drop> truncate >delete
delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;
如果有相应的trigger,执行的时候将被触发. truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.
Q10. 什么是视图
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
Q11. 什么是内联接、左外联接、右外联接?
内联接(Inner Join):匹配2张表中相关联的记录。
左外联接(Left Outer Join):除了匹配2张表中相关联的记录外,还会匹配左表中剩余的记录,右表中未匹配到的字段用NULL表示。
右外联接(Right Outer Join):除了匹配2张表中相关联的记录外,还会匹配右表中剩余的记录,左表中未匹配到的字段用NULL表示。在判定左表和右表时,要根据表名出现在Outer Join的左右位置关系。
Q12. 并发事务带来哪些问题?
在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用戶对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。
- 脏读(Dirty read)
- 丢失修改(Lost to modify)
- 幻读(Phantom read)
Q13. 事务隔离级别有哪些?MySQL的默认隔离级别是?
SQL 标准定义了四个隔离级别:
- READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
- REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
隔离级别 脏读 不可重复读 幻影读
READ-UNCOMMITTED √ √ √
READ-COMMITTED × √ √
REPEATABLE-READ × × √
SERIALIZABLE × × ×
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。我们可以通过SELECT @@tx_isolation; 命令来查看。
Q14. 大表如何优化?
当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常 的优化措施如下:
- 限定数据的范围
- 务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用戶在查询订单历史的时候,我们可以控制在一个月的范围内;
- 读/写分离
- 经典的数据库拆分方案,主库负责写,从库负责读;
- 垂直分区
- 根据数据库里面数据表的相关性进行拆分。 例如,用戶表中既有用戶的登录信息又有用戶的基本信息,可以将用戶表拆分成两个单独的表,甚至放到单独的库做分库。
简单来说垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。
Q15. 分库分表之后,id主键如何处理?
因为要是分成多个表之后,每个表都是从1开始累加,这样是不对的,我们需要一个全局唯一的id来支持。
生成全局id有下面这几种方式:
- UUID:不适合作为主键,因为太长了,并且无序不可读,查询效率低。比较适合用于生成唯一的名字的标示比如文件的名字。
- 数据库自增id : 两台数据库分别设置不同步长,生成不重复ID的策略来实现高可用。这种方式生成的id有序,但是需要独立部署数据库实例,成本高,还会有性能瓶颈。
- 利用redis生成id : 性能比较好,灵活方便,不依赖于数据库。但是,引入了新的组件造成系统更加复杂,可用性降低,编码更加复杂,增加了系统成本。
Q16. mysql有关权限的表都有哪几个
MySQL服务器通过权限表来控制用戶对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容:
user权限表:记录允许连接到服务器的用戶帐号信息,里面的权限是全局级的。
db权限表:记录各个帐号在各个数据库上的操作权限。
table_priv权限表:记录数据表级的操作权限。
columns_priv权限表:记录数据列级的操作权限。
host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。
Q17. 创建索引的三种方式,删除索引
第一种方式:在执行CREATE TABLE时创建索引
第二种方式:使用ALTER TABLE命令去增加索引
第三种方式:使用CREATE INDEX命令创建
alter table 表名 drop KEY 索引名
根据索引名删除普通索引、唯一索引、全文索引:
alter table user_index drop KEY name;
alter table user_index drop KEY id_card;
alter table user_index drop KEY information;
alter table 表名 drop primary key
删除主键索引: (因为主键只有一个)。这里值得注意的是,如果主键自增 ,那么不能直接执行此操作(自增 依赖于主键索引):
需要取消自增 再行删除
Q18. 介绍几个MySQL存储引擎
MySQL将数据用各种不同的技术存储在文件中,这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。这些不同的技术以及配套的相关功能在 mysql中被称作存储引擎(也称作表类型)。
-
MyISAM引擎:MyISAM引擎是MySQL默认的存储引擎,MyISAM不支持事务和行级锁,所以MyISAM引擎速度很快,性能优秀。MyISAM可以对整张表加锁,支持并发插入,支持全文索引。
缺点:不支持事务和行级锁,也不支持外键
优点:访问速度快,对事务的完整性没有要求或者以select、insert为主的应用基本上都可以使用这个引擎来创建MyISAM再磁盘上存储成三个文件,其文件名都和表名相同,但扩展名分别是:.frm(存储表定义),.MYD(存储数据),.MYI(存储索引) -
InnoDB引擎:InnoDB是专为事务设计的存储引擎,支持事务,支持外键,拥有高并发处理能力。但是,InnoDB在创建索引和加载数据时,比MyISAM慢。
-
Memory引擎(采用哈希索引):内存表,Memory引擎将数据存储在内存中,表结构不是存储在内存中的,查询时不需要执行磁盘I/O操作,所以要比MyISAM和InnoDB快很多倍,但是数据库断电或是重启后,表中的数据将会丢失,表结构不会丢失.
Q19. 简单的介绍索引
索引是存储引擎用于快速找到记录的一种数据结构。索引本身很大,不可能全部存储在内存中,因此索引以索引表的形式存储在磁盘中。
索引是在存储引擎中实现的,而不是在服务器层中实现的。所以,每种存储引擎的索引都不一定完全相同,并不是所有的存储引擎都支持所有的索引类型。
索引有如下优点与缺点:
★ 优点
1.可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一性
2.建立索引可以大大提高检索的数据,以及减少表的检索行数
3.在表连接的连接条件,可以加速表与表直接的相连
4.在分组和排序字句进行数据检索,可以减少查询时间中分组和 排序时所消耗的时间(数据库的记录会重新排序)
5.建立索引,在查询中使用索引,可以提高性能
–索引大大减小了服务器需要扫描的数据量
–索引可以帮助服务器避免排序和临时表
–索引可以将随机IO变成顺序IO
△ 缺点
1.创建索引和维护索引会耗费时间,随着数据量的增加而增加
2.索引文件会占用物理空间,除了数据表需要占用物理空间之外,每一个索引还会占用一定的物理空间
3.当对表的数据进行 INSERT,UPDATE,DELETE 的时候,索引也要动态的维护,这样就会降低数据的维护速度,(建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快)。
索引的使用:最好的做法是创建表的时候创建索引,如果创建表之后再修改新建索引的话,对于聚集索引,会根据原来的表,创建一个新的表带有索引数据结构,再把原来的表删去,新创建的表改成原来的表的名字。而非聚集索引则是通过修改索引文件来完成。所以都是需要占用额外的资源来修改或新建索引的。
Q20. 触发器的作用?
触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。
Q21. 什么是存储过程?用什么来调用?
存储过程是一个预编译的SQL 语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL ,使用存储过程比单纯SQL 语句执行要快。可以用一个命令对象来调用存储过程。
Q22. 索引的作用?和它的优点缺点是什么?
索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
Q23. 维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?
尽可能使用约束,如check, 主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。
Q24. 什么是事务?什么是锁?
事务就是被绑定在一起作为一个逻辑工作单元的SQL 语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID 测试,即原子性,一致性,隔离性和持久性。
锁:在所以的 DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。
Q25. 什么叫视图?游标是什么?
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
Q26. 您如何确一个带有名为Fld1字段的TableB表格里只具有Fld1字段里的那些值,而这些值同时在名为TableA的表格的Fld1字段里?
这个与关系相关的问题有两个可能的答案。
第一个答案是使用外键限制。外键限制用来维护引用的完整性。它被用来确保表格里的字段只保存有已经在不同的(或者相同的)表格里的另一个字段里定义了的值。这个字段就是候选键(通常是另外一个表格的主键)。
另外一种答案是触发器。触发器可以被用来保证以另外一种方式实现与限制相同的作用,但是它非常难设置与维护,而且性能一般都很糟糕。由于这个原因,微软建议开发人员使用外键限制而不是触发器来维护引用的完整性。
Q27. 对一个投入使用的在线事务处理表格有过多索引需要有什么样的性能考虑?
对一个表格的索引越多,数据库引擎用来更新、插入或者删除数据所需要的时间就越多,因为在数据操控发生的时候索引也必须要维护。
Q28. 维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?
尽可能使用约束,如主键,外键,非空字段等来约束(Check约束在mysql中可以使用但是对数据验证没有任何作用),这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。触发器是针对每一行的;对增删改非常频繁的表上切记不要使用触发器,因为它会非常消耗资源。 最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。
Q29. 使用索引查询一定能提高查询的性能吗?为什么
通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价.
索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况:
1.基于一个范围的检索,一般查询返回结果集小于表中记录数的30%宜采用;
2.基于非唯一性索引的检索
索引就是为了提高查询性能而存在的,如果在查询中索引没有提高性能,只能说是用错了索引,或者讲是场合不同
Q30. 列举几种表连接方式,并写出SQL语句? 什么是相关子查询?关联查询和相关子查询的区别?
内连接、外连接(左、右、全)、自连接(特殊的内连接)、交叉连接
Or hash join/merge join/nest loop(cluster join)/index join
1)内连接:只连接匹配的行
select A.c1,B.c2 from A join B on A.c3 = B.c3;
2)左外连接:包含左边表的全部行(不管右边的表中是否存在与它们匹配的行)以及右边表中全部匹配的行
select A.c1,B.c2 from A left join B on A.c3 = B.c3;
3)右外连接:包含右边表的全部行(不管左边的表中是否存在与它们匹配的行)以及左边表中全部匹配的行
select A.c1,B.c2 from A right join B on A.c3 = B.c3;
4)全外连接:包含左、右两个表的全部行,不管在另一边的表中是否存在与它们匹配的行
select A.c1,B.c2 from A full join B on A.c3 = B.c3;
5)交叉连接又称隐式的内联查询:生成笛卡尔积——它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行一一匹配
select A.c1,B.c2 from A,B;
6)相关子查询是一种包含子查询的特殊类型的查询。查询里包含的子查询会用到外部查询的值。
SELECT * FROM A WHERE A.id IN(SELECT B.aId FROM B WHERE B.name=A.name)
7)表关联可能有多条记录,子查询只有一条记录,如果需要唯一的列,最好走子查询
交叉连接与内连接,查询的结果是一样的,但是效率不同,内连接查询的效率更高。
Q31. 如何优化数据库,如何提高数据库的性能?
1)给数据库做索引,合理的索引能立即显著地提高数据库整个系统的性能。
2)在适当的情况下,尽可能的用存储过程而不是SQL查询。因为前者已经过了预编译,运行速度更快。
3)优化查询语句,通过高性能的查询语句提高数据库的性能。
Q32. 设计数据库应注意那些问题
首先应尽量满足三范式的要求,在一定程度上打破三范式的要求以提高数据库的性能。例如,我们创建某些表的时候,不仅会插入外键,还会插入相关的属性,这违反了第三范式,但这样做的好处,就是我们在业务查询的时候会减少很多关联查询,从而提高查询效率。
Q33. 游标的作用?如何知道游标已经到了最后?
游标用于定位结果集的行,在mysql中用DECLARE CONTINUE HANDLER FOR SQLSTATE ‘02000’ SET done = 1; 可以判断是否到了最后,通常此变量不等于0表示出错或到了最后。
Q34. 事前触发和事后触发有何区别?语句级触发和行级触发有何区别?
事前触发器运行于触发事件发生之前,如表的插入、更新、删除之前,而事后触发器运行于触发事件发生之后,如表的插入、更新、删除之后。通常事前触发器可以获取事件之前和新的字段值。语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。
Q35. 什么是数据模型?什么是规范化?
数据模型是一种标识实体类型及其实体间联系的模型。典型的数据模型有网状模型、层次模型和关系模型。
从关系数据库的表中,除去冗余数据的过程称为规范化。包括:精简数据库的结构,从表中删除冗余的列,标识所有依赖于其它数据的数据
Q36. 几种索引类型?
MySQL数据库几个基本的索引类型:普通索引、唯一索引、主键索引、组合索引、全文索引
- 索引加快数据库的检索速度
- 索引降低了插入、删除、修改等维护任务的速度
- 唯一索引可以确保每一行数据的唯一性
- 通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能
- 索引需要占物理和数据空间
Q37. 数据库的乐观锁和悲观锁是什么?数据库表锁和行锁又是什么?
数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。
乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。
- 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
- 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
在MySQL中 引擎为InnoDB的表支持表锁和行锁,而引擎为MyISAM的表只支持表锁
- 表锁:开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低
- 行锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高
Q38. 简单说一说drop、delete与truncate的区别
SQL中的drop、delete、truncate都表示删除,但是三者有一些差别
- delete和truncate只删除表的数据不删除表的结构
- 速度,一般来说: drop> truncate >delete
- delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;
如果有相应的trigger,执行的时候将被触发. truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.
Q39. MySQL两种引擎InnoDB和MyISAM的区别?
1.MyISAM不支持事务,而InnoDB支持事务。
2.MyISAM锁的是表锁(表锁又分读锁和写锁),而InnoDB锁为行级锁。
3.MyISAM支持全文类型索引,而InnoDB不支持。
4.MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。
5.MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。
6.InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)。
Q40. 请基于mysq设计表,初步实现一个发帖回帖系统,简要说明表的设计思路给出表结构。
如果需要创建索引,则要说明在索引类型和索引建立的字段。
设计时需要考虑如下业务:
1.用户发主题贴
2.用户针对主题贴的回帖
3.查询制定时间范围内制定用户的所有发帖回帖记录
4.统计主题贴的浏览量
5.统计主题贴的回复量
6.用户删除自己的帖子(主题贴或回帖)
Q41. 表锁都有什么?
MySQL 里面表级别的锁有两种:
一种是表锁,包含表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock),
表锁的语法是 lock tables。。。read/write,与 FTWRL 类似,
可以用 unlock tables 主动释放锁,也可以在客户端断开的时候自动释放。
在还没有出现更细粒度的锁的时候,表锁是最常用的处理并发的方式,
而对于 InnoDB 这种支持行锁的引擎,一般不使用 lock tables 命令来控制并发,
毕竟锁住整个表的影响面还是很大。
另一种是元数据锁(meta data lock,MDL),MDL 不需要显示使用,
在访问一个表的时候就会被自动加上。
MDL 的作用是,保证读写的正确性。
读锁之间不互斥,因此你可以有多个线程同时对一张表增删改查
读写之间、写写之间是互斥的,用来保证变更结构操作的安全性。
因此如果有两个线程要同时给一个表加字段,其中一个要等另一个执行完才能开始执行。
虽然 MDL 锁是系统默认加的,但是却不能忽略一个机制,
Q42. mysql索引
mysql索引的四种类型:主键索引、唯一索引、普通索引和全文索引。
通过给字段添加索引可以提高数据的读取速度,提高项目的并发能力和抗压能力。索引优化时mysql中的一种优化方式。
主键索引:
主键是一种唯一性索引,但它必须指定为PRIMARY KEY,每个表只能有一个主键。
唯一索引:
索引列的所有值都只能出现一次,即必须唯一,值可以为空。
普通索引 :
基本的索引类型,值可以为空,没有唯一性的限制。
全文索引:
全文索引的索引类型为FULLTEXT。全文索引可以在varchar、char、text类型的列上创建。
可以通过ALTER TABLE或CREATE INDEX命令创建。
对于大规模的数据集,通过ALTER TABLE(或者CREATE INDEX)命令创建全文索引要比把记录插入带有全文索引的空表更快。
MyISAM支持全文索引,InnoDB在mysql5.6之后支持了全文索引。
全文索引不支持中文需要借sphinx(coreseek)或迅搜<、code>技术处理中文。
Q43. mysql数据库存储引擎
一、InnoDB
这是MySQL 5.5或更高版本的默认存储引擎。它提供了事务安全(ACID兼容)表,支持外键引用完整性约束。
它支持提交、回滚和紧急恢复功能来保护数据。它还支持行级锁定。
当在多用户环境中使用时,它的“一致非锁定读取”提高了性能。它将数据存储在集群索引中,从而减少了基于主键的查询的I/O。
二、MyISAM
该存储引擎管理非事务性表,提供高速存储和检索,支持全文搜索。
三、MEMORY
提供内存中的表,以前称为堆。它在RAM中处理所有数据,以便比在磁盘上存储数据更快地访问。用于快速查找引用和其他相同的数据。
四、MERGE
将多个类似的MyISAM表分组为一个表,可以处理非事务性表,默认情况下包括这些表。
五、EXAMPLE
你可以使用此引擎创建表,但不能存储或获取数据。这样做的目的是教开发人员如何编写新的存储引擎。
六、ARCHIVE
用于存储大量数据,不支持索引。
七、CSV
在文本文件中以逗号分隔值格式存储数据。
八、BLACKHOLE
受要存储的数据,但始终返回空。
九、FEDERATED
将数据存储在远程数据库中。
Q44. 数据库的锁机制
数据库的大并发要考虑锁和锁的性能问题,加锁是为了实现并发控制。数据库是一个多用户资源,
若对并发控制不加控制会读取和存储不正确的数据,破坏数据的一致性(脏读,不可重复读,幻读等)可能会产生死锁。
锁机制保证在一个事务释放锁之前其他事务不可以进行修改。
锁:行级锁,表级锁,悲观锁,乐观锁
1. 悲观锁:事务每次操作之前假设有其他事务会修改需访问的数据,会要求上锁。
2. 乐观锁:事务每次操作之前假设没有其他事务会修改需访问的数据,不会要求上锁。
3. 共享锁:对某一资源加共享锁,自身可以读该资源,其他人也可以读该资源
4. 共享锁(S锁):如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。
5. 排他锁(X锁):如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
共享锁下其它用户可以并发读取,查询数据。但不能修改,增加,删除数据。资源共享。
Q45. 四种隔离级别
1,未提交读:读数据时不会检查使用任何锁。
2,已提交读:只读取提交的数据并等待其他事务释放锁。
3,可重复读:会保持共享锁到事务结束。
4,可序列化:不仅会锁定影响的数据,还会锁定这个范围
Q46. mysql主从复制
mysql主从复制的原理就是把主服务器上的bin日志复制到从服务器上执行一遍,这样从服务器上的数据就和主服务器上的数据一致。编辑/etc/my.cnf文件确保server_id不同即可。
GTID强化了数据库的主备一致性,故障恢复,容错能力。
主库数据丢失---->使用半同步复制,mysql主从复制开启了IO线程和SQL线程。
mysql同步复制,异步复制,半同步复制的原理:
在mysql5.5版本之前,复制都是异步复制。 该复制经常遇到的问题是:因为binlog日志是推送的,所有主库和从库
之间存在一定的延迟。 这样就会造成很多问题,比如主库因为磁盘损坏等故障突然崩掉,导致binlog日志不存在,同时因为延迟binlog还没有推送到从库,从库也就会丢失很多被主库提交的事物,从而造成主从不一致。
解决如上的问题,mysql5.5版本之后引入了半同步复制机制。
异步复制:主库写入一个事务commit提交并执行完之后,,将日志记录到binlog,将结果反馈给客户端,最后将日志传输到从库。
半同步复制:主库写入一个事务commit提交并执行完之后,并不直接将请求反馈给前端应用用户,而是等待从库也接收到binlog日志并成功写入中继日志后,主库才返回commit操作成功给客户端。半同步复制保障了事物执行后,至少有两份日志记录,一份在主库的binlog上 ,另一份至少在从库的中继日志Relay log上,这样就极大的保证了数据的一致性。
同步复制:指的是客户端连接到MySQL主服务器写入一段数据,MySQL主服务器同步给MySQL从服务器需要等待从服务器发出同步完成的响应才返回客户端OK, 这其中等待同步的过程是阻塞的, 如果有N台从服务器, 效率极低。
异步复制: 指的是客户端连接到MySQL主服务器写入一段数据,MySQL主服务器将写入的数据发送给MySQL从服务器, 然后直接返回客户端OK, 可能从服务器的数据会和主服务不一致。
半同步复制:指的是客户端连接到MySQL主服务器写入一段数据, MySQL主服务器只将数据同步复制给其中一台从服务器, 半同步复制给其他的从服务器, 来达到其中一台从服务器完全同步的效果。
Q47. MHA主从原理,选举机制
MHA目的在于维持master库的高可用性,最大特点是可以修复多个slave之间的差异日志,最终使所有的slave
保持一致,然后从中选择一个新的充当新的master,并使其他的slave指向它。
Q48. 热备份和冷备份的区别
1.冷备份是发生在数据库正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。冷备份时将要害性文件拷贝
到另一个位置的一种说法。
2.热备份是在数据库运行的情况下,采用archivelog mode方式来备份数据库的方法。
Q49. 存储过程的优缺点?
优点:
1)存储过程是预编译过的,执行效率高。
2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。
3)安全性高,执行存储过程需要有一定权限的用户。
4)存储过程可以重复使用,可减少数据库开发人员的工作量。
缺点:
- 移植性差
Q50. 存储过程与函数的区别
存储过程 函数
用于在数据库中完成特定的操作或者任务(如插入、删除等) 用于特定的数据(如选择)
程序头部声明用procedure 程序头部声明用function
程序头部声明时不需描述返回类型 程序头部声明时要描述返回类型,而且PL/SQL块中至少要包括一个有效的return语句
可以使用in/out/in out 三种模式的参数 可以使用in/out/in out 三种模式的参数
可作为一个独立的PL/SQL语句来执行 不能独立执行,必须作为表达式的一部分调用
可以通过out/in out 返回零个或多个值 通过return语句返回一个值,且改值要与声明部分一致,也可以是通过out类型的参数带出的变量
SQL语句(DML 或SELECT)中不可调用存储过程 SQL语句(DML 或SELECT)中可以调用函数
码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识,点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。