MYSQL篇--sql优化高频面试题

sql优化

1 如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?

其实对于性能比较低的sql语句定位,最重要的也是最有效的方法其实还是看sql的执行计划,而对于mysql来说 它其实也是提供了explain这样的命令可以便于查询sql的执行计划,并且通过执行计划 我们能够看到sql的执行情况,包括是否使用索引,使用了什么样的索引,以及使用索引的一些相关信息
对于执行计划来说 它里面有几个非常关键的字段,
比如说有key字段,这个字段就表示是否用了索引,如果没用索引,key字段就为null;
同时还有type字段 它表示使用索引的类型,索引的效果从差到好一般是全表索引,–index全索引树扫描,–》range范围查询–》ref(使用非唯一索引进行查找数据)–》eq-ref(使用主键索引或者唯一索引关联等)
possible key 可能使用到的索引
key length 索引的长度
extra信息,比如说有 using index,using where

2 大表数据的查询如何进行优化?

1 首先对于大表数据,第一个思路还是说优化sql+去使用索引
2. 使用缓存–如果说已经优化了sql,还可以通过使用缓存,将一些不会发生变化的比如配置信息,历史数据信息放到缓存redis中去
3. 其次还可以做主从复制,读写分离,将大量的查询操作通过读库完成
4. 做垂直拆分,也就是按照模块之间的耦合度将系统和数据拆分成更细粒度
5. 做水平拆分, 这一步就需要选择一个合适的sharing key,同时为了有更好的查询效率,表结构也要有改动,应用也要改动,注意sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表

3 关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?

其实在业务系统的开发中 我除了使用主键进行查询以外,别的其实都是会在测试库上查看对应的耗时和执行效率
而我们系统的慢查询统计都是运维在做的,他们会通过邮件或者短信电话等方式推送和反馈给我们

针对于慢查询的sql分析,我们一般的操作其实是从三方面入手,就是明确慢查询的原因到底是什么?是没有走索引?还是load了过多不需要的数据,还是表的数据量过大导致的

而这三个方向 也有对应的处理方式
1 首先我们拿到sql会看下当前load的数据中有没有多余字段,如果说是因为load了多余的行导致的查询过慢 我们就优化sql,进行重写
2 其次看下有没有走索引,就是通过分析sql的执行计划,获取索引的使用情况,如果说没有走索引,就修改语句,尽量去命中索引
3 如果对语句的优化已经无法进行&

### 关于SQL优化高频面试题目及其解答 #### 题目一:解释什么是索引以及其重要性 索引是一种数据结构,用于提高数据库查询的速度。通过创建索引可以减少扫描表所需的时间,从而加快检索速度。然而,过多的索引会降低写入操作(如INSERT、UPDATE和DELETE)的性能,因为每次修改记录时都需要更新相应的索引。 ```sql CREATE INDEX idx_column ON table_name(column_name); ``` 对于大型表格来说,在经常使用的列上建立合适的索引能够显著提升读取效率[^1]。 #### 题目二:描述如何执行查询计划分析并找出慢查询的原因 为了诊断缓慢运行的SQL语句,可以通过EXPLAIN命令来查看MySQL服务器是如何处理特定查询请求的。这有助于识别潜在瓶颈所在之处,比如全表扫描或不必要的联接操作等问题。 ```sql EXPLAIN SELECT * FROM orders WHERE order_date >= '2023-01-01'; ``` 利用这些信息可以帮助开发者调整查询逻辑或者重构现有架构以达到更好的表现效果。 #### 题目三:讨论分区技术在大规模数据集中的应用价值 当面对海量历史交易明细这样的超大容量的数据集合时,采用水平切分的方式将其分割成更易于管理的小部分是非常有效的策略之一。这样不仅可以改善I/O吞吐量而且还可以简化备份恢复过程。 ```sql ALTER TABLE sales PARTITION BY RANGE (YEAR(order_date)) ( PARTITION p_2022 VALUES LESS THAN (2023), PARTITION p_future VALUES LESS THAN MAXVALUE ); ``` 这种方法使得针对不同时间段内的数据分析变得更加高效便捷。 #### 题目四:阐述视图的作用范围及其局限性 视图本质上是一个保存下来的SELECT查询定义,并不实际存储任何物理上的行级数据;相反它只是提供了一种抽象层次让用户更容易理解和访问底层复杂关系模式下的真实实体对象而已。因此每当有人试图经由某个视图来进行DML变更动作的话,则可能会遇到权限控制方面的问题或者是违反参照完整性约束的情况发生。 ```sql CREATE VIEW v_customers AS SELECT customer_id, first_name, last_name FROM customers; ``` 尽管如此,合理运用视图仍然可以在一定程度上增强应用程序的安全性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值