MySQL数据库面试题总结

209 阅读7分钟

1. SQL 的 select 语句完整的执行顺序?

1、from 子句组装来自不同数据源的数据;

2、where 子句基于指定的条件对记录行进行筛选;

3、group by 子句将数据划分为多个分组;

4、使用聚集函数进行计算;

5、使用 having 子句筛选分组;

6、计算所有的表达式;

7、select 的字段;

8、使用 order by 对结果集进行排序。

2. 什么是sql注入?如何防止sql注入?

sql注入 通过在 Web 表单中输入(恶意)SQL 语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行 SQL 语句。 举例:当执行的 sql 为 select * from user where username = “admin” or “a”=”a”时,sql 语句恒成立,参数 admin 毫无意义。

防止 sql 注入的方式:

预编译语句:如,select * from user where username = ?,sql 语句语义不会发生改变,sql 语句中变量用?表示,即使传递参数时为”admin or ‘a’= ‘a’”,也会把这整体当做一个字符串去查询。

Mybatis 框架中的 mapper 方式中的 # 也能很大程度地防止 sql 注入($无法防止 sql 注入)。

3. 事务的四大特征是什么?

数据库事务 transanction 正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。

原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执 行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆, 必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。

持久性:在事务完成以后,该事务所对数据库所作的更改便持久地保存在数据库之中,并不会被回滚。

4. MySQL 索引的“使用”要注意什么?

1.避免在 WHERE 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。

2.避免在 WHERE 子句中使用 OR 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:SELECT id FROM t WHERE num = 10 OR num = 20 。

3.避免在 WHERE 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

4.避免在 WHERE 子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。

5.LIKE 查询,% 不能在前,因为无法使用索引。如果需要模糊匹配,可以使用全文索引。

5. MySQL 主从复制的流程是怎么样的?

1、Master 上面的 binlog dump 线程,该线程负责将 master 的 binlog event 传到 slave。

2、Slave 上面的 IO 线程,该线程负责接收 Master 传过来的 binlog,并写入 relay log 。

3、Slave 上面的 SQL 线程,该线程负责读取 relay log 并执行。

4、如果是多线程复制,无论是 5.6 库级别的假多线程还是 MariaDB 或者 5.7 的真正的多线程复制, SQL 线程只做 coordinator ,只负责把 relay log 中的 binlog 读出来然后交给 worker 线程, woker 线程负责具体 binlog event 的执行。

6. Mysql 中 MyISAM 和 InnoDB 的区别有哪些?

1、InnoDB支持事务,MyISAM不支持 对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;

2、InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;

3、InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。 但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此主键不应该过大,因为主键太大,其他索引也都会很大。 而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

4、InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;

5、Innodb不支持全文索引,而MyISAM支持全文索引,查询效率比MyISAM要高;

7. mysql事务隔离级别?

Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理期间可能会有新的commit,所以同一select可能返回不同结果。

Repeatable Read(可重读) 这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单地说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。

Serializable(可串行化) 这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读取的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

总结面试时回答技巧

1、完全不懂的,就直接说不会,瞎扯给人的印象更差。

2、半懂不懂的,可以说一时想不起来,让面试官提示一下。

3、不懂的东西,一个字都不要提。不然人家一问就蒙了。比如人家问redis可以做什么?就说缓存,如果没用过分布式锁,千万别提。

4、不要一直由面试官说话。有时可以自己推进。。比如面试官问新建线程的方式有哪些?你回答完之后,还可以再补充一下。说开发中用线程池比较多,那面试官可能就会问你一些线程池的技术。

5、其实,负责java岗位的面试官,有可能是搞c++/php的,也可能是不懂技术的管理人员。遇到不懂技术的,可能适当说些专业术语吹吹牛。不过,一个不懂技术的人来面试java岗位,可能公司是不太靠谱的。

6、平常工作中比较少用到的知识,如果实在理解不了,可以背起来。

好了,今天的分享就到这儿了。

知了堂——位于成都高新区天府软件园,是园区重点扶持的互联网+教育公司,旨在为IT企业提供人才培养及人才输送服务。目前开设有Java+大数据、前端全栈,UI设计,网络安全等课程。