面试-MySQL篇:数据库调优
Posted 曹当家的
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试-MySQL篇:数据库调优相关的知识,希望对你有一定的参考价值。
今天谈谈 mysql 的调优问题,比较偏项目实战。面试中也喜欢问 “xxx如何优化”的问题,这类问题相对开放,一不小心就变成了送命题,但是风险与机遇并存,假如你能理论结合项目经验给出一个漂亮的回答,让面试官眼前一亮,那么马上你就脱颖而出了。
下面我给出了几个面试中常问的问题,你可以结合你的项目经验,一起来试试如何回答这类问题。
1. 日常是怎么优化 SQL 的?
通过慢查询日志、EXPLAIN 分析查询、show profile 分析、以及 show 命令查询系统状态及系统变量。
"XXX") show status ——显示状态信息(扩展show status like
'XXX') show variables ——显示系统变量(扩展show variables like
show innodb status ——显示InnoDB存储引擎的状态
show processlist ——查看当前SQL执行,包括执行状态、是否锁表等
mysqladmin variables -u username -p password ——显示系统变量
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 如何对大表(千万/亿级)做优化?
优化顺序:
优化 SQL 语句和索引
对频繁查询的数据进行缓存
对数据库进行主从复制,读写分离,从库可以使用 MyISAM,查询效率会更高
对表进行分区,SQL 条件中需要带上做分区的列,可以使查询定位到少量的分区上,查询会比较快,如果每用到分区的列会扫描全部分区
垂直拆分,对大表拆分成小表
水平拆分,将数据分片,拆分到其他表或数据库上
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 存储引擎,提升查询性能,节约系统开销
增加了服务器冗余,提高可用性
猜你喜欢:
以上是关于面试-MySQL篇:数据库调优的主要内容,如果未能解决你的问题,请参考以下文章