MySQL数据库面试题是经常在Java面试被问到的,下面重点详解最常见的MySQL数据库面试题。
什么是MySQL索引?
MySQL索引是一种数据结构,用于加快数据查询的速度。
为什么要使用索引?
索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。
如下图所示:
通过创建索引,可以大大提高数据库查询的性能,减少查询时间。
MySQL索引主要有哪些?
MySQL索引类型主要分为:主键索引、唯一索引、普通索引和、全文索引。
1.MySQL主键索引
主键索引,英文全称Primary Key,简称为主键,主键是一种唯一性索引,每个表只能有一个主键。
alert table tablename add primary key(`字段名`)
2.MySQL普通索引
普通索引(index)顾名思义:就是各类索引中最为普通的索引。
alter table table_name add index(`字段名`);
3.MySQL唯一索引
mysql中唯一索引的关键字是unique index,唯一索引可以有多个,但索引列的值必须唯一,索引列的值允许有空值。
alter table 表名 add unique(列名)
业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。
4.MySQL全文索引
全文索引指的是:将存储在数据库中的整本书或整篇文章中的任意内容信息查找出来的技术。
alter table 表名 add fulltext (列名)
全文索引只能用于InnoDB或MyISAM表,只能为CHAR、VARCHAR、TEXT列创建。
MySQL事务隔离级别?
隔离级别主要是四种:读未提交、读已提交、可重复读、串行化。
如下图所示:
1.read uncommitted(读未提交)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。
读未提交会产生的问题:脏读、不可重复读、幻读,下面我会单独来详解什么是脏读、不可重复读、幻读。
读未提交这种隔离级别,很少应用到实际场景,因为会产生脏读等致命问题。
2. read committed(读已提交)
为了避免脏读,数据库有了比读未提交更高的隔离级别,即已提交读。
一个事务提交之后,它做的变更才会被其他事务看到,只能读取到已经提交的数据,这就是读已提交。
这是大多数数据库系统的默认隔离级别,但不是MySQL默认的,是Oracle的默认级别。
【会产生的问题】:不可重复读、幻读。
3.repeatable read(可重复读)
可重复读:确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新(update)。
也就是说:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。
可重复读是MySQL InnoDB默认级别,在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读。
【会产生的问题】:幻读。
4. serializable(串行化)
串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。
串行化:一般不会使用,它会给每一 行读取的数据加锁,造成大量的等待和锁冲突。
【会产生的问题】:可以解决所有问题。
MySQL事务ACID
MySQL事务具有四大特征,简称ACID:
1.原子性(Atomicity)
所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
2.一致性(Correspondence)
数据必须保证从一种一致性的状态转换为另一种一致性状态。
3.隔离性(Isolation)
指当多个用户并发操作数据库时,数据库为每一个用户开启不同的事务,这些事务之间相互不干扰,相互隔离。
4.持久性(Durability)
事务一旦commit,则数据就会保存下来,即使提交完之后系统崩溃,数据也不会丢失。
什么是MySQL主键?
MySQL主键是一列或一组列,用于唯一标识一行数据,它们可以确保表中每一行数据的唯一性。
什么是MySQL存储过程?
MySQL存储过程是一种存储在数据库中的程序,可以在需要时被调用执行。它们可以包含任意的SQL语句、控制结构和变量。
语法如下:
CREATE PROCEDURE 存储过程名称 ([ 参数列表 ]) BEGIN -- SQL语句 END ;
什么是MySQL触发器?
MySQL触发器是一种存储在数据库中的程序,可以在数据库中特定的表上执行。它们可以在插入、更新或删除数据时自动执行某些操作。
触发器主要用于监视某个表的insert、update以及delete等更新操作,这些操作可以分别激活该表的insert、update或者delete类型的触发程序运行,从而实现数据的自动维护。
语句:
CREATE TRIGGER <触发器名> <触发时机 BEFORE | AFTER> <触发事件 INSERT | UPDATE | DELETE > ON <表名> FOR EACH Row <触发器主体> END;
数据库设计三大范式
在数据库表设计上有个很重要的设计准则,在关系数据库中这种规则 就是范式,范式来自英文Normal Form,简称NF。
在实际开发中最为常见的设计范式有三个:三大范式。
1.第一范式:确保每列保持原子性,所有字段值都是不可分解的原子值;
2.第二范式:确保表中的每列都和主键相关,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中;
3.第三范式:确保每列都和主键列直接相关,而不是间接相关;
满足最 低要求的范式是第一范式(1NF),在第一范式的基础上进一步满足更多规范要求的称为 第二范式(2NF),其余范式以此类推。
一般来说,数据库只需满足第三范式(3NF)就行 了。
MySQL优化
1.尽量避免在字段开头模糊查询
SELECT * FROM user WHERE name LIKE '%陈%'
会导致数据库引擎放弃索引进行全表扫描,查询效率非常低。
2.避免select *
SELECT * FROM user
将需要查找的字段列出来即可, 比如:
SELECT name, phone,city FROM user
3.in 和 not in 也要慎用
SELECT * FROM t WHERE id IN (1,2,,3)
会导致引擎走全表扫描,对于连续的数值,能用 between 就不要用 in 了。
select id from t where num between 1 and 3
4.尽量避免进行null值的判断
SELECT * FROM t WHERE score IS NULL
将导致引擎放弃使用索引而进行全表扫描。
可以在score 上设置默认值0,确保表中score 列没有null值,然后这样查询:
SELECT id FROM score WHERE score =0
5.查询条件不能用 <> 或者 !=
应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
如何备份MySQL数据库?
可以使用mysqldump命令来备份MySQL数据库。
例如:
mysqldump -u username -p database_name > backup_file.sql
如何恢复MySQL数据库?
可以使用mysql命令来恢复MySQL数据库。
例如:
mysql -u username -p database_name < backup_file.sql
以上就是常见的MySQL数据库面试题详解,更多的Java面试题及答案,请查看:1000+Java面试题及答案详解。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》