1.ACID 是什么?

       答:  mysql的ACID是指事务的 原子性,一致性,隔离性,持久性。 其中原子性是基于 Redo/undo log机制来实现的, Redo log 记录的是事务更新后的记录值,undo log 记录的是事务更新后的记录,更新失败后,就可以根据undo log来进行回滚。

原子性:   一个事务必须视为一个不可分割的最小工作单元,整个事务里的操作要么全部执行成功,要么全部失败。

一致性:   事务总是从一个一致性状态转换到另一个一致性状态。

隔离性:  一个事务所做的修改,在最终提交之前,其他事务是不可见的。

持久性:  事务里的所有操作最终会写入到数据库里。

2. mysql的索引类型包含哪几种?

 1) fulltext 索引

      适用于大文件text类型以及大小超过text类型的字段。 

 2) NORMAL普通索引

      使用经常使用的字段或者当关联表的一些字段。

 3) UNIQUE 唯一性索引

        当有多个字段一起表示唯一时,可以使用唯一性索引进行约束,比如用户表里的, 用户名和账号需要唯一并且不为空,那么就将 这2个字段设置一个唯一性的索引。

        需要注意的是,联合字段做唯一性索引时,做为索引的字段必须为非空,否则会出现唯一性索引失效的情况,例如a、b、c三个字段联合做唯一性索引,c允许为空,当出现如下情况时,mysql也是允许的,当c允许为null时联合的唯一性索引失效。

abc
21null
21null

3. mysql的explain关键字用法?

      一般用于在查询前添加explain,用于解释查询出来的语句包含的信息。

4. mysql的binLog是什么? 

      binlog是mysql用于数据收集和数据恢复的日志管理工具。

5. 你知道mysql的最左索引匹配规则嘛?

     答:  当有多个字段共同做为 索引时,如(a,b,c),如果说只用到了b,c那么最左索引匹配就会认为该索引无效,如果用到了a,c或者a,b,那么索引就会生效。

6.  mysql的锁有哪几种?

     答: 根据加锁的范围,可分为全局锁(全库逻辑备份)、表级锁(表锁(表记录)、元数据锁MDL(修改表结构))、行锁。

全局锁: 

        给整个数据库加一个全局的读锁,表示只有当前线程能够读取到该数据库,其他线程不能进行读取和修改。

      格式:   Full tables with read lock

表级锁: 

     表锁和元数据锁(MDL)

      格式:   lock tables 表名 read;

    设置表锁后,不能对该表进行修改操作。 

行锁:   

     两段锁、 一致性非锁定读(MVCC多版本并发控制, innodb会用快照的形式保存历史信息)、一致性锁定读(可以解决幻读问题)。

     一致性锁定读:

       select .. for update    

共享锁

        多个不同的事务对于同一个共享资源使用一个共享锁。

       select ... lock in share mode

        可以通过加一致性锁定读,当2次查询期间有insert语句过来的时候,会进入到阻塞状态,直至读取完毕后,再insert。

  • Record Lock:单个行记录上的锁
  • Gap Lock:间隙锁,锁定一个范围,但不包含记录本身
  • Next-Key Lock:Gap Lock+Record Lock,锁定一个范围,并且锁定记录本身

表锁和行锁的应用场景

        表级锁使用场景以查询为主,行级锁适用于事务要求较高的系统。

7. mysql常用命令?

1) 查看系统参数

         使用命令 show variables like "%params%"   ;

         ①检测mysql检测死锁机制是否开启5.7:  

show variables like "%innodb_deadlock_detect%"

  该命令表示如果开启死锁检测机制,那么出现死锁,会随机自动释放一个在死锁的事务。

     

        ② 查询binlog变量

 show variables like "%binlog%";

2)查询数据库事务的隔离级别

       select @@transaction_isolation     mysql默认的事务隔离级别为: 可重复读。

      

3) explain命令, 解释sql

      例如可以查看查询的语句是否用到索引

8. mysql的MYISAM存储引擎和Innodb存储引擎有什么区别,哪个性能好?

        答:   区别:

               1) myisam存储引擎不支持事务,对于不需要事务的操作时,myisam的查询和插入的性能比innodb快的多。

               2)  myisam 不支持外键,innodb支持外键。

               3) myisam 只支持表级锁,Innodb支持表级锁(表锁和元数据锁)和行锁(两阶段锁、一致性非锁定读(MVCC)、一致性锁定读(select … for update,select … lock in share mode))。

9.mysql为什么用B+树做索引?

     答: 

     1) B+树是一种排序好的数据结构。

      2)与普通的二叉树相比,B+树只在叶子节点做存储,在同样的内存下,B+树叶子能够存储更多的节点数量,遍历起来更快速方便。

      3) B+树是一一种平衡的多叉树,能够做更少的磁盘I/O, 另外叶子节点也可以连接起来,加快遍历。

10.mysql的 sql执行顺序是怎么样的?

    答:   如: select * from A  left join B on A.c=B.d  where A.e="1" order by A.g;

         第一步先将A表和B表做笛卡尔乘积。

         第二步再通过on将上面的笛卡尔乘积的结果集进行第一次筛选。

         第三步 将A表多余的行,即没有匹配到B表的行接入到上面筛选的On结果集后,空的用null填充。

         第四步用where对结果集进行筛选。

         第五步再通过order by 对结果集作排序。

11.数据库的事务隔离级别有哪几种方式?分别有什么优缺点? 

1. 读未提交,一个事务能够读取到另一个事务未提交的记录。   

2. 读已提交,事务只能读取到已经提交的记录, 会出现不可重复读的问题,即同一个事务多次读取到的结果是不相同的。

3. 可重复读,即同一个事务,多次查询读取的记录是 相同的,但是会出现幻读的问题,即在读取结果的一瞬间,另外一个事务突然向数据库里插入了一条记录,那么前面的事务好像多读取了一条记录的问题。可用mvcc解决幻读的问题,多版本控制。

4.可串行化,是数据库的隔离的最高级别,不会出现脏读、不可重复读、幻读的问题,但性能比较差。

12. mysql 的check用法? 

      答:   给字段添加一个约束, 在建表的时候通过check(字段>1) 给字段的值限制范围,即限制字段能为什么值。

13. mysql的binlog日志默认存放在哪儿?

           1) 查看日志文件路径

             show master status

   

    

        2)在my.ini文件中 查看bin_log文件

    we

14. mysql 自增主键出现不连续的原因?

答: mysql自增主键不连续的情况原因有三个: 

     1) 唯一键冲突

     2) 事务回滚

     3) insert...select的时候会出现主键id每次双倍分配导致主键id跳过的问题

      参考博客

 insert into ..select .. 

CREATE TABLE `t1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `c` int(11) DEFAULT NULL,
  `d` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `c` (`c`)
) ENGINE=InnoDB;

insert into t1 values(null, 1,1);
insert into t1 values(null, 2,2);
insert into t1 values(null, 3,3);
insert into t1 values(null, 4,4);
create table t2 like t1;
insert into t2(c,d) select c,d from t1;
insert into t2 values(null, 5,5);

select * from t2;

 查询结果为:

15.  mysql的慢查询默认时间为多长? 

        答:  10 S

       

16. 聚簇索引和非聚簇索引的区别是什么? mysql 为什么用自增的id适合作为主键?

        答:  聚簇索引在Mysql里是唯一的,索引和数据存储在一起,非聚簇索引指索引和数据没有放一起,类如书本后的附录目录。

               因为mysql 的自增id , 正好是mysql的聚簇索引的数据的物理存放顺序和索引存放顺序是一致的。只要索引是相邻的,那么在磁盘上的位置也是相邻的,如果不是自增的情况,那么会出现更多次的磁盘io情况。

更多推荐

Mysql经典面试题汇总