MySQL
目录
MySQL
MySQL 的存储引擎有哪些?它们之间有什么区别?
MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?
MySQL 的索引类型有哪些?
为什么 MySQL 选择使用 B+ 树作为索引结构?
MySQL 索引的最左前缀匹配原则是什么?
MySQL 三层 B+ 树能存多少数据?
MySQL 中的回表是什么?
MySQL 中使用索引一定有效吗?如何排查索引效果?
在 MySQL 中建索引时需要注意哪些事项?
MySQL 中的索引数量是否越多越好?为什么?
如何使用 MySQL 的 EXPLAIN 语句进行查询分析?
MySQL 中如何进行 SQL 调优?
请详细描述 MySQL 的 B+ 树中查询数据的全过程
MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?
MySQL 中 varchar 和 char 有什么区别?
MySQL 是如何实现事务的?
MySQL 中的 MVCC 是什么?
MySQL 中的日志类型有哪些?binlog、redo log 和 undo log 的作用和区别是什么?
MySQL 中的事务隔离级别有哪些?
MySQL 默认的事务隔离级别是什么?为什么选择这个级别?
数据库的脏读、不可重复读和幻读分别是什么?
MySQL 中有哪些锁类型?
MySQL 事务的二阶段提交是什么?
MySQL 中如果发生死锁应该如何解决?
MySQL 中如何解决深度分页的问题?
什么是 MySQL 的主从同步机制?它是如何实现的?
如何处理 MySQL 的主从同步延迟?
MySQL 的存储引擎有哪些?它们之间有什么区别?
MySQL常见的存储引擎有InnoDB、MyISAM、Memory;InnoDB支持事务、外键,使用行级锁,并发性能高;MyISAM不支持事务、外键,使用表级锁,读取性能高;Memory存储在内存,性能高,但重启后数据丢失。
MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?
在默认情况下,聚簇索引和非聚簇索引都是B+树结构的,不同的是,聚簇索引的叶子节点直接存储数据行;非聚簇索引的叶子节点存储主键和对应列,所以在使用非聚簇索引时查询完整数据时会发生回表。其次,在一个表中聚簇索引只有一个,通常是主键索引;而非聚簇索引可以有多个。
MySQL 的索引类型有哪些?
按照数据结构分类有B+索引、Hash索引、倒排索引
按照Innodb中的b+索引可以细分为 聚簇索引和非聚簇索引
按照索引的性质可以分为主键索引、普通索引、外键索引、唯一索引、全文索引
为什么 MySQL 选择使用 B+ 树作为索引结构?
使用B+树有很多优点:
首先,B+树查询稳定高效,B+树是自平衡树,每个叶子节点到根节点的长度相等
其次,B+树存储的数据多,三层B+树就可存储两千多万条数据
最后,B+树叶子节点上存在双向链表,适合范围查询
MySQL 索引的最左前缀匹配原则是什么?
最左匹配原则是指创建了联合索引时,如果想走索引那么查询条件中的列的顺序必须按照联合索引中的顺序进行查询,这是因为索引的B+树结果就是按照联合索引中列的顺序进行构建的。
MySQL 三层 B+ 树能存多少数据?
Mysql的Innodb默认的数据页大小为16kb,也就是b+树上每个节点能存储16kb大小的数据,在叶子节点上,主键和记录的大小假设为1kb,那么一个叶子节点能存储16/1也就是16条数据;非叶子节点上存储的数据(索引键和指针)为8+6=14b,所以一个非叶子节点可以存161024/14=1170个子节点,那么三层b+树一共可以存储1170*1170*16=21900000条,约等于两千两百万条数据。
MySQL 中的回表是什么?
回表是指在使用非聚簇索引查询数据时,因为非聚簇索引的叶子节点只存储索引值以及主键值,所以如果需要查询其他数据的话就要根据查询到的主键值再利用聚簇索引进行查询。
MySQL 中使用索引一定有效吗?如何排查索引效果?
使用索引不一定有效,例如索引不符合最左匹配原则、索引中存在运算或者类型转换、使用模糊查询时占位符开头、order By后的索引等都会导致索引失效。
排查索引使用效果可以使用expain关键字,重点关注type、key、row三个参数。type代表使用的索引类型,key代表索引名称,row代表扫描的行数。
在 MySQL 中建索引时需要注意哪些事项?
索引不是越多越好,像是有大量重复值的字段、长字段或者频繁修改要慎重建索引,如果是需要频繁查询的字段、经常在order by、group by后的字段可以建立索引。
MySQL 中的索引数量是否越多越好?为什么?
索引并不是越多越好,在时间成本上,每次对数据进行更新操作时都需要对索引进行更新,另外,索引越多,优化器选择索引的时间成本也就越高;在空间成本上,每建立一个索引,都需要创建一个B+树,每个数据页默认大小为16kb,数据量越大,索引越多,空间成本也就越大。
如何使用 MySQL 的 EXPLAIN 语句进行查询分析?
explain主要用于sql分析,重点关注以下几个字段。type:表示访问的类型,const代表使用主键索引或者唯一索引进行等值查询;eq_ref表示在连接查询中一个表的唯一索引被另一个表的非唯一索引引用;ref表示对非唯一索引进行扫描;range表示范围查询;index表示全行扫描索引;all表示全表扫描。key代表使用的索引名称。row代表扫描的行数
MySQL 中如何进行 SQL 调优?
进行sql调优首先开启慢SQL日志,找到执行缓慢的SQL语句,使用explain语句进行解释,优化sql主要有两个方面,首先是命中索引:例如符合最左匹配原则、索引列避免计算和类型转换、模糊查询时不能以通配符开头;其次是避免回表,尽量使用覆盖索引。
请详细描述 MySQL 的 B+ 树中查询数据的全过程
首先从根节点出发,根据数据大小自上而下找到数据所在的根节点,根节点上有一个数据页,默认大小为16kb,一个数据页上能存储很多行数据,这些数据会被分成多个组,查找数据时会根据页目录进行二分查找找到数据所在的组,然后组内通过链表的遍历找到指定数据。
MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?
这三者都是用来统计行数的聚合函数,count(*)、count(1)可以统计包含null的行,效率较高,count(字段名)是用来统计非null的行数,因为需要进行null的判断,所以效率相较于前两者低。
MySQL 中 varchar 和 char 有什么区别?
char是固定长度的字符串,当实际存储的字符串长度小于定义的长度时,会在末尾使用空格填充,使用与存储电话号码、身份证等固定长度信息。varchar是可变长度的字符串,存储的长度为实际字符串长度加上1或2个字节大小,这1或2个字节存储字符串的大小信息。
MySQL 是如何实现事务的?
MySQL主要通过锁、日志以及MVCC来实现事务。MySQL使用锁来控制并发访问,实现了事务的隔离性;redo Log记录了所有的事务操作,在系统故障时用来恢复数据,实现了事务的持久性;undo Log记录了事物的反向操作,在事务出现异常时用来恢复到事务开始前的状态,实现了事务的原子性;MVCC机制实现了非锁定读,提高了并发读的性能,实现了事务的隔离性。
MySQL 中的 MVCC 是什么?
MVCC,多版本并发控制,MySQL会对每一个事务创建一个数据快照,当数据被修改时不会立即覆盖旧数据,而是会创建新的版本,多个版本间形成版本链,当进行普通读时,会通过MVCC版本访问规则进行读取版本链中的数据,不影响写操作,提高了数据库的并发性能。
MySQL 中的日志类型有哪些?binlog、redo log 和 undo log 的作用和区别是什么?
MySQL常见的日志有binlog、redo log以及undo log
binlog记录了MySQL的操作,包括DDL、DML;redo log记录了数据页的变化,当系统出现故障用来恢复数据;undo log记录了一个事务的所有反向操作,当事务出现异常时用来进行回滚操作,
区别:binlog是基于MySQL服务器的,redo log和undo log是innodb持有的。binlog记录的是逻辑操作,SQL语句,redo log记录的是数据的物理变化,所以binlog可以跨平台(存储引擎)使用,而后者不能;redo log用于数据的恢复,undo log用于数据的回滚。
MySQL 中的事务隔离级别有哪些?
事务的隔离级别有:读未提交,可能会出现脏读;读已提交,会出现不可重复读;可重复读,可能会出现幻读;串行化。
MySQL 默认的事务隔离级别是什么?为什么选择这个级别?
MySQL默认的隔离级别为可重复读,这是为了兼容binlog的statement格式,避免在主从数据同步时出现不一致现象。
数据库的脏读、不可重复读和幻读分别是什么?
脏读:读取了事务未提交的数据,然后事务回滚。
不可重复读,在一个事务中两个相同的查询返回的数据不相同。
幻读:在一个事务中多次相同的查询得到的数据数量不同。
MySQL 中有哪些锁类型?
按照锁的作用范围可以分为:全局锁、表级锁、行级锁
按照作用区间可以分为:记录锁、间隙锁、临键锁
按照锁的属性可以分为:共享锁和排它锁
MySQL 事务的二阶段提交是什么?
二阶段提交是为了保证redo log日志和bin log日志一致的一种机制。分为两个阶段,准备阶段事务提交时,首先innodb会先写入redo log,并将其标记为prepare;然后进入提交阶段,server层写入bin log日志,写完后通知innodb将redo log日志标记为commit,表示事务完成。
MySQL 中如果发生死锁应该如何解决?
首先mysql自带死锁检测机制,出现死锁时,mysql会自动回滚其中一个事务释放资源
其次可以设置锁的等待时间,当等待时间超过阈值时会释放资源进行回滚
最后也可以使用命令查看死锁日志,定位发生死锁的事务以及线程id,然后手动kill线程释放资源
MySQL 中如何解决深度分页的问题?
深度分页是指当数据量很大时分页查询靠后数据是查询效率下降的现象。
1.可以使用子查询进行优化,减少回表次数;
2.当分页查询是连续的时,可以记录当前查询的位置,作为下次查询的起点;
3.使用搜索引擎es查询
什么是 MySQL 的主从同步机制?它是如何实现的?
MySQL主从同步是指将一个主数据库上的数据复制到一个或多个从数据库上的操作。
MySQL主从同步利用bin log日志,在主数据库进行写操作时会记录到bin log日志中,需要同步时推送给从数据库进行重放。
如何处理 MySQL 的主从同步延迟?
主从同步延迟是指主从数据库进行同步时由于日志推送、重放等需要时间,所以同步存在延迟,无法避免,只能减少。
可以使用二次查询,从数据库查不到时再去主数据库查询;使用缓存,查询时先查询缓存;关键业务走主数据库等方法减少延迟。