1.了解过索引吗?什么是索引?
①索引是帮助MySQL高效获取数据的数据结构(有序)
②提高数据检索的效率,降低数据库的IO成本(无需全表扫描)
③通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的能耗
2.索引的底层数据结构了解过吗?
MySQL的InnoDB引擎采用的B+数数据结构来存储索引
①阶数更多,路径更短(矮胖树)
②磁盘读写代价B+树更低,非叶子结点只存储指针,叶子节点存储数据
③B+数便于扫库和区间查询,叶子节点是一个双向链表
3.什么是聚簇索引什么是非聚簇索引?
聚簇索引(聚集索引):数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个。
非聚簇索引(二级索引):数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个。
4.知道什么是回表查询嘛 ?
通过二级索引找到对应的主键值,到聚集索引中查找整行数据,这个过程就是回表。
5.知道什么叫覆盖索引嘛 ?
覆盖索引是指查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到。
①使用id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。
②如果返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select *。
第一句和第二句是覆盖索引,一次查询就可以查询到,第三句是非覆盖索引,需要回表查询。
6.MYSQL超大分页怎么处理 ?
优化方法:
问题:在数据量比较大的时候,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的默认隔离级别是?
不可重复读和幻读的区别:
不可重复读是事务a读取的数据被事务b修改了,导致两次读取数据不同。
幻读是事务a要插入的数据被事务b提前插入了,导致出现“幻影”。
如何解决这些问题?
12.undo log和redo log的区别?
都属于MySQL的日志文件 redo log:记录的是数据页的物理变化,服务宕机可以用来同步数据。
undo log:记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据。
redo log保证了事务的持久性,undo log保证了事务的原子性和一致性。
13.事务中的隔离性是如何保证的呢?
锁:排他锁(如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁)
mvcc:多版本并发控制
14.解释一下mvcc?
多版本并发控制,指维护一个数据的多个版本,使得读写操作没有冲突。