MySQL 排序优化

MySQL 排序优化,第1张

2.1 排序方式

数据量小则在内存排序, 数据量大则使用磁盘排序

内存排序 : 直接使用"快速排序"

磁盘排序 : 先将数据分块, 对每个独立的块使用"快速排序", 并将各个块的排序结果存在磁盘上, 然后将各个排好序的块进行合并(merge), 最后返回排序结果

2.2 排序算法

3. 注意点 :

mysql的优化大的有两方面:

1、配置优化

配置的优化其实包含两个方面的: *** 作系统内核的优化和mysql配置文件的优化

1)系统内核的优化对专用的mysql服务器来说,无非是内存实用、连接数、超时处理、TCP处理等方面的优化,根据自己的硬件配置来进行优化,这里不多讲;

2)mysql配置的优化,一般来说包含:IO处理的常用参数、最大连接数设置、缓存使用参数的设置、慢日志的参数的设置、innodb相关参数的设置等,如果有主从关系在设置主从同步的相关参数即可,网上的相关配置文件很多,大同小异,常用的设置大多修改这些差不多就够用了。

2、sql语句的优化

1)  尽量稍作计算

Mysql的作用是用来存取数据的,不是做计算的,做计算的话可以用其他方法去实现,mysql做计算是很耗资源的。

2)尽量少 join

MySQL 的优势在于简单,但这在某些方面其实也是其劣势。MySQL 优化器效率高,但是由于其统计信息的量有限,优化器工作过程出现偏差的可能性也就更多。对于复杂的多表 Join,一方面由于其优化器受限,再者在 Join 这方面所下的功夫还不够,所以性能表现离 Oracle 等关系型数据库前辈还是有一定距离。但如果是简单的单表查询,这一差距就会极小甚至在有些场景下要优于这些数据库前辈

3)尽量少排序

排序 *** 作会消耗较多的 CPU 资源,所以减少排序可以在缓存命中率高等 IO 能力足够的场景下会较大影响 SQL的响应时间。

对于MySQL来说,减少排序有多种办法,比如:

通过利用索引来排序的方式进行优化

减少参与排序的记录条数

非必要不对数据进行排序

4)尽量避免 select *

在数据量少并且访问量不大的情况下,select * 没有什么影响,但是量级达到一定级别的时候,在执行效率和IO资源的使用上,还是有很大关系的,用什么字段取什么字段,减少不必要的资源浪费。

5)尽量用 join 代替子查询

虽然 Join 性能并不佳,但是和 MySQL 的子查询比起来还是有非常大的性能优势。MySQL 的子查询执行计划一直存在较大的问题,虽然这个问题已经存在多年,但是到目前已经发布的所有稳定版本中都普遍存在,一直没有太大改善。虽然官方也在很早就承认这一问题,并且承诺尽快解决,但是至少到目前为止我们还没有看到哪一个版本较好的解决了这一问题。

1、利用有序索引获取有序数据: using index

2、文件排序: using filesort

如果索引不能用于满足 ORDER BY 子句,MySQL 将执行 filesort 读取表行并对它们进行排序的 *** 作。内存大小根据 sort_buffer_size 系统变量来控制(每个thread独享的,同一时刻在mysql可能存在多个sort buffer区域),如果结果集太大无法在内存中,就会使用临时磁盘文件

1、使用索引并且只选择索引列

如果还必须读取不在索引中的列 select * ,全表扫描快就不走索引了

例子:game_order_info建立复合索引(game_id,source_id)

2、 key_part1 是常量,所以通过索引访问的所有行都是 key_part2 有序的,如果子句有足够的选择性使得索引范围扫描比表扫描便宜,则索引可以避免排序: ( key_part1 , key_part2 )

例子:

3、 key_part1 将与一个常量进行比较。如果 WHERE 子句的选择性足以使索引范围扫描比表扫描的行少,则使用索引

4、 ORDER BY 没有 key_part1 ,但所有选定的行都有一个常 key_part1 量值,因此仍然可以使用索引:

MySQL 5.7及以下版本, GROUP BY 在某些条件下隐式排序。在 MySQL 8.0 中,这种情况不再发生,因此 ORDER BY NULL 不再需要在末尾指定抑制隐式排序。但是,查询结果可能与以前的 MySQL 版本不同。要生成给定的排序顺序,需要 ORDER BY 子句

1、 order by 后的字段使用索引,查询少量的数据,使得在内存中进行排序

2、增加 sort_buffer_size 变量值,结果集排序缓冲区

3、增加 read_rnd_buffer_size 变量值,以便一次读取多行

4、将 tmpdir 系统变量更改为指向具有大量可用空间的专用文件系统

参考:

https://dev.mysql.com/doc/refman/8.0/en/order-by-optimization.html


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6255059.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-19
下一篇 2023-03-19

发表评论

登录后才能评论

评论列表(0条)

保存