MySQL面试题总结(一)
MySQL面试题总结(一)
1、数据库的存储引擎?
答:MySQL在存储数据的时候都会使用不同的技术去存储数据到文件中,这种不同的技术存储就是存储引擎,存储引擎是数据库底层的一个软件组织,数据库管理系统可以使用引擎来进行对数据的增、删、改、查。同时,不同的存储引擎,会提供不同的存储机制,索引机制等功能,当然不同的存储引擎还有各自的特定功能。而现在不同的数据库管理系统都支持多个存储引擎。那么,主要存储引擎都有:
| 存储引擎 | 说明 |
| InnoDB | 5.5版本后Mysql的默认数据库,事务型数据库的首选引擎,支持ACID事务,支持行级锁定 |
| MyISAM | 拥有较高的插入,查询速度,但不支持事务 |
| Memory | 所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失 |
| Archive | 非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive拥有高效的插入速度,但其对查询的支持相对较差 |
| Federated | 将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用 |
| Merge | 将一定数量的MyISAM表联合而成一个整体,在超大规模数据存储时很有用 |
| BDB | 源自Berkeley DB,事务型数据库的另一种选择,支持COMMIT和ROLLBACK等其他事务特性 |
| Cluster/NDB | 高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用 |
| CSV | 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个.CSV文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV存储引擎不支持索引。 |
| BlackHole | 黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继 |
2、对InnoDB的详细了解
3、对MyISAM的详细了解
4、对Memory的详细了解
5、对Merge的详细了解
6、详细说明MyISAM 和 InnoDB的区别
答:
7、数据库的范式了解(第一、第二、第三)
答:
8、数据库事务的了解
答:
9、事务隔离级别有哪些?MySQL的默认隔离级别?
答:MySQL的事务隔离级别有四个:读已提交、读未提交、可重复读、可串行化。
| 事务的隔离级别 | 说明 |
| 读已提交 | 读取到的数据是已经提交的数据,这样可以阻止发生脏读,但是还是不能避免幻读或不可重复读的问题。 |
| 读未提交 | 读取到的数据是对方还未提交的数据,也就是说在对方还没有COMMIT提交事务,此时读取的值不确定,因为对方有可能ROLLBACK,那么这就是数据的脏读。同时,读未提交也是MySQL的最低的数据隔离级别,会出现脏读、幻读、不可重复度的问题。 |
| 可重复读 | 对统一个字段进行多次的读取,但是容易产生幻读现象。比如:在连续读的过程中,数据被自身事务给修改了,就会发生前一半是这个数据后一半数据不一样,这就是数据的幻读问题。所以,可重复读可以避免脏读以及不可重复度,但是幻读不可避免。 |
| 可串行化 | 是事务的最高隔离级别,可以阻止脏读、幻读、不可重复读问题。他完全服从事务的ACID原则隔离级别,所有的事务一次逐个执行,这样事务之间就完全不可能产生干扰。 |
问题:我们使用的MySQL InnoDB默认使用的隔离级别是啥?
答:MySQL InnoDB默认的事务隔离级别是可重复读(隔离级别较高)。
-- 查看事务的隔离级别 SELECT @@tx_isolation; -- 结果 REPEATABLE-READ
|
注意点: 这里需要注意的是:与SQL标准不同的地方在于InnoDB存储引擎在可重复读事务的隔离级别上,底层使用的是next-key lock算法,因此,就避免了幻读的产生,这与其他的数据库系统的标准是不一样的(SQL Server)。 因此,InnoDB存储引擎的默认隔离级别:可重复读就已经可以完全保证事务的隔离性要求了,就相当于SQL标准的可串行化标准的隔离级别。 事务的隔离级别越低,就意味着事务请求的锁就越少,所以大部分数据库的隔离级别都是读取提交的,但是MySQL InnoDB虽是可重复读,但是对于性能是不会有任何性能损失的。 |
10、简单说一下 DROP 和 DELETE 以及 TRUNCATE 的区别?
答:DROP和DELETE和TRUNCATE都是删除的功能,但是不同的是DROP是对表级别的操作(也就是说,使用DROP可以将数据表给删除掉,包括表中的数据),而DELETE以及TRUNCATE 是对行级别的操作(也就是说,使用DELETE可以将数据表中的数据给删除掉,但是表的结构还保存)。
而DELETE与TRUNCATE的区别,既然都是对表中的数据进行删除,但是还是有一定的区别的。
TRUNCATE是对整个表中的额数据进行删除,DELETE可以对表中的数据进行单个、多个、所有数据进行删除,在速度上:DELETE < TRUNCATE。
在事务层面:DELETE语句是DML,这个操作会放在ROLLBACK SEGEMENT中,事务提交后才会生效,但是TRUNCATE不需要提交事务,就直接生效。
在触发器上:DELETE语句若是有相应的触发器(TRIGGER)在执行的时候会被触发。但是对于TRUNCATE和DROP它是DDL层面的,根据触发器的规则,只有DML(UPDATE、INSERT、DELETE)才可以触发触发器,并且原数据也不放在ROLLBACKSEGMENT中,是不能回滚的。
11、MySQL中有几种锁?具体了解?
答:
12、CHAR 与 VARCHAR 的区别?
答:CHAR与VARCHAR都是属于字符串类型,不同的是CHAR是定长字符串、VARCHAR是可变长度字符串。
| 数据类型 | 说明 |
| CHAR | 1~255个字节的定长字符串。它的长度必须在创建的时候指定,否则MySQL会假定CHAR(1)。 |
| VARCHAR | VARCHAR是长度可变的,长度最多不超过255个字节。如果在创建的时候指定VARCHAR(n),则可以存储0~n的字节的可变长字符。 |
CHAR存储的数据,长度要是过长,多余的空间用空格占用,而VARCHAR存储的数据是可以根据内容的长度自行的改变其空间长度的。
13、主键与候选键的区别?
答:什么是主键?主键是一个表只能有一个,是用于唯一标识表中的行的信息,而候选键也是能实现主键的作用,不同的是,候选键是一个主键的集合。
14、MySQL支持事务吗?
答:在缺省模式下,MySQL是AUTOCOMMIT模式的,所有的数据库更新操作都会立即提交的,所以在缺省模式下,MySQL是不支持事务的。但是如果你的MySQL表数据类型是使用InnoDB的话,MySQL就可以使用事务处理,使用SET AUTOCOMMIT = 0(关闭自动事务提交)就可以在非AUTOCOMMIT模式下,必须使用COMMIT来提交更改信息。
15、MySQL里面记录货币用什么字段类型比较好?
答:
16、SQL注入漏洞产生的原因?如何防止?
答:SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击方可以在定义好的语句的结尾上添加额外的SQL语句,以此实现非法操作,实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
如何防止?
答:

浙公网安备 33010602011771号