文章目录
- 数据库的三范式是什么?
- 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 id 是几?
- MySQL 的内连接、左连接、右连接有什么区别?
- MySQL 索引是怎么实现的?
- 怎么验证 MySQL 的索引是否满足需求?
- 说一下 ACID 是什么?
- 说一下数据库的事务隔离?
- 说一下 MySQL 常用的引擎?
- 说一下 MySQL 的行锁和表锁?
- 说一下乐观锁和悲观锁?
- MySQL 问题排查都有哪些手段?
- 如何做 MySQL 的性能优化 及 常用的SQL查询优化
- MySql跟Oracle有哪些区别?
- union 跟 union all 区别
- drop、truncate、delete的区别?
- 平时你们是怎么监控数据库的? 慢SQL是怎么排查的?
- 你们数据库是否⽀持emoji表情,如果不⽀持,如何操作?
- 你们的数据库单表数据量是多少?⼀般多⼤的时候开始出现查询性能急剧下降?
- 查询死掉了,想要找出执行的查询进程⽤什么命令?找出来之后⼀般你会干嘛?
- 读写分离是怎么做的?你认为中间件会怎么来操作?这样操作跟事务有什么关系?
- 分库分表有没有做过?线上的迁移过程是怎么样的?如何确定数据是正确的?
- MySQL索引的原理?聚合索引、非聚合索引、覆盖索引
- MySQL分页,页数越往后翻越慢,为什么?如何解决?
数据库的三范式是什么?
- 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。
- 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
- 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 id 是几?
- 表类型如果是 MyISAM ,那 id 就是 18。
- 表类型如果是 InnoDB,那 id 就是 15。
InnoDB 表只会把自增主键的最大 id 记录在内存中,所以重启之后会导致最大 id 丢失。
MySQL 的内连接、左连接、右连接有什么区别?
内连接关键字:inner join;左连接:left join;右连接:right join。
内连接是把匹配的关联数据显示出来;左连接是左边的表全部显示出来,右边的表显示出符合条件的数据;右连接正好相反。
MySQL 索引是怎么实现的?
索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。
具体来说 MySQL 中的索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是 B+ 树实现的,B+ 树的搜索效率,可以到达二分法的性能,找到数据区域之后就找到了完整的数据结构了,所有索引的性能也是更好的。
怎么验证 MySQL 的索引是否满足需求?
使用 explain 查看 SQL 是如何执行查询语句的,从而分析你的索引是否满足需求。
explain 语法:explain select * from table where type=1。
说一下 ACID 是什么?
-
Atomicity(原子性):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
-
Consistency(一致性):事务开始前和结束后,数据库的完整性约束没有被破坏 。
-
Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。 -
Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
说一下数据库的事务隔离?
MySQL 的事务隔离是在 MySQL. ini 配置文件里添加的,在文件的最后添加:
transaction-isolation = REPEATABLE-READ
-
READ-UNCOMMITTED:读-未提交,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读)。
-
READ-COMMITTED:读-已提交,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读)。
-
REPEATABLE-READ:可重复读,默认级别,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读)。
-
SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。
-
脏读 : 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
-
不可重复读 : 事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
-
幻读 : 系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
-
小结 : 不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
说一下 MySQL 常用的引擎?
-
InnoDB 引擎:mysql 5.1 后默认的数据库引擎,提供了对数据库 acid 事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL 运行的时候,InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行 select count(*) from table 指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。
-
MyIASM 引擎:不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。不过和 InnoDB 不同的是,MyIASM 引擎是保存了表的行数,于是当进行 select count(*) from table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将 MyIASM 作为数据库引擎的首选。
说一下 MySQL 的行锁和表锁?
MyISAM 只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。
- 表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。
- 行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。
说一下乐观锁和悲观锁?
- 乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
- 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。
数据库的乐观锁需要自己实现,在表里面添加一个 version 字段,每次修改成功值加 1,这样每次修改的时候先对比一下,自己拥有的 version 和数据库现在的 version 是否一致,如果不一致就不修改,这样就实现了乐观锁。
MySQL 问题排查都有哪些手段?
- 使用 show processlist 命令查看当前所有连接信息。
- 使用 explain 命令查询 SQL 语句执行计划。
- 开启慢查询日志,查看慢查询的 SQL。
如何做 MySQL 的性能优化 及 常用的SQL查询优化
- 为搜索字段创建索引。
- 选择正确的存储引擎。
- 垂直分割分表。
- 针对SQL语句的优化(mysql中MyISAM和InnoDB)
- 参考链接:https://blog.csdn.net/jushisi/article/details/106811274
MySql跟Oracle有哪些区别?
-
mysql一般适用于中小型数据库 oracle一般适用于大型数据库
-
mysql中的过滤空值使用
IFNULL(expression, alt_value)
,oracle则使用NVL(expression, alt_value)
-
分页查询
MySQL是直接在SQL语句中写"select… from …where…limit x, y",有limit就可以实现分页; 而Oracle则是需要用到伪列ROWNUM和嵌套查询 -
自动增长的数据类型处理
Mysql主键 一般使用自动增长类型,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,Mysql将自动增长;
Oracle没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值付给该字段 -
单引号处理
MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。(3) -
事务隔离级别
MySQL是read commited的隔离级别,而Oracle是repeatable read的隔离级别 -
对事务的提交
MySQL默认是自动提交,而Oracle默认不自动提交,需要用户手动提交,需要在写commit;指令或者点击commit按钮
union 跟 union all 区别
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union All:对两个结果集进行并集操作,包括重复行,不进行排序,性能快