1.一条查询 sql 的执行流程?
- 连接器:管理连接,权限验证
- 分析器:词法分析,语法分析
- 优化器:执行计划生成,索引选择
- 执行器:操作引擎,返回结果
- 存储引擎:存储数据,提供读写接口
2.哪些操作会使索引失效?
- or条件其中有一个没有创建索引
- 使用多列索引时,查询条件中必须包含第一个(最左原则)
- like中‘%’在前面的时候
- 类型不一致导致的索引失效
- where条件中使用了 != 、 <>,表达式,not in,is not null,函数
- 如果mysql估计使用全表扫描要比使用索引快,则不使用索引
3.索引底层是什么数据结构?
- B + 树
4.为什么用的是 B + 树,不能使用红黑树或者其他的?
- B + 树只有叶节点存放数据,其余节点用来索引,而 B树是每个索引节点都会有 Data 域,增大了节点大小,增加了磁盘 IO 次数(磁盘 IO 一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,IO 次数增多,一次 IO 多耗时)。
- B + 树将所有的叶子节点用指针串起来,这样遍历叶子节点就能获得全部数据,能进行区间访问,在数据库中基于范围的查询是非常频繁的,而 B 树不支持这样的遍历操作。
- AVL 树和红黑树基本都是存储在内存中才会使用的数据结构。大规模数据存储的时候,红黑树往往出现由于树的深度过大而造成磁盘 IO 读写过于频繁,进而导致效率低下的情况。
5.常见的日志类型?
- 事务日志:
redo log:对于事务日志中未正常提交的事务,则会记录到undo log中,因为事务未正确执行完,因此必须回滚,从而保证数据一致性。
undo log:对于事务日志中已正常提交但未同步到持久化存储上时,则会记录到redo log中,因此MySQL会重新执行一遍事务,然后让数据存储到磁盘上,从而保证数据一致性。 - 二进制日志:
基于语句(statement) 只记录SQL语句。
基于行row(记录数据) 记录更改的记录数据。
基于混合模式,mixed ,由存储引擎自己选择。 - 查询日志
- 慢查询日志
- 中继日志
- 错误日志
6.主从延迟的解决办法?
- .主库和从库服务器配置不一样,换成相同的服务器配置服务器即可。
- 从库压力太大了,多配几个从库,分摊压力,一主多从。
- 大事务,比如 delete 这种语句,需要limit限制一下。
7.聚簇索引与非聚簇索引(也叫二级索引)?
- 数据库表的索引从数据存储方式上可以分为聚簇索引和非聚簇索引(又叫二级索引)。
- 聚簇索引在同一个B-Tree中保存了索引列和具体的数据(数据库中的整行数据);实际的数据保存在叶子页中,中间的节点页保存指向下一层页面的指针;一个表只能有一个聚簇索引,因为在一个表中数据的存放方式只有一种。
- 表中除了聚集索引外其他索引都是辅助索引(Secondary Index,也称为非聚集索引);与聚集索引的区别是:辅助索引的叶子节点不包含行记录的全部数据;当通过辅助索引来寻找数据时,InnoDB存储引擎会遍历辅助索引并通过叶子级别的指针获得只想主键索引的主键,然后再通过主键索引来找到一个完整的行记录。