字节采访者:SQL语句执行缓慢的原因是什么? 如何优化?

 2024-03-09 00:09:13  阅读 0

微信公众号原文链接,排版更舒服

作为一名大公司的后端应届生,深知一路上无人指导的艰辛,也想把自己的心路历程和经历分享给大家。 后续各大厂商专访系列将持续更新……

原创图文八篇论文面试网站,更多优质专栏及大公司面试必答题解析请前往:

地址: //

在线阅读网站:上一篇文章

众所周知,如果你想进大厂,MYSQL是你必须要问的技术之一。 如果你在中小型公司工作,也许简单的CRUD对于数据库操作就足够了。 然而对于大型厂商来说,面对百万级的数据量,如何才能保证MYSQL的性能仍然很好呢?

这其实涉及到很多方面:索引、主从读写分离、集群、分库分表、SQL、锁、参数调优、表结构等等。本文想带领大家讨论一下“可能的情况”。 SQL语句执行速度很慢的原因以及如何优化?”。

由于作者水平有限,考虑的可能不是很全面。 欢迎留言补充。

关注我的朋友应该都知道我的原则:如果你想了解更多或者想知道具体的内部实现建议,请仔细阅读本书。 这里我简单分享一下我的理解。 知道了这些,面试基本就够了。

(悄悄话:我也是看书+偷学阿里面试官的东西!)

sql怎么会变慢呢?

我从来不喜欢说废话,也不喜欢做广告,网上同样的文章讲了半天也抓不到重点。 只适合大公司面试。 接下来看我如何回答。 干货慢慢来了。 如有不足之处,请留言并指正。

我认为 SQL 执行速度非常慢。 我们需要分两种情况来讨论:

1.大多数情况下是正常的,但偶尔会很慢。 原因如下:

(1)数据库正在刷新脏页。 例如,重做日志已满,需要同步到磁盘

(2)执行过程中遇到锁,比如表锁、行锁。

(3)、sql写的不好

2. 该SQL语句执行速度非常慢,原因如下:

(1)索引没有使用或者索引无效:例如字段没有索引; 或者由于对字段的操作或函数操作导致索引无法使用。

(2)如果有索引,可能会进行全表扫描。

如何判断是否进行全表扫描:

指标歧视性(指标值差异越多,歧视性越高)称为基数。 当数据量很大时,不可能扫描所有数据来得到基数。 相反,对部分数据进行采样以进行预测。 在这种情况下,预测可能是错误的,导致执行全表扫描。

怎么能写好sql_语文作文怎么才能写好_毕业论文多久能写好

在慢sql优化数据库中设置SQL慢查询

方法一:修改配置文件,在my.ini中添加几行:主要是慢查询的定义时间(超过2秒为慢查询),以及慢查询日志记录( )

[mysqlld]
//定义查过多少秒的查询算是慢查询,我这里定义的是2秒
long_query_time=2
#5.8、5.1等版本配置如下选项
log-slow-queries="mysql_slow_query.log"
#5.5及以上版本配置如下选项
slow-query-log=On
slow_query_log_file="mysql_slow_query. log"
//记录下没有使用索引的query
log-query-not-using-indexestpspb16glos dndnorte/t

方法二:通过MySQL数据库启用慢查询:

mysql>set global slow_query_log=ON
mysql>set global long_query_time = 3600;
mysql>set global log_querise_not_using_indexes=ON;

分析慢查询日志

# 可以使用以下命令来定位sql执行效率低的地方

展示;

# sql可以使用分析执行计划。

对执行计划的分析也是面试官喜欢考察的点。

采访者:你如何使用它? 您是如何分析执行计划的?

这里简单讨论一下,稍后详细解答。 只需关注这些领域:

type:表示MySQL在表中查找所需行的方式,或者说访问类型

:表示查询可能使用的索引

key:实际使用的索引

:使用索引字段的长度

rows:扫描的行数

额外的:

如何优化慢SQL

对于MYSQL慢SQL语句的优化,我们还可以从几个方面来分析(基本全面覆盖):

面试会考虑这几个方面:索引+sql语句+数据库结构优化+优化器优化+架构优化。

指数

1.尽量覆盖索引。 5.6支持索引下推。

2、组合索引遵循最左匹配原则

3. 避免索引失败

4、在写多读少的场景下,可以选择普通索引,而不是唯一索引。

更新时,可以使用普通索引进行优化,减少磁盘IO,将更新操作记录到缓冲区,然后当查询到来时将数据读取到内存中,然后进行修改。

5、索引构建原则(一般建在where和order by上,基数要大,分化程度要高,不要过度索引,外键上建索引)

SQL语句

1.分页查询优化

该方案适用于主键自增的表,可以将Limit查询转化为某个位置的查询。

* 来自其中id>20000限制10;

2.优化语句

数据库结构优化

1、将一个包含多个字段的表分解为多个表

有些字段使用频繁,有些字段使用频率较低。 当数据量较大时,会因使用频率低而变慢。 你可以考虑将它们分开。

2、对于经常联合查询的表,可以考虑建立中间表。

优化器优化

1.优化器使用MRR

原理:MRR【Multi-Range Read】按顺序读取ID或键值,将“随机磁盘读”转化为“顺序磁盘读”,减少磁盘IO,从而提高索引查询的性能。

mysql>set ='mrr=on';

查看额外还有一项 MRR

* 来自 10 岁和 20 岁的学生;

对于,去磁盘获取完整数据之前,会根据rowid进行排序,然后顺序读取磁盘。

对于,聚集索引会根据聚集索引键值进行排序,然后顺序读取聚集索引。

磁盘预读:请求一页数据时,还可以返回后面几页的数据,放入数据缓冲池。 这样,如果下次正好需要下一页数据,就不再需要从磁盘中读取了(局部性原则)

索引本身就是为了减少磁盘IO,加快查询速度,而MRR则进一步放大了索引减少磁盘IO的效果。

/p/

架构优化

读写分离(主库写,从库读)

总结:

1.先设置慢查询(my.ini或数据库命令)

2、分析慢查询日志

3. 定位低效SQL(显示)

4、分析执行计划(索引是否失效、索引是否使用、使用了哪些)

5、优化(索引+sql语句+数据库结构优化+优化器优化+架构优化)

今日一句话:

认识到一个人的灵魂是无法掌握的,这是智慧的最终成就。 人本身就是终极的奥秘。 ——王尔德

关注我的公众号“小龙”,我们一起讨论,帮助修改简历、解答问题、分析项目,只为帮助迷茫的你高效拿到心仪的offer!

大厂面试题及解析后续会更新。 大制造商的内部建议将直接提交给部门主管。 还会有一个交流群,供大家讨论共同进步。 继续努力吧!

往期回顾:

1.我的秋季招聘| 登陆大厂公司经历一(最后第二册)

2、阿里面试官:MYSQL是如何实现ACID的?

3、Mysql架构&事务原理及锁机制&MVCC日志(undo日志)两阶段提交&组提交

标签: 索引 磁盘 查询

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码