MySQL重点,面试题
一、 聚合函数
分类
- COUNT:统计行数量
- SUM:获取单个列的合计值
- AVG:计算某个列的平均值
- MAX:计算列的最大值
- MIN:计算你列的最小值
二、SQL关键字
- 分页:limit SELECT * FROM student limit 100,6; 倒序 desc select * from user order by id desc limit 0 6
- 分组:group by SELECT sex , count(*) FROM student group by sex
- 去重:distinct select distinct name FROM student;/
三、SQL Select 语句完整的执行顺序
四、数据库三大范式
第一范式
1NF 原子性,不可再分
第二范式
2NF 唯一标识 主要解决行的冗余
- 每一行数据有唯一主键
- 非关键字必须依赖于主键字段
第三范式
3NF 直接性,主要解决列的冗余
五、存储引擎
MyISAM 存储引擎 与 InnoDB 引擎区别
- 事务支持:MyISAM不支持,InnoDB支持,通过事务确保数据完整性和一致性
- 锁定机制:MyISAM**表级锁,读操作会被阻塞,InnoDB行级锁,可以减少锁定冲突和死锁的发生
- 外键支持:MyISAM不支持外键约束,InnoDB支持外键约束,可以通过外键约束保证数据的引用完整性
- 并发性能:InnoDB更优
六、数据库事务
1.事务特性(ACID)
- 原子性
- 一致性
- 隔离性
- 持久性
undo_log 解决原子性和一致性 redo_log解决持久性
2、隔离级别
- 读未提交:所有事务可能读取到别的事物的未提交数据,会造成脏读问题
- 读已提交:针对update和delete,其他事物修改了相应的数据,同一个事务多个查询语句可能返回不同结果,能看到别的事务提交时的数据,出现不可重复读
- 可重复读:针对insert,默认隔离机制,确保一个事物中多个实例在并发读取数据的时候读到一样的数据,会导致幻读
- 可串行化:可避免上述问题,但是效率很慢
七、索引
1. 索引的概念和优点
主要作用加快数据查找速度,提高数据库性能
优点:加快查询效率
缺点:占用内存空间,影响增删改,效率低下
2. 索引分类
- 普通索引,没有任何限制
- 唯一索引:索引列的值必须唯一,允许有空值,如会员表的手机号,身份证号
- 主键索引:特殊的唯一索引,唯一标记数据表中的某一记录,不允许有空值,一般用primary key约束
- 联合索引:多个字段上建立索引,能快速符合查询条件的检索,如手机号和密码
- 全文索引:默认不支持中文全文索引,可通过扩展MySQL,添加中文全文索引
3.索引的底层实现原理
索引是在Mysql的存储引擎层中实现,不是在服务层实现
MySQL目前支持四种索引:
- B+ Tree索引:最常见的索引类型,大部分索引都支持
- Hash索引:只有Memory引擎支持,使用场景简单
- R- Tree索引:空间索引,是MySQL引擎中的特殊索引
- S-Full-text(全文索引):MySQL引擎的特殊索引
B树和B+树的主要区别
- 存储数据的位置:B树:数据存储到所有节点,B+树:所有数据存储在叶子节点中,非叶子节点仅包含索引信息
- 叶子节点之间的链接:B树:叶子节点之间没有链接,B+树叶子节点之间通过 指针相互链接,范围查询和遍历更高效
4. 如何避免索引失效
- 范围条件查询
- 索引列上操作导致索引失效(函数)
- 字符串不加引号
- or关键字连接
- 使用 !=
- like一通配符开头(‘%abc…’)
八、 数据库锁
1.行锁和表锁
行锁:访问数据库时,锁定整个行数据
表锁:访问数据库时,锁定整个表数据
行锁和表锁的区别
表锁:开销小,加锁快,不会出现死锁,锁定力度大,发生锁冲突概率高,并发度最低
行锁:开销大,加锁慢,会出现死锁,锁定力度小,发生所冲突概率低,并发度高
2.悲观锁和乐观锁
悲观锁,每次拿到数据都加锁
乐观锁,拿到数据不会加锁没在更新时判断数据有没有更新,适用于多读的应用类型,可提高吞吐量
九、MySQL优化
- 定位执行效率慢的sql语句
- 优化索引
- sql语句调优
- 合理的数据库设计
优化索引的方法:
- 对查询频次较高,并且数据量较大的表,建立索引
- 选择最常用的索引字段
- 使用唯一索引
- 索引不是越多越好,过多索引会降低表维护效率
- 使用短索引,提高索引访问时的I/O效率,提升Mysql查询效率
- where后有多个条件时,建立复合索引,需遵循最左前缀法则
sql语句调优方法
- 根据业务建立复合索引只查询需要的字段
- 多表连接的字段需要建立索引
- where条件字段需要建立索引,where条件不要使用运算函数
- 排序字段加索引提高查询效率
- 优化order by语句,不使用select *
- 优化group by语句,默认排序,使用时可以禁止排序
- 尽量避免子查询,可以优化为join多表连接查询