Mysql数据库常见面试题
2021-04-08 13:22:11 2 举报
AI智能生成
Mysql数据库常见面试题
作者其他创作
大纲/内容
Mysql InnoDB 四种事务隔离级别
1.读未提交(read uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
2.读已提交(read committed):只能读取到已经提交的数据
3.可重复读(repeatable read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读
4. 串行(serializable):事务只能一个接着一个地执行,但不能并发执行。事务隔离级别最高。
查询全局和会话事务隔离级别
SELECT @@global.tx_isolation;
SELECT @@tx_isolation;
什么是脏读、幻读、不可重复读
脏读(Read Uncommitted),一个事务在处理过程中读取了另外一个事务未提交的数据。
幻读(Repeatable Read),同一事务中,完全相同的查询语句,两次执行后得到的结果集数目不一致。因为别的事务可能会更新记录,添加记录,删除记录,从而导致查询结果集数目变化。
不可重复读(Non-repeatable Read),同一事务中,完全相同的查询同一条结果集,执行两次查询结果不一致。因为别的事务可能更新了被查询的结果集。
mysql CHAR 和 VARCHAR 的区别
CHAR 和 VARCHAR 类型在存储和检索方面有所不同,char是属于固定长度的字符类型,而varchar是属于可变长度的字符类型。
CHAR 列长度固定为创建表时声明的长度,长度值范围是 1 到 255 当 CHAR值被存储时,它们被用空格填充到特定长度,检索 CHAR 值时需删除尾随空格。(由于char是固定长度的所以它的处理速度比varchar快很多。但是缺点是浪费存储空间,所以对于那种长度变化不大的并且对查询速度有较高要求的数据可以考虑使用char类型来存储。)
MyISAM存储引擎:建议使用固定长度的数据列代替可变长度的数据列。
InnoDB存储引擎:建议使用VARCHAR类型。对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的CHAR列不一定比使用可变长度VARCHAR列性能要好。
BLOB 和 TEXT 区别
BLOB 是一个二进制对象,可以容纳可变数量的数据。TEXT 是一个不区分大小写的 BLOB
BLOB 和 TEXT 类型之间的唯一区别在于对 BLOB 值进行排序和比较时区分大小写,对 TEXT 值不区分大小写。
Mysql非标准字符串类型
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
数据库事务的四个特性(ACID)
原子性(Atomicity)
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
一致性(Correspondence)
在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏
隔离性(Isolation)
隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
持久性(Durability)
在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
MySQL 有哪两种存储引擎及区别
MyISAM
MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然性能极佳,但却有一个缺点:不支持事务处理。
InnoDB
InnoDB的最大特色就是支持了ACID兼容的事务功能
MyISAM、InnoDB区别
事务
MyISAM不支持事务,但是每次查询都是原子的
InnoDb 是事务安全型的,支持 ACID 的事务,支持事务的四种隔离级别
外键
MyISAM不支持外键
InnoDB支持外键,对一个包含外键的InnoDB表转为MYISAM会失败
索引
InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。
MyISAM是非聚集索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
Innodb不支持全文索引,而MyISAM支持全文索引,在涉及全文索引领域的查询效率上MyISAM速度更快高; mysql 5.7以后的InnoDB也支持全文索引了
InnoDB表必须有唯一索引(如主键)(用户没有指定的话会自己生产一个隐藏列Row_id来充当默认主键),而Myisam可以没有
锁粒度
MyISAM支持表级锁,即每次操作是对整个表加锁
InnoDB支持表、行(默认)级锁
存储结构
一个 MYISAM 表有三个文件:索引文件、表结构文件、数据文件
一个 InnoDb 引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里)、也有可能为多个,但是受操作系统文件大小的限制(设置为独立表空,表大小受操作系统文件大小限制,一般为 2G)
Myisam存储文件是frm、MYD、MYI,frm是表定义文件,myd是数据文件,myi是索引文件
Innodb存储文件有frm、ibd,frm是表定义文件,ibd是数据文件
表行数
MyISAM保存有表的总行数,如果select count(*) from table;会直接取出出该值。
InnoDb不存储总行数
mysql InnoDB为什么推荐使用自增ID作为主键
自增ID可以保证每次插入时B+索引是从右边扩展的,可以避免B+树频繁合并和分裂(对比使用UUID)。如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。
mysql innodb引擎的4大特性
插入缓冲(insert buffer)
二次写(double write)
自适应哈希索引(ahi)
预读(read ahead)
索引有哪几种类型
主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键,但是可以指定多个字段设置联合主键
唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
ALTER TABLE table_name ADD UNIQUE (column1,column2);
普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值
ALTER TABLE table_name ADD INDEX index_name (column)
全文索引 ALTER TABLE table_name ADD FULLTEXT (column)
0 条评论
下一页