如何定位慢查询
如何分析执行得很慢的sql
通过key和key_len来判断是否可能会命中索引,可以查询是否使用索引以及索引占用的大小
Extra用于分析索引的使用是否有优化空间,如果是using index condition则可以优化
type用于分析sql的连接类型,如果是index或all,就需要优化sql
回答总结
索引概念及底层数据结构
如果不使用索引,查询数据时需要全表扫描,即查到45时,还需要向后继续查询直到查完整个表
红黑树的每个节点只能有两个子节点,导致数据库的数据量很大时,红黑树会很高,查找性能变低
MySQL中索引的底层数据结构是B+树,B+树只在叶子节点存储数据,非叶子节点不存储数据,只提供指针以及一些用来导航的值,所以相对于B树从上到下查询时需要遍历很多非叶子节点的数据,B+树不用遍历非叶子节点的数据,从而读写代价更低
同时B+树的查找路径大体上是相同的(高度相同),因此查询更稳定
B+树的叶子节点之间是双向连接的,可以很好的进行扫库和区间查询,比如查询6~34,只需查到6就可以链式查询,而不必重新从上到下查询
聚簇索引和非聚簇索引
id为主键,所以主键索引就是聚集索引,在叶子节点中存储的是整行的数据
给name添加索引,则对应的是二级索引,在叶子节点中存储的是对应的主键
回表查询就是通过二级索引找到主键,在通过聚集索引找到对应的行数据
覆盖索引、超大分页优化
覆盖索引
覆盖索引就是能通过一次索引查询出结果,比如直接根据主键查询出结果/直接根据二级索引查询出二级索引叶子节点的数据,但如果要用到回表查询,就不是覆盖索引了
超大分页优化
通过使用覆盖索引+子查询一次性查询出按主键排序后的结果,优点:使用索引,性能提高,不用回表查询,性能提高,子查询关联查询,从而查询出原先所要的结果
索引创建的原则有哪些
索引失效
上面是索引正常命中的情况,联合索引必须按顺序查询,即遵循最左前缀法则,不跳过任何一个索引,如果跳过了某个索引,则explain出来的命中的索引只有跳过位置之前的索引,如下是索引失效的情况:
使用了范围查询的列的右边的列索引失效
索引进行运算操作后会失效
字符串必须加单引号,否则失效
模糊匹配有可能会失效
SQL优化的经验
事务的特性
并发事务问题、隔离级别
并发事务问题
隔离级别
x代表可以解决,√代表不可解决,从上到下级别越高,数据越安全,性能越低,其中串行化与并发相悖,因此正常是不用的,默认应该使用可重复读
可重复读隔离级别下,A事务提交的数据,在B事务能看见吗,又为什么会出现幻读,如何解决
串行化隔离级别是通过什么实现的
undo log和redo log的区别
当用户执行sql语句并提交事务,首先会去操作内存中的缓冲池(性能比操作磁盘高,磁盘需要io),而磁盘中存储的是数据页(默认16KB,其中存储了表的每一行数据,有时候表足够大,大到需要多个数据页进行存储),在真正操作缓冲池之前会将磁盘中的数据页加载到内存中,操作完成后会按一定频率将数据页同步到磁盘中
存在问题:当操作完内存缓冲池中的数据页后,如果主机突然宕机,则数据页丢失,从而失去了持久化特性
使用redo log解决,就是多了一个人来记录数据变化到日志文件中,一旦宕机,就根据日志文件进行恢复,redo log实际上就是持久化,体现持久性
undo log实际上就是回滚,体现原子性和一致性
解释一下MVCC
如何保证事务的隔离性
1、使用排他锁:如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁
2、mvcc:多版本并发控制
MVCC实现原理
一条update是不是原子性的?为什么
MySQL的主从同步原理
其实就是主库执行ddl、dml之后会有一个binlog日志,从库会开启一个IOThread去读取这个日志,写入到自己的中继日志Relay Log之中,然后由另外一个SQLThread线程重做ddl、dml操作,实现从库的数据与主库一致
MySQL分库分表
垂直分表就是按照字段来分表,冷热数据分离(不常用和常用的字段分离)、大小字段分离(如例子中的description)
水平分库不同于垂直分库,垂直分库是按照业务划分数据,而水平分库是直接划分数据,不同的数据库有一定的数据量,比如第一个数据库100w条记录,第二个数据库100w条记录... 所以可以根据id范围来找到想要的数据,或者采用id取模等方法
水平分表类似于水平分库,只不过以表为单位划分数据为多个表,既然是划分表,那么划分出来的多个表既能拆分到多个库中也可以拆分到单个库中
分库分表产生的问题
- 分布式事务一致性:由于分了多个库,每个库又维护各自的事务,如果一个库事务提交失败,另一个库事务提交成功,则可能出现事务不一致的情况
- 跨节点关联查询、分页、排序函数:例如垂直分库根据业务把不同的表拆分到不同的库中,那么如果两个表需要关联查询,又该如何操作?同样,分页和排序函数又该如何操作?
- 主键避重:例如水平分表,把一个表的数据划分到多个库中,而各个库又各自维护表的主键,都各自从id为1开始,则会出现主键重复的问题
如何解决
使用中间件
SQL查询语句的执行顺序
执行一条SQL请求的过程是什么
讲一讲mysql的引擎吧,你有什么了解
MySQL为什么InnoDB是默认引擎
说一下mysql的innodb与MyISAM的区别
数据管理里,数据文件大体分成哪几种数据文件
讲讲索引的分类是什么
MySQL聚簇索引和非聚簇索引的区别是什么
如果聚簇索引的数据更新,它的存储要不要变化
MySQL主键是聚簇索引吗
什么字段适合当做主键
表中十个字段,你主键用自增ID还是UUID,为什么
为什么自增ID更快一些,UUID不快吗,它在B+树里面存储是有序的吗
查询数据时,到了B+树的叶子节点,之后的查找数据是如何做
B+树的特性是什么
说说B+树和B树的区别
B+树的好处是什么
B+树的叶子节点链表是单向还是双向
MySQL为什么用B+树结构?和其他结构比的优点
为什么 MysSQL 不用 跳表
联合索引的实现原理
创建联合索引时需要注意什么
判断索引是否生效
如果一个列既是单列索引,又是联合索引,单独查它的话先走哪个
索引已经建好了,那我再插入一条数据,索引会有哪些变化
索引的优缺点
索引优化
事务是如何实现的
哪些场景不适合脏读,举个例子
mysql的是怎么解决并发问题的
讲一下mysql里有哪些锁
数据库的表锁和行锁有什么作用
MySQL两个线程的update语句同时处理一条数据,会不会有阻塞
两条update语句处理一张表的不同的主键范围的记录,一个<10,一个>15,会不会遇到阻塞,底层是为什么
如果2个范围不是主键或索引?还会阻塞吗
日志文件是分成了哪几种
讲一下binlog
有了undolog为啥还需要redolog呢
redo log怎么保证持久性的
能不能只用binlog不用redo log
update语句的具体执行过程是怎样的
mysql的explain有什么作用
给你张表,发现查询速度很慢,你有哪些解决方案
如果Explain用到的索引不正确的话,有什么办法干预吗
MySQL主从复制了解吗
主从延迟都有什么处理方法
强制走主库方案:对于大事务或资源密集型操作,直接在主库上执行,避免从库的额外延迟。