SQL执行优化:全表扫描建立索引

发布时间 2023-03-28 11:50:26作者: trylab

针对全表扫描的SQL优化

原理:在进行大表查询时,使用索引来提高SQL的执行速度。

全文包含以下内容:

  1. SQL中的索引是什么?
  2. 如何查看SQL中是否使用索引?
  3. 案例:通过索引来改善SQL查询速度。

SQL中的索引是什么?有什么用?

索引可以看作是对数据表中某些列的快速访问结构。当对表的某些列创建索引后,查询就可以通过索引直接获取数据行的位置信息,而不是通过扫描整个表来查找所需行。这样可以大大减少查询所需的时间,特别是当表中的数据量很大时,索引的作用更加明显。

在实际应用中,索引通常会被用于WHERE语句、JOIN语句、ORDER BY语句和GROUP BY语句等操作中,以提高查询的效率。使用索引可以避免全表扫描,从而减少I/O操作,提高查询的响应速度。此外,索引还可以在数据表中保持唯一性,从而避免数据重复和错误,提高数据的准确性和可靠性。

不过,索引的创建也有一定的代价。对于大型数据表,索引的创建和维护可能会占用大量的存储空间和计算资源。此外,索引的不当使用也可能导致查询性能的下降,甚至出现锁定和死锁等问题。

因此,在使用索引时需要根据实际情况进行权衡和选择,选择合适的索引方式和索引列,同时注意索引的优化和维护,以充分发挥索引的作用,提高数据库的性能和稳定性。

数据库中的执行计划是什么?有什么用?

执行计划是数据库系统根据查询语句生成的一种查询执行计划,它描述了查询语句在数据库中的执行过程,包括使用哪些索引、哪些表、何种连接方式等。查询的执行计划是数据库系统优化查询执行过程的重要手段之一,可以帮助优化查询语句的性能,提高查询效率。查询优化器会根据查询语句的复杂度、数据量、索引、数据分布等多个因素来生成执行计划。

执行计划可以通过SQL中的EXPLAIN命令来查看。通过分析执行计划,可以找到查询语句中的瓶颈,例如表扫描或者索引扫描,从而进行优化。优化查询语句的性能可以减少查询时间,提高系统的响应速度,对于大型数据库来说尤其重要。

在执行计划中,可以看到查询语句中涉及到哪些表,以及在什么顺序下进行连接,以及在每个步骤中使用了哪些索引。如果查询语句中使用了多个表或者复杂的连接,那么通过分析执行计划可以更好地了解查询语句的执行情况和性能。执行计划不仅可以帮助优化查询语句的性能,还可以帮助DBA了解查询语句的执行情况,及时发现问题,保障数据库的稳定性和可靠性。

案例:通过索引来改善SQL查询速度

案例整体思路:在大表中,比较使用索引前后的SQL执行速度。

  1. 执行SQL,查看查询过程中的扫描对象数量。

留意到查询时间是0.2s(并不算慢,表还是不够大),扫描行数是30.4w行。

未使用索引

  1. 通过执行计划,查看SQL执行过程的调用关系。

执行计划显示,查询SQL调用2张表的数据,其中在e表中全表扫描近30w行;在s表中通过主键,过程中仅扫描9行。查询过程主要耗时点在e表中。

优化方向:在e表中建立索引,优化SQL查询效率。

执行计划

关于Filtered

在数据库执行计划中,Filtered项是一个重要的指标。它指的是查询结果集与总结果集的比例,也就是查询条件的过滤程度。Filtered的值越接近于1,说明查询条件越严格,返回结果集的比例越高,查询效率也越高。

Filtered的值能够帮助我们确定查询语句的效率和性能。在优化查询语句时,我们可以通过增加或修改查询条件来提高Filtered的值,从而提高查询效率。例如,我们可以添加一个索引或者使用更合适的查询条件来过滤数据,从而减少查询的结果集,提高查询效率。

需要注意的是,Filtered项并不是查询语句的唯一指标,还需要结合其他指标进行综合分析和优化。在实际的应用中,我们需要根据具体情况综合考虑查询效率、数据量、索引、数据分布等多个因素,进行查询语句的优化和调整,以提高数据库的性能和稳定性。

总之,Filtered是数据库执行计划中一个重要的指标,它可以帮助我们了解查询语句的效率和性能,优化查询语句,提高数据库的性能和稳定性。

  1. 分析e表结构,在hire_date列上创建索引,再次分析原SQL的执行计划。

对比索引前后的执行计划,发现e表中通过索引idx_hire_date,使得最终的扫描数量从近30w行,减少到1527行。

有索引的执行计划

索引原理

下图简单描述在数据表中建立索引的基本思想。

索引是一种特殊的数据结构,它可以提高查询效率和性能。当我们需要查询数据库中的数据时,查询引擎会根据查询条件扫描整个数据表,然后返回符合条件的记录。这种扫描方式在数据量较小的情况下还可以接受,但是当数据量增大时,扫描整个数据表的代价就会变得非常高昂,导致查询效率变得很低。

为了解决这个问题,我们可以在数据表中建立索引。索引可以看作是对数据表中某些列的快速访问结构。当对表的某些列创建索引后,查询就可以通过索引直接获取数据行的位置信息,而不是通过扫描整个表来查找所需行。这样可以大大减少查询所需的时间,特别是当表中的数据量很大时,索引的作用更加明显。

索引原理

  1. 验证建立索引后的SQL查询

对比索引前后的SQL查询速率,未建立索引前,耗时为221ms;建立索引后耗时17ms。

索引后的SQL查询

总结

本文解释了数据库中索引、执行计划的概念。通过建立索引,SQL的执行效率明显提高。