高频面试题干货-数据库优化方案
一前言
最近很多小伙伴在跳槽面试,在面试中,面试官经常会问是否熟悉数据库,数据库怎么使用?
这些问题大家回答的都还可以,无非就是考察一些SQL语句的编写使用。
然后面试官接着问怎么进行数据库优化?
一些基本的优化手段,小伙伴们还是可以回答出来的,比如在编写SQL语句时,尽量不要使用like关键字,尽量避免使用or关键字等等。
然后面试官让你回去等结果,然后就没有然后了......
这时有小伙伴就很好奇了,为啥不给我发offer呢?于是就有粉丝来问千锋健哥了,今天健哥就为大家讲讲数据库优化的面试思路,告诉你该如何作答才能得高分!
二面试题考点
如果面试官是千锋健哥的话,那么我想考察的首先是候选人是否有数据库优化的整体思路。
大家来想想,为什么要进行数据库优化呢?那肯定是数据库很慢了,所以才要优化!
那数据库为什么会慢呢?这个原因有很多,但我们要先找到数据库的性能瓶颈,也就是变慢的主要原因;然后再针对瓶颈问题,找到具体的解决方案。
三解题分析
下面千锋健哥来带大家一起分析这个问题的回答思路,数据库优化按照成本与效果可以分为以下几种情况:
SQL及索引优化,
数据库表结构优化,
硬件优化
接下来健哥就分别对这几种情况进行分析讨论。
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
数据库表结构优化
尽量将表字段定义为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以内
合理的加入冗余字段可以提高查询速度。
硬件优化
千锋健哥在服务器上一般是安装Zabbix服务器监控软件,我们通过这个软件就可以监控服务器硬盘I/O、网络I/O、CPU使用率,以及内存占用情况等信息。如果有硬件性能达到上限,则可以和公司申请升级硬件,当然这些费用是比较高的,成本比较大。
四总结
经过上面的分析,最后千锋健哥给大家总结数据库优化的完整答案:
首先数据库优化的主要思路,是先找到当前数据库的瓶颈所在,然后再针对具体问题具体优化;
由于优化成本限制,所以要考虑SQL语句及索引优化,通过慢查询日志发现项目中是哪条SQL语句导致了查询变慢;然后通过Explain执行计划分析这条要优化的SQL语句到底是哪里有问题,再进行优化;对于有索引的字段,要在查询条件中遵循最左匹配原则,确保能够命中索引;
然后再考虑优化表结构,对于单表500万条以上数据的大表,可以进行水平分表,比如使用数据库中间件Mycat进行分表;
最后再考虑是否是服务器硬件导致的瓶颈,可以通过Zabbix监控软件进行分析,优化服务器硬件配置。
猜你喜欢LIKE
相关推荐HOT
更多>>article标签是什么元素?有什么作用
article标签是 HTML5 中的元素,用于定义一个独立的、完整的内容单元,通常包含文章、博客、新闻、评论等内容。增强可读性:使用 标签可以使页...详情>>
2023-04-20 16:19:55什么是linux系统内核?什么是linux发行版
Linux 是一个开源操作系统,由内核和许多其他的软件组成。其中,Linux 内核是操作系统的核心,负责管理计算机的硬件资源和提供基本的系统功能,...详情>>
2023-03-03 10:57:37数据埋点(Data buried point)的应用价值剖析
数据埋点指在应用中特定的流程中收集一些信息,用来跟踪应用使用的状况,后续用来进一步优化产品或是提供运营的数据支撑。比如访问数(Visits),...详情>>
2023-02-08 17:38:00web前端技术干货-iframe
在这个网页中,同时在一个页面中展示了三个网站:千锋教育官网、千锋教育HTML5大前端官网、千锋教育HTML5大前端好程序员官网。这是如何做到的呢...详情>>
2022-12-27 16:23:13热门推荐
java异常分类三大类是什么?
沸常用的maven打包命令有哪些?
热article标签是什么元素?有什么作用
热js引用数据类型有哪些
新什么是枚举?没有枚举之前怎么做的
javascript中如何搜索数组元素
css阴影效果属性:box-shadow属性
echarts和chart的优缺点对比
mybatis通用mapper的使用方法
ui设计之js效果-如何制作文字倒计时
svn与git的区别是什么?使用git的优势是什么
什么是linux系统内核?什么是linux发行版
Linux三剑客之-sed
JumpServer堡垒机部署及恢复