1、MySQL 索引使用有哪些事项呢?
要注意索引失效情况;要添加的索引是否合适;注意索引规则等等
索引失效情况:
索引不适合那些场景:
2、 InnoDB与MyISAM的区别
3、B树和B+树的区别,数据库为什么使用B+树而不是B树?
B+树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的,链表连着的。那么B+树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。
B+树非叶子节点上是不存储数据的,仅存储键值,而B树节点中不仅存储键值,也会存储数据。innodb中页的默认大小是16KB,如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询的效率也会更快。
4、在高并发情况下,如何做到安全的修改同一行数据?
(1)使用乐观锁:给数据添加版本号字段,所有请求都有资格修改,但会取得这条数据的版本号,只有版本号符合的才能更新成功,缺点是增加cpu计算;
(2)使用悲观锁:本质是当前只有一个线程执行操作,排斥其他请求修改。就是其他线程遇到加锁的情况,必须等待,等持有锁的线程释放锁之后,其他线程再去处理,这样虽然解决的数据安全问题,遇到高并发时,会导致死锁或者响应时间过长;
5、数据库的乐观锁和悲观锁。
悲观锁:悲观锁缺乏安全感了,只属于当前事务,每时每刻都担心当前的数据可能被别的事务修改,所以一个事务拥有(获得)悲观锁后,其他任何事务都不能对数据进行修改,只能等待锁被释放才可以执行。
乐观锁:乐观锁的“乐观情绪”体现在,它认为数据的变动不会太频繁。因此,它允许多个事务同时对数据进行变动。实现方式:乐观锁一般会使用版本号机制或CAS算法实现。
6、SQL优化的一般步骤是什么,怎么看执行计划(explain),如何理解其中各个字段的含义。
type : 表示 mysql 在表中找到所需行的方式,或者叫访问类型,常见类型性能由差到最好依次是:all、index、range、ref、eq_ref、const,system、null:
type部分值的含义:
type=ALL,全表扫描,mysql 遍历全表来找到匹配的行
type=index, 索引全扫描,mysql 遍历整个索引来查询匹配的行
type=range,索引范围扫描,常见于<、<=、>、>=、between等操作:
type=ref, 使用非唯一索引扫描或唯一索引的前缀扫描,返回匹配某个单独值的记录行
7、mysql里记录货币用什么字段类型比较好?
numeric(m,n)和decimal(m,n)
,都是存的总位数,小数位数
8、Mysql中有哪几种锁,列举一下?
(1)表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
(2)行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
(3)页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
9、 什么是内连接、外连接和左连接?(重要)
(1)Inner join
内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集;
(2)left join
在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录;
(3)right join
在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录;
10、说一下数据库的三大范式
(1)第一范式:数据库中每一列(每个字段)都不可以再拆分;
(2)第二范式:在第一范式的基础上,非主属性完全依赖于主键;
(3)第三范式:在第二范式的基础上,不存在非主属性对码的传递函数依赖
(4)BC范式:在第三范式的基础上,不存在主属性对码的部分函数依赖和传递函数依赖
11、索引有哪几种类型?
12、什么是最左前缀原则?
当我们创建一个联合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则。
发生在联合索引里面,举个例子,创建联合索引为key idx_a_b_c(a,b,c)
sql | 是否使用索引 |
---|---|
where a = x and b = x and c = x | 是 |
where a = x and b = x | 是,部分索引 |
where a = x | 是,部分索引 |
where b = x | 否,不包含最左列a |
where b = x and c = x | 否,不包含最左列a |
使用索引排序时,order by 也遵循最左前缀原则。
原理: b+ 树的数据项是复合的数据结构,比如 (name,age,sex) 的时候,b+ 树是按照从左到右的顺序来建立搜索树的,比如当 (张三,20,F) 这样的数据来检索的时候,b+ 树会优先比较 name 来确定下一步的所搜方向
,如果 name 相同再依次比较 age 和 sex,最后得到检索的数据;但当 (20,F) 这样的没有 name 的数据来的时候,b+ 树就不知道第一步该查哪个节点,因为建立搜索树的时候 name 就是第一个比较因子,必须要先根据 name 来搜索才能知道下一步去哪里查询,所以索引列的顺序很重要。
13、覆盖索引、回表等这些,了解过吗?
覆盖索引:指索引中包含了查询中的所有字段,这种情况下就不需要再进行回表查询了
尽量减少 select * 操作
14、什么是死锁?怎么解决?
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象.
死锁有四个必要条件:互斥条件
,请求和保持条件
,循环等待条件
,不剥夺条件
。
15、为什么要使用视图?什么是视图?
视图是一个虚拟的表,是数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成。
通过视图,可以展现基表的部分数据;
视图数据来自定义视图的查询中使用的表,使用视图动态生成。
基表:用来创建视图的表叫做基表
16、视图有哪些特点?哪些使用场景?
特点:
(1)视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系;
(2)视图是由基本表(实表)产生的表(虚表);
(3)视图的建立和删除不影响基本表,但是对视图内容的更新(添加,删除和修改)直接影响基本表;
(4)当视图来自多个基本表时,不允许添加和删除数据。
使用场景:
(1)重用SQL语句;
(2)使用表的组成部分而不是整个表;
(3)保护数据
17、什么是触发器?触发器的使用场景有哪些?
指一段代码,当触发某个事件时,自动执行这些代码。
MySQL 数据库中有六种触发器:
(1)Before Insert
(2)After Insert
(3)Before Update
(4)After Update
(5)Before Delete
(6)After Delete
18、delete、delete与truncate的区别
19、UNION与UNION ALL的区别?
UNION:对两个结果集进行并集操作,不包括重复行(会去重),同时进行默认规则的排序;
UNION All:对两个结果集进行并集操作,包括重复行,不进行排序;
UNION ALL 的效率高于 UNION
20、exists和in的区别
exists:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE或FALSE)来决定主查询的数据结果是否得以保留。exist适合外表数据少,内表数据大。
in:in适合外表数据量大,内表数据量小的情况
21、 MySQL的主从复制原理以及流程
题目和答案都是根据下边的链接整理的一些我认为重要的,更多更详细的请看下边链接:https://github.com/whx123/JavaHome/blob/master/Java%E9%9D%A2%E8%AF%95%E9%A2%98%E9%9B%86%E7%BB%93%E5%8F%B7/%E6%95%B0%E6%8D%AE%E5%BA%93/100Mysql%E7%AD%94%E6%A1%88.md