MySQL Interview Speedrun

MySQL Interview Speedrun

  1. mysql如何定位慢查询

    开启mysql的慢查询日志功能,默认超过2秒的sql语句会被记录到慢查询日志里。或者使用运维监测工具skywalking工具,它可以监测服务、接口和物理实例,可以通过它来知道哪个接口的sql执行速度比较慢。

  2. sql语句执行的很慢,如何分析

    使用explain执行计划来查询sql语句是否使用到了索引,如果没有,是不是没创建索引,没创建就去创建,创建了但没有到索引是不是语法上的问题导致索引失效,如果是就需要重新优化sql语句。另外,检查一下是否进行了回表操作,如果有则需要调整一下查询的字段,覆盖索引查询。还有就是如果使用了多个join,看看能不能使用缓存等方法减少join的个数,重写sql语句。

  3. 索引概念及索引底层数据结构

    索引是一种可以高效获取数据库数据的数据结构,mysql的索引底层使用的是b+树,相比b树的每个节点都存数据,b+树只有叶子节点存储数据,非叶子节点只存储索引,叶子节点通过节点连接成链表。

  4. 聚簇索引和非聚簇索引、回表查询

    聚簇索引是一种在叶子节点存储数据记录的索引,一般是主键id的索引;而非聚簇索引是在叶子节点存储主键id,一般是其他字段的索引。回表查询是指使用非聚簇索引进行查询,查询到主键id,然后进行回表操作,根据主键id去查完整的数据记录。

  5. 覆盖索引、超大分页优化

    覆盖索引是指所要查询的字段已经包含在索引里了,比如select name from student,name建立了非聚簇索引,但查询的字段name已经包含在索引里了,所以不需要回表查询。超大分页优化,可以使用覆盖索引+子查询的方式进行优化,就是通过子查询查询id的集合,再通过id集合来查最后的数据,这样能缩短sql语句时间。

  6. 索引创建的原则

    1.查询频率高的字段建立索引,2.值种类少的字段如性别只有男女不应建立索引,3.多个字段需要建立索引建议使用联合索引,4.字段值太长可以建立前缀索引,5.控制索引的数量,不需要每个字段都创建索引。

  7. 什么情况下索引会失效

    1.使用左模糊查询like '%xx’时,2.使用联合索引但查询条件不包含联合索引的第一个字段时,3.使用联合索引范围查询右边的字段时,范围查询字段的之后字段的索引失效,4.索引列上运算,5.字段是字符串类型但查询条件没加双引号或单引号时

  8. 谈谈你对sql优化的经验

    我觉得有以下几个方面吧。1.首先是数据库表字段的选取,要选取合适的类型,比如一个状态值只有有限的个位数取值,可以使用tinyint而不是int,这样可以节省内存,提高查询速度。2.索引创建原则。3.sql语句优化:select所需要的字段,避免select *回表查询;join时以小表驱动大表。4.主从复制,读写分离,让写数据不影响读数据。5.当数据量到达一定量,比如单表超过1000行或者大小超过20G时,可以考虑分表分库。

  9. 事务的特性

    A原子性,是指一个事务的多个操作,要么同时成功,要么同时失败,比如A转账B,A减钱,B就得加钱,要么都不发生变化;C一致性,是指事物前后有一个一致的状态,也是转账的例子,A转账B,A和B的钱总量是一致的;I隔离性,一个事物不能被其他事物所影响;D持久性,一个事物提交或回滚,那改变将是永久的。

  10. 并发事务问题、隔离级别

    并发事务会造成脏读、不可重复读、幻读的问题。脏读是指一个事务可以读到其他事务未提交的数据;不可重复读,是指一个事务的两次查询结果不一样;幻读是指一个事务查询某条数据不存在,然后插入时又提示这条数据已存在。mysql提供了4种隔离级别来解决这些问题。1.读未提交,会产生脏读。2.读已提交,解决了脏读,但会产生不可重复读的问题。3.可重复度,默认的隔离级别,解决了脏读、不可重复度的问题,解决不了幻读(虽然mysql依靠mvcc解决了部分幻读的问题)。4.串行读,加锁,完全串行化,解决了所有问题,但效率低下。

  11. undo log和redo log的区别

    redo log,记录的是数据页的物理变化,用于在数据库宕机时进行数据库恢复时使用,可以保证mysql的持久性。而undo log是一种逻辑日志,进行写操作时,undo log记录的是相反的操作,用于数据回滚时使用,可以保证mysql的原子性和一致性。

  12. mvcc

    mvcc多版本并发控制,是mysql用来保证多事务读写数据而不产生冲突的一种机制。mvcc包含以下三个部分:1.表的隐藏字段trx_id事务id和回滚指针roll_pointer。事务id每开启一个事务就自增1,回滚指针用于指向上一个版本数据的地址。2.undo log回滚日志,配合roll_pointer形成一条版本链。3.readview读视图,它里面定义了一些规则,快照读(直接select)会根据这些规则和事务id,选择一个最合适的版本进行读取,rr可重复读和rc读已提交是不同的,rr只有事务开启的第一次快照读会生成读视图,而rc每次快照读都会生成读视图。

  13. mysql主从同步原理

    主节点进行写操作,记录到binlog日志中,从节点开启一条IO线程读取主节点的binlog日志,并将数据写入到自己的relaylog日志中,同时开一条sql线程执行relaylog里的sql语句,以此来同步主节点的数据。

  14. 分表分库

    垂直分表(冷热分离)、水平分表(哈希或范围)、分区表(逻辑分表,时间范围、列表分区、哈希分区、复合分区)、垂直分库(按业务)、水平分库、分片分库(按某种规则)等。

你可能感兴趣的:(mysql,数据库,面试)