问:慢 SQL 语句的几种常见诱因?
在这个时候,就可以说,面试官,您好,我觉得SQL慢出现的原因可以分为以下几种,切记,不要回答自己模糊不清的,没法自圆其说的即使知道你也别回答,不然就是给自己挖坑。。。
1、无索引、索引失效导致慢查询
如果表很大,而对where或者order by 后面字段没有建立索引,那这种情况查起来肯定很费力。但是有时候建立了索引,但在一些特定的场景下,索引还有可能会失效,所以索引失效也是导致慢查询的主要原因之一。失效场景很多,比如模糊查询白分号在前、查询的字段使用了函数或者做了计算操作都有可能导致索引失效。
2、锁等待
InnoDB 存储引擎支持行锁和表锁,我们要注意行锁升级为表锁的可能。在批量更新操作时,行锁就很可能会升级为表锁。MySQL 认为如果对一张表使用大量行锁,会导致事务执行效率下降,从而可能造成其它事务长时间锁等待和更多的锁冲突问题发生,致使性能严重下降,所以 MySQL 会将行锁升级为表锁。还有,行锁是基于索引加的锁,如果我们在更新操作时,条件索引失效,那么行锁也会升级为表锁。除了锁升级之外,行锁相对表锁来说,虽然粒度更细,并发能力提升了,但也带来了新的问题,那就是死锁。
3、不恰当的 SQL 语句
使用不恰当的 SQL 语句也是慢 SQL 最常见的诱因之一。例如,习惯使用 SQL 语句,在大数据表中使用 分页查询,以及对非索引字段进行排序等等。对于一些慢的SQL,我该怎么分析?
上面我说了一些关于SQL执行慢的原因,下面就该看看怎么分析这些SQL了
找出慢SQL
开启慢查询,慢查询是分析SQL执行慢的常见手段,主要有这几个参数,slow_query_log:慢查询开启状态,slow_query_log_file:慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录),long_query_time:查询超过多少秒才记录。
通过 EXPLAIN 分析 SQL 执行计划
通过 Show Profile 分析 SQL 执行性能
问:平时写SQL时该注意什么?有什么经验可谈?
到这里,如果面试官还在听你回答,这时候,你可以适当提高一点语气,说对于一些慢SQL,有很大一部分是由于我们开发者写SQL时不注意SQL优化导致的,那么我就说一下我知道的一些注意事项。。。(提高声音分贝,以防面试官睡着,并敲重点,告诉面试官,我准备装逼了,哈哈哈。。。)
统计时尽量使用count(*),count(*)≈count(1),大于count(主键)。
如果明确查找一条语句,请使用limit 1;,因为找到一条符合条件的记录后就不会继续查找了。
优化分页查询
避免 Select *
用到什么字段就具体写什么字段,原因除了 select * 查询所有字段会多出网络传输开销之外,还有更重要的一点是,select * 无法使用覆盖索引。
尽量使用 MySQL 5.6以后的版本
对于使用索引方面对索引字段做函数操作或者做运算操作,都不能使用上索引。
所以针对这一点,除了我们索引的字段不要加函数之外。还要注意一些隐式转换,比如,交易日志表(tradelog),tradeid 的字段类型是 varchar(32),字段有索引,但是当你执行 select * from tradelog where tradeid=110717;语句,你发现走的还是全索引扫描。这是因为它其实做了类型转换,相当于这么执行mysql> select * from tradelog where CAST(tradid AS signed int) = 110717;。隐式字符编码转换
如果两张表使用的编码集不一致,比如一个是utf8mb4,一个是utf8,那么这两个字段连接后,相当于做了一次CONVERT(traideid USING utf8mb4),这样也用不了索引。其实字符集不同只是条件之一,连接过程中要求在被驱动表的索引字段上加函数操作,是直接导致对被驱动表做全表扫描的原因。
问:1. 什么是SQL查询优化?
答: 查询优化是一种以某种方式编写查询以便可以快速执行的过程。对于任何标准应用而言,这都是重要的一步。
问:有哪些技巧可以提高SQL查询的性能?
答: 优化SQL查询可以对性能带来实质性的积极影响。它还取决于您所拥有的RDBMS知识水平。现在让我们看一下调整SQL查询的一些技巧。
1.尽量不要编写冗长的查询,使用视图和存储过程,它有助于最大程度地减少网络负载。
2.最好引入约束而不是触发器。它们比触发器更有效,并且可以提高性能。
3.使用表级变量而不是临时表。
4. UNION ALL子句的响应速度比UNION快。它不会查找重复的行,而UNION语句会查找重复的行,无论它们是否存在。
5.防止使用DISTINCT和HAVING子句。
6.避免过多使用SQL游标。
7.构建存储过程时,请使用SET NOCOUNT ON子句。它表示受T-SQL语句影响的行。这将导致网络流量减少。
8.优良作法是返回所需的列而不是表的所有列。
9.最好不要使用复杂的Join,并避免不当地使用触发器。
10.创建表索引并遵守标准
问:有哪些影响数据库性能的瓶颈?
答: 在Web应用程序中,数据库层可能被证明是实现最后一英里可扩展性的关键瓶颈。如果数据库存在性能泄漏,则可能成为瓶颈,并可能导致问题。一些常见的性能问题如下。
1. CPU使用率异常是最明显的性能瓶颈。但是,您可以通过扩容CPU或替换为高级CPU来修复它。它可能看起来像是一个简单的问题,但异常的CPU使用率可能导致其他问题。
2.内存不足是下一个最常见的瓶颈。如果服务器无法管理峰值负载,那么它将对性能造成很大的问号。对于任何应用程序来说,执行内存都是至关重要的,因为它比持久性内存要快。同样,当RAM下降到特定阈值时,操作系统将转向使用交换内存。但这会使应用程序运行非常缓慢。
您可以通过扩容RAM来解决它,但是如果有内存泄漏,它将无法解决。在这种情况下,您需要分析应用程序,以识别其代码中的潜在泄漏。
3.对外部存储设备(如SATA磁盘)的过度依赖也可能成为瓶颈。在将大量数据写入磁盘时,其影响显而易见。如果输出操作非常慢,则很明显表明问题已成为瓶颈。
在这种情况下,您需要进行扩容,用更快的驱动器替换现有驱动器。尝试升级到SSD硬盘驱动器或类似产品。
问:改善SQL性能涉及哪些步骤?
答:
发现–首先,找出需要改进的地方。探索诸如探查器,查询执行计划,SQL调优顾问,动态视图和自定义存储过程之类的工具。
审核–集中讨论可用数据以隔离主要问题。
提议–这是一种可以提高性能的标准方法。但是,您可以对其进行进一步自定义以最大程度地受益。
1.识别字段并创建索引。
2.修改大型查询以使用创建的索引。
3.刷新表和视图并更新统计信息。
4.重置现有索引并删除未使用的索引。
5.查找并清除死块。
验证–测试SQL性能调整方法。定期监视进度。另外,跟踪是否对应用程序的其他部分有不利影响。
发布–现在,是时候与团队中的每个人共享工作解决方案了。让他们知道所有最佳做法,以便他们可以轻松使用它。
问:什么是执行计划(explain plan)?
答: 这是SQL中使用的术语,它显示其优化程序计划用于执行SELECT / UPDATE / INSERT / DELETE语句的执行计划。
以上就是“2023年精选出来的几道sql语句优化面试题”,你能回答上来吗? 如果想要了解更多的Java面试题相关内容,可以私信我要更多面试题。
另外分享薅羊毛地址,最近这家在送书,抽到还包邮,快来一起薅→团练送书