问题精选-MySQL
一、一张表,里面有 ID 自增主键,当 insert 了 17 条记录之后,删除了第 15,16,17 条记录,再把 Mysql 重启,再 insert 一条记录,这条记录的 ID 是 18 还是 15 ?
1、如果表的类型是MyISAM,那么是18,因为MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL自增主键的最大ID也不会丢失。
2、如果表的类型是InnoDB,那么是15,InnoDB表只是把自增主键的最大ID记录到内存中,所以重启数据库或者是对表进行OPTIMIZE会导致最大ID丢失。
二、区分 CHAR_LENGTH 和 LENGTH?
CHAR_LENGTH 是字符数,而 LENGTH 是字节数。Latin 字符的这两个数据是相同的,但是对于 Unicode 和其他编码,它们是不同的。
三、请简洁描述 Mysql 中 InnoDB 支持的四种事务隔离级别名 称,以及逐级之间的区别?
3.1 SQL标准定义的四个隔离级别为:
- read uncommited : 读到未提交数据
- read commited :读取提交内容
- repeatable read : 可重读
- serializable : 串行事务
3.2 Read Uncommited 读到未提交数据
在隔离级别中,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为他的性能也不比其他级别好多少。读取到未提交的数据,也被称之为脏读(Dirty Read).
3.3 Read Commited 读到提交内容
这是大多数 数据库系统的默认隔离级别(但不是Mysql 默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读 ( Nonrepeatable Read ), 因为同一事物的其他实例在该实例处理期间可能会有新的Commit ,所以同一 select 可以返回不同结果。
3.4 Repeatable Read (可重读)
这是Mysql 的默认事务隔离级别,它确保同一事物的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题 : 幻读 ( Phantom Read):简单的说,幻读指当用户读取某一范围的数据行时, 另一事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”行 。 InnoDB 和 Falcon 存储引擎通过多版本并发控制(MVCC 、Multiversion Concurrency Control 间隙锁)机制解决问题。注:其实多版本只是解决不可重复读问题,而加上间隙锁(也就时它这里所谓的并发控制)才解决了幻读问题。
3.5 Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能互相冲突从而解决幻读问题。简而言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
image.png四、CHAR 和 VARCHAR 的区别?
1、CHAR 和 VARCHAR 类型在存储和检索方面有所不同
2、CHAR 列长度固定为创建表时声明的长度,长度值范围是 1 到 255
3、当 CHAR 值被存储时,它们被用空格填充到特定长度,检索 CHAR 值时需删除尾随空格。
五、列设置为 AUTO INCREMENT 时,如果在表中达到最大值,会发生什么情况?
它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。
六、MyISAM 表格将在哪里存储,并且还提供其存储格式?
每个 MyISAM 表格以三种格式存储在磁盘上:
1、“.frm”文件存储表定义
2、数据文件具有“.MYD”(MYData)扩展名
3、索引文件具有“.MYI”(MYIndex)扩展名
七、Mysql 中有哪些不同的表格?
共有 5 种类型的表格:MyISAM、Heap、Merge、INNODB、ISAM
MyISAM 是 Mysql 的默认存储引擎。
ISAM 简称为索引顺序访问方法。它是由 IBM 开发的,用于在磁带等辅助存储系统上存储和检索数据。
lnnoDB 是一个由 Oracle 公司开发的 Innobase Oy 事务安全存储引擎。
八、可以使用多少列创建索引?
任何标准表最多可以创建 16 个索引列。
九、NOW()和 CURRENT_DATE()有什么区别?
NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。
CURRENT_DATE()仅显示当前年份,月份和日期。
十、MYSQL 支持事务吗?
在缺省模式下,MYSQL 是 autocommit 模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,mysql 是不支持事务的。但是如果你的 MYSQL 表类型是使用 InnoDB Tables 或 BDB tables 的话,你的 MYSQL就可以使用事务处理,使用 SET AUTOCOMMIT=0 就可以使 MYSQL 允许在非 autocommit模式,在非 autocommit 模式下,你必须使用 COMMIT 来提交你的更改,或者用ROLLBACK 来回滚你的更改。
十一、Mysql 中有哪几种锁?
MyISAM 支持表锁,InnoDB 支持表锁和行锁,默认为行锁
- 表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低
- 行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高