vlambda博客
学习文章列表

面试-MySQL篇:数据库调优

今天谈谈 MySQL 的调优问题,比较偏项目实战。面试中也喜欢问 “xxx如何优化”的问题,这类问题相对开放,一不小心就变成了送命题,但是风险与机遇并存,假如你能理论结合项目经验给出一个漂亮的回答,让面试官眼前一亮,那么马上你就脱颖而出了。


下面我给出了几个面试中常问的问题,你可以结合你的项目经验,一起来试试如何回答这类问题。




1. 日常是怎么优化 SQL 的?

通过慢查询日志、EXPLAIN 分析查询、show profile 分析、以及 show 命令查询系统状态及系统变量。

Mysql> show status   ——显示状态信息(扩展show status like "XXX"Mysql> show variables   ——显示系统变量(扩展show variables like 'XXX'Mysql> show innodb status ——显示InnoDB存储引擎的状态Mysql> show processlist ——查看当前SQL执行,包括执行状态、是否锁表等Shell> mysqladmin variables -u username -p password ——显示系统变量Shell> mysqladmin extended-status -u username -p password ——显示状态信息

2. SQL 优化的一般步骤,如何定位性能瓶颈?

先分析数据库系统资源是否达到瓶颈,如:平均负载、CPU、I/O 次数、连接数、QPS 吞吐量。


如果是查询性能问题,则优先看是否有慢查询,频繁查询的字段是否有建立索引,是否索引实效导致全表扫描,索引是否过大导致查询效率降低,表数据量是否过大(需要分库分表) 等等。

3. 索引优化有哪些方法?

  • 用短小的数字类型做主键,而不是过长的 varchar 类型

  • 查询条件尽量覆盖索引,全值匹配 > 最左前缀 > 范围查询

  • 字符串不加单引号会导致索引失效

  • 少用 or,用它来连接时会索引失效

  • <,<=,=,>,>=,BETWEEN,IN 可用到索引;<>,not in ,!= 则不行,会导致全表扫描

  • is null ,is not null 也无法使用索引

4. 主键使用 UUID 和自增主键有什么区别?

  • UUID 是字符串,比整型消耗更多的存储空间

  • 在 B+ 树中查找时需要跟经过的节点值比较大小,整型数据的比较运算比字符串更快速

  • 自增的整型索引在磁盘中会连续存储,在读取一页数据时也是连续的,UUID 是随机产生的,读取上下两行数据是分散的,不适合范围查找

  • 在插入和删除数据时,整型自增主键会在叶子节点的末尾建立新的叶子节点,不会破坏左测子树的索引结构,UUID 主键的插入或删除大部分情况要使索引进行重建,导致性能下降

5. MySQL 如何对大表(千万/亿级)做优化?

优化顺序:

  1. 优化 SQL 语句和索引

  2. 对频繁查询的数据进行缓存

  3. 对数据库进行主从复制,读写分离,从库可以使用 MyISAM,查询效率会更高

  4. 对表进行分区,SQL 条件中需要带上做分区的列,可以使查询定位到少量的分区上,查询会比较快,如果每用到分区的列会扫描全部分区

  5. 垂直拆分,对大表拆分成小表

  6. 水平拆分,将数据分片,拆分到其他表或数据库上

6. 分区、分表、分库有什么作用?

  • 逻辑数据分割

  • 提高单一的写和读应用速度

  • 提高分区范围读查询的速度

  • 分割数据能够有多个不同的物理文件路径,避免单目录或单文件过大

  • 高效的保存历史记录

  • 便于磁盘清理

7. 如何分区、分表、分库?

分区:

  • RANGE 分区

  • LIST 分区

  • HASH 分区

  • KEY 分区

分表:

  • 范围分表

  • 哈希取余分表

分库:


业务分库,垂直分库。

8. MySQL 如何实现高可用?

实现高可用的手段主要是数据备份和失效转移机制。


MySQL 采用 Master-Slave 同步机制,通过主从复制的方式实现数据的热备。


失效转移需要从应用层面实现,如对服务器进行心跳检测,或通过应用程序访问失败的报告来判断失效,控制中心判断失效之后对服务进行切换,MySQL 如果做了主主备份,那么就切换到备份的主库上。

9. MySQL 主从复制的原理?

MySQL 主从复制主要涉及三个异步线程:

  • binlog 线程:负责将主服务器上所有的更改操作写入到二进制日志中(binary log)

  • I/O 线程:负责从主服务器上读取二进制的日志,并写入到从服务器的中继日志中(Relay log)

  • SQL 线程:负责读取中继日志,解析出主服务器已经执行的数据更改操作,并在 Slave 机器上重放

10. MySql 读写分离的作用?

读写分离:主服务器负责处理写操作和对数据实时性要求比较高的读操作,从服务器只负责处理读操作。


读写分离主要有以下几个作用:

  • 提高读写的性能,由于主从服务器负责各自的读写,极大程度缓解了锁的争用

  • 从服务器可以使用 MyISAM 存储引擎,提升查询性能,节约系统开销

  • 增加了服务器冗余,提高可用性




猜你喜欢: