面试官:数据库太慢了, 优化方案和思路你有吗?

. 前言

最近很多小伙伴在跳槽面试,在面试中,面试官经常会问是否熟悉数据库,数据库怎么使用?这些问题大家回答的都还可以,无非就是考察一些SQL语句的编写使用。

然后面试官接着问怎么进行数据库优化?一些基本的优化手段,小伙伴们还是可以回答出来的,比如在编写SQL语句时,尽量不要使用like关键字,尽量避免使用or关键字等等。

然后面试官让你回去等结果,然后就没有然后了......

这时有小伙伴就很好奇了,为啥不给我发offer呢?于是就有粉丝来问千锋威哥了,今天威哥就为大家讲讲数据库优化的面试思路,告诉你该如何作答才能得高分!

. 面试题考点

如果面试官是千锋威哥的话,那么我想考察的首先是候选人是否有数据库优化的整体思路。

大家来想想,为什么要进行数据库优化呢?那肯定是数据库很慢了,所以才要优化!

那数据库为什么会慢呢?这个原因有很多,但我们要先找到数据库的性能瓶颈,也就是变慢的主要原因;然后再针对瓶颈问题,找到具体的解决方案。

. 解题分析

下面千锋威哥来带大家一起分析这个问题的回答思路,数据库优化按照成本与效果可以分为以下几种情况:

  • SQL及索引优化

  • 数据库表结构优化

  • 硬件优化

接下来威哥就分别对这几种情况进行分析讨论。

1、SQL及索引优化

SQL是我们和数据库交流最重要的部分,所以我们在调优的时候,需要花费的大量时间就在sql调优上面。常见的分析手段有慢查询日志,EXPLAIN 分析查询,通过定位分析性能的瓶颈,才能更好地优化数据库系统的性能。

1.1 慢查询

1.1.1 慢查询日志开启

在配置文件my.cnf或my.ini中的[mysqld]行下面,加入如下两个配置参数:

log-slow-queries=/data/mysqldata/slow-query.log
long_query_time=3
  • log-slow-queries参数为慢查询日志存放的位置,一般这个目录要有mysql的运行账号的可写权限,一般都将这个目录设置为mysql的数据存放目录。

  • long_query_time=5中的5表示查询超过五秒才记录。

我们还可以在my.cnf或者my.ini中添加log-queries-not-using-indexes参数,表示记录下没有使用索引的查询。

1.1.2 慢查询日志分析

我们可以通过打开log文件查看得知哪些SQL执行效率低下,从查询日志中我们可以发现查询时间超过5 秒的SQL语句,而小于5秒的没有出现在此日志中。

如果慢查询日志中记录内容很多,可以使用mysql dump slow工具(MySQL客户端安装自带)来对慢查询日志进行分类汇总。mysql dump slow对日志文件进行了分类汇总,显示汇总后摘要结果。

1.2 EXPLAIN执行计划分析

EXPLAIN可以帮助开发人员分析SQL问题,EXPLAIN显示了MySQL如何使用使用SQL执行计划,可以帮助开发人员写出更优化的查询语句,我们只需要在select语句前加上Explain关键字就可以了,如下:

EXPLAIN SELECT * FROM products

2、数据库表结构优化

  • 尽量将表字段定义为NOT NULL约束,这时由于在MySQL中含有空值的列很难进行查询优化,NULL值会使索引以及索引的统计信息变得很复杂。

  • 对于只包含特定类型的字段,可以使用enum、set 等数据类型。

  • 数值型字段的比较比字符串的比较效率高得多,字段类型尽量使用最小、最简单的数据类型。例如IP地址可以使用int类型。

  • 尽量使用TINYINT、SMALLINT、MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED。但对整数类型指定宽度,比如INT(11),没有任何用,因为指定的类型标识范围已经确定。

  • VARCHAR的长度只分配真正需要的空间。

  • 尽量使用TIMESTAMP而非DATETIME,但TIMESTAMP只能表示1970 - 2038年,比DATETIME表示的范围小得多,而且TIMESTAMP的值因时区不同而不同。

  • 单表不要有太多字段,建议在20以内。

  • 合理的加入冗余字段可以提高查询速度。

3、硬件优化

千锋威哥在服务器上一般是安装Zabbix服务器监控软件,我们通过这个软件就可以监控服务器硬盘I/O、网络I/O、CPU使用率,以及内存占用情况等信息。

如果有硬件性能达到上限,则可以和公司申请升级硬件,当然这些费用是比较高的,成本比较大。

. 总结

经过上面的分析,最后千锋威哥哥给大家总结数据库优化的完整答案:

  • 首先数据库优化的主要思路,是先找到当前数据库的瓶颈所在,然后再针对具体问题具体优化;

  • 由于优化成本限制,所以要考虑SQL语句及索引优化,通过慢查询日志发现项目中是哪条SQL语句导致了查询变慢;

  • 然后通过Explain执行计划分析这条要优化的SQL语句到底是哪里有问题,再进行优化;

  • 对于有索引的字段,要在查询条件中遵循最左匹配原则,确保能够命中索引;

  • 然后再考虑优化表结构,对于单表500万条以上数据的大表,可以进行水平分表,比如使用数据库中间件Mycat进行分表;

  • 最后再考虑是否是服务器硬件导致的瓶颈,可以通过Zabbix监控软件进行分析,优化服务器硬件配置。
                                                               
                                                                   扫码开启学习

     
    免费Java资源获取

     

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马剑威(威哥爱编程)

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值