sql优化面试题

SQL优化

优化手段

对于大表数据的查询的优化,尽量走索引。

利用主从复制,读写分离

将大表进行垂直拆表,冷热数据分离,减少不必要的列查询。

将大表进行水平拆表,利用shardingJDBC,Mycat这类组件辅助开发。

设置合适的值,根据内容的长度来设置。

对于在业务中一定是固定长度的数值就用char,不是固定的用varchar.

表的字段尽量设置为not null并且设置默认值。

连表的时候要小表驱动大表。

使用连接查询代替子查询

避免比较null值,最好每个字段设置为not null并给一个默认值。

避免使用!=,not in这类反的查询,会导致全表扫描

避免对查询列进行计算,函数,表达式运算等操作。

select指明需要查的列,不用select *

对于连续的数据不用用in,用between and。

能用exits尽量用exits,而不用in。

避免Using temporary

mysql-索引出现Using temporary场景
在MySQL中,查询执行过程中出现Using temporary提示,通常意味着MySQL需要创建一个临时表来存储中间结果。这种情况多发生在数据库
    优化器无法通过现有的索引直接有效地执行查询时,尤其在复杂的查询条件下。
    以下是几种索引设计或查询场景可能导致Using temporary出现的情况:

场景1: 复杂的查询条件,尤其是GROUP BY语句
在使用GROUP BY时,如果查询涉及到复杂的表达式,或者GROUP BY列没有适当的索引,MySQL可能需要创建一个临时表来聚集数据。例如,
    当GROUP BY依据的字段在索引中不是第一个字段时,可能会触发临时表的使用。

场景2: 多列的排序或分组
当在ORDER BY 或者 GROUP BY 后的列不是一个单一列,而是一个表达式,或者列没有合适的索引时,MySQL可能使用临时表存储中间结果,
    再对临时表进行排序或分组。

场景3: DISTINCT操作
在执行DISTINCT操作时,如果涉及到的列没有相应的索引,MySQL会创建临时表来存储结果并执行去除重复的处理,
    这也会触发Using temporary警告。

场景4: 某些函数和表达式的使用
例如,当查询中包含COUNT(DISTINCT ...), MIN(...), MAX(...)等聚合函数时,如果没有适当的索引,可能会触发临时表的使用。
    特别是当这些函数涉及到表达式计算或不被索引覆盖的列时。

场景5: ALL, ANY, SOME子查询
在进行这些子查询操作时,如果子查询中的求最大值或最小值等操作无法用索引覆盖,MySQL可能会创建临时表来辅助运算。

如何避免Using temporary:
为了避免出现使用临时表的情况,可以考虑以下策略:

创建合适的索引:尽可能为GROUP BYORDER BYDISTINCT涉及的列创建索引。确保索引覆盖到查询中所有使用的列或表达式,
    尤其是GROUP BY及相关表达式的字段。
优化查询:避免在GROUP BYDISTINCT中使用复杂表达式,尽量简化查询逻辑。
使用覆盖索引:建立多列索引时,确保按照查询中最常涉及到的字段顺序排列,以达到覆盖索引的效果,减少数据读取。
数据分析与索引维护:定期分析数据分布和查询模式,调整索引结构,确保索引对常见查询模式最优化。
检查查询的WHERE条件和JOIN语句:确保任何用于过滤或连接的列都是高效的,并且有适当的索引支持。
通过以上的调整,可以有效减少或避免Using temporary的出现,从而提高查询效率和响应速度。

explain详解

JSON 名称意义
idselect_id标识符SELECT
select_type没有类型SELECT
tabletable_name输出行的表
partitionspartitions匹配的分区
typeaccess_type联接类型
possible_keyspossible_keys可供选择的可能索引
keykey实际选择的索引
key_lenkey_length所选密钥的长度
refref与索引比较的列
rowsrows要检查的行的估计值
filteredfiltered按表条件筛选的行的百分比
Extra没有其他信息:
extra
Using filesort
MySQL有两种方式可以生成有序的结果,通过排序操作或者使用索引,当Extra中出现了Using filesort 说明MySQL使用了后者,
    但注意虽然叫filesort但并不是说明就是用了文件来进行排序,只要可能排序都是在内存里完成的。
    大部分情况下利用索引排序更快,所以一般这时也要考虑优化查询了。使用文件完成排序操作,
    这是可能是ordery by,group by语句的结果,这可能是一个CPU密集型的过程,可以通过选择合适的索引来改进性能,
    用索引来为查询结果排序。

Using temporary
用临时表保存中间结果,常用于GROUP BYORDER BY操作中,一般看到它说明查询需要优化了,就算避免不了临时表的使用
    也要尽量避免硬盘临时表的使用。
	什么情况下会产生这个呢?
    
    
Not exists
MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行, 就不再搜索了。

Using index
说明查询是覆盖了索引的,不需要读取数据文件,从索引树(索引文件)中即可获得信息。如果同时出现using where,
    表明索引被用来执行索引键值的查找,没有using where,表明索引用来读取数据而非执行查找动作。
    这是MySQL服务层完成的,但无需再回表查询记录。

Using index condition
这是MySQL 5.6出来的新特性,叫做“索引条件推送”。简单说一点就是MySQL原来在索引上是不能执行如like这样的操作的
    ,但是现在可以了,这样减少了不必要的IO操作,但是只能用在二级索引上。

Using where
使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。注意:Extra列出现Using where表示MySQL服务器将
    存储引擎返回服务层以后再应用WHERE条件过滤。

Using join buffer
使用了连接缓存:Block Nested Loop,连接算法是块嵌套循环连接;Batched Key Access,连接算法是批量索引连接

impossible where
where子句的值总是false,不能用来获取任何元组

select tables optimized away
在没有GROUP BY子句的情况下,基于索引优化MIN/MAX操作,或者对于MyISAM存储引擎优化COUNT(*)操作,
    不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。

distinct
优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作

order by 优化

order by 的列 没有索引 则 using filesort

有索引的情况:

如果order by 索引 desc ,using filesort ,因为建立索引默认是asc 当然你也可在创建索引的时候 desc

如果order by 的数据过多,会导致内部排序的的内存不够,也会using filesort

如果where 条件中 有一个其他的字段的索引 依然using filesort

如果是联合索引 没有按照最左匹配 也会using filesort

索引选择性不高,大量重复值,也会using filesort

如果查询中没有使用到索引的所有列,MySQL可能不会使用索引排序。

  • 15
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Hive SQL优化面试题通常涉及以下几个方面: 1. 查询优化:了解如何通过索引、分区等技术来优化Hive SQL查询性能。可以提到使用合适的索引、分区和分桶来减少数据扫描量,提高查询效率。 2. 性能调优:理解常见的性能瓶颈和优化策略,例如避免全表扫描、减少数据倾斜、合理设置并行度等。可以提到使用合适的数据类型、避免不必要的数据转换、使用合适的连接方式等来提高性能。 3. EXPLAIN关键字的使用:掌握使用EXPLAIN关键字来分析查询执行计划,了解查询的执行顺序和涉及的操作,从而找到潜在的性能问题并进行优化。 4. 解答优化相关的题目:在面试中可能会遇到一些关于查询优化和性能调优的具体问题,例如如何优化某个特定的查询语句,如何处理大数据量的查询等。在回答时可以结合自己的实际经验和知识来给出合理的解决方案。 综上所述,Hive SQL优化面试题主要涉及查询优化、性能调优、使用EXPLAIN关键字分析查询计划以及解答具体的优化问题。掌握这些知识和技巧可以帮助提升在Hive SQL领域的技能和竞争力。 #### 引用[.reference_title] - *1* *3* [Hive SQL大厂面试题必考大全](https://blog.csdn.net/m0_47256162/article/details/131687792)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Hive SQL面试题(附答案)](https://blog.csdn.net/a934079371/article/details/122227602)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zhou吗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值