一起聊聊MySQL数据查询太多会OOM吗
文 / @WordPress主题
MySQL作为一个基于关系型数据库的系统,在数据查询时,有时需要进行全表扫描,但是如果主机内存很小,又需要全表扫描一个非常大的表,会不会让内存用光呢?这是一个比较常见的问题。
如果一台DB主机内存只有100G,需要对一个200G的大表进行全表扫描,会不会把内存用光呢?根据MySQL的运作原理,在进行全表扫描时,MySQL会将全表划分为若干个分块进行扫描,每个分块的大小一般是16KB或32KB,所以内存使用并不会大到惊人的程度。此外,MySQL在进行全表扫描时,会避免使用大量内存,而是采用基于磁盘的排序算法进行数据的排序,这样不但能够有效减少内存的使用,还能够提高查询效率。
另外,有人会问,逻辑备份时,可不就是做整库扫描吗?若这样就会把内存吃光,逻辑备份不是早就挂了吗?实际上,在备份数据时,备份工具会使用一些特殊的技术,如增量备份、差异备份等,这些技术可以避免全库扫描造成的内存不足问题,因此逻辑备份是不会因为全表扫描造成内存用光的问题而挂掉的。
最后,大表进行全表扫描,看起来应该没问题,这是为什么呢?这是因为,在进行全表扫描时,MySQL会优先进行磁盘I/O,将数据加载到缓存中,然后才进行数据的排序和筛选,这样不但可以减少内存的使用,还能够提高查询的效率。
总之,MySQL的全表扫描并不会因为内存不足而挂掉,而是采用基于磁盘的排序算法进行数据的排序,即使是对非常大的表进行全表扫描,也不会使用过多的内存。

相关文章
-
MySQL Workbench怎么建立数据库(附:sql语句创建数据库方法) 2023-07-20 12:22:29
-
MySQL Workbench是什么?(附:如何设置中文教程) 2023-07-20 11:42:31
-
mysql修改表结构的语句是什么 2023-05-14 07:00:03
-
MySQL 语法整理介绍 2023-05-14 07:00:03
-
mysql驱动是什么 2023-05-14 07:00:03
-
qt5.8如何连接mysql 2023-05-14 07:00:03
-
mysql怎么将查询结果赋给变量 2023-05-14 07:00:03
-
mysql乐观锁和悲观锁的区别是什么 2023-05-14 07:00:03
-
一起聊聊MySQL主从延时的处理方案 2023-05-14 07:00:03
-
mysql怎么查询临时表 2023-05-14 07:00:02