面经整理5

215 阅读5分钟

1.了解过索引吗?什么是索引?

①索引是帮助MySQL高效获取数据的数据结构(有序)

②提高数据检索的效率,降低数据库的IO成本(无需全表扫描)

③通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的能耗

2.索引的底层数据结构了解过吗?

MySQL的InnoDB引擎采用的B+数数据结构来存储索引

①阶数更多,路径更短(矮胖树)

②磁盘读写代价B+树更低,非叶子结点只存储指针,叶子节点存储数据

③B+数便于扫库和区间查询,叶子节点是一个双向链表

3.什么是聚簇索引什么是非聚簇索引?

聚簇索引(聚集索引):数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个。

非聚簇索引(二级索引):数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个。

4.知道什么是回表查询嘛 ?

通过二级索引找到对应的主键值,到聚集索引中查找整行数据,这个过程就是回表。

5.知道什么叫覆盖索引嘛 ?

覆盖索引是指查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到。

①使用id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。

②如果返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select *。 image.png 第一句和第二句是覆盖索引,一次查询就可以查询到,第三句是非覆盖索引,需要回表查询

6.MYSQL超大分页怎么处理 ?

image.png

优化方法image.png

问题:在数据量比较大的时候,limit分页进行查询,需要对数据进行排序,效率低。

解决方法:可以使用覆盖索引 + 子查询解决。

7.索引创建的原则有哪些?

1).数据量较大,且查询比较频繁的表

2).常作为查询条件、排序、分组的字段

3).字段内容区分度高

4).内容较长,使用前缀索引

5).尽量联合索引

6).要控制索引的数量

7).如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它

8.什么情况下索引会失效?

①违反最左前缀法则。

②范围查询右边的列,不能使用索引。

③不要在索引列上进行运算操作,索引将失效。

④字符串不加单引号,造成索引失效(类型转换)。

⑤以%开头的Like模糊查询,索引失效。

9.谈一谈对SQL优化的理解

1)表的设计优化

① 比如设置合适的数值(tinyint intbigint),要根据实际情况选择 ② 比如设置合适的字符串类型(char和varchar)char定长效率高,varchar可变长度,效率稍低

2)索引优化(参考优化创建原则和索引失效)

3)SQL语句优化

① SELECT语句务必指明字段名称(避免直接使用select*)

② SQL语句要避免造成索引失效的写法

③ 尽量用union all代替union union会多一次过滤,效率低

④ 避免在where子句中对字段进行表达式操作

4)Join优化

能用innerjoin 就不用left join right join,如必须使用 一定要以小表为驱动内连接会对两个表进行优化,优先把小表放到外边,把大表放到里边。leftjoin 或 right join,不会重新调整顺序

5)主从复制、读写分离

分库分表

10.事务的特性/ACID是什么?可以详细说一下吗?

原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。

隔离性(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

11.并发事务带来哪些问题?如何解决这些问题?MySQL的默认隔离级别是?

image.png 不可重复读和幻读的区别: 不可重复读是事务a读取的数据被事务b修改了,导致两次读取数据不同。 幻读是事务a要插入的数据被事务b提前插入了,导致出现“幻影”。

如何解决这些问题?

image.png

12.undo log和redo log的区别?

都属于MySQL的日志文件 redo log:记录的是数据页的物理变化,服务宕机可以用来同步数据。

undo log:记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据。

redo log保证了事务的持久性,undo log保证了事务的原子性和一致性。

13.事务中的隔离性是如何保证的呢?

锁:排他锁(如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁)

mvcc:多版本并发控制

14.解释一下mvcc?

多版本并发控制,指维护一个数据的多个版本,使得读写操作没有冲突。