一起聊聊MySQL数据查询太多会OOM吗

文 / @WordPress主题

MySQL作为一个基于关系型数据库的系统,在数据查询时,有时需要进行全表扫描,但是如果主机内存很小,又需要全表扫描一个非常大的表,会不会让内存用光呢?这是一个比较常见的问题。

如果一台DB主机内存只有100G,需要对一个200G的大表进行全表扫描,会不会把内存用光呢?根据MySQL的运作原理,在进行全表扫描时,MySQL会将全表划分为若干个分块进行扫描,每个分块的大小一般是16KB或32KB,所以内存使用并不会大到惊人的程度。此外,MySQL在进行全表扫描时,会避免使用大量内存,而是采用基于磁盘的排序算法进行数据的排序,这样不但能够有效减少内存的使用,还能够提高查询效率。

另外,有人会问,逻辑备份时,可不就是做整库扫描吗?若这样就会把内存吃光,逻辑备份不是早就挂了吗?实际上,在备份数据时,备份工具会使用一些特殊的技术,如增量备份、差异备份等,这些技术可以避免全库扫描造成的内存不足问题,因此逻辑备份是不会因为全表扫描造成内存用光的问题而挂掉的。

最后,大表进行全表扫描,看起来应该没问题,这是为什么呢?这是因为,在进行全表扫描时,MySQL会优先进行磁盘I/O,将数据加载到缓存中,然后才进行数据的排序和筛选,这样不但可以减少内存的使用,还能够提高查询的效率。

总之,MySQL的全表扫描并不会因为内存不足而挂掉,而是采用基于磁盘的排序算法进行数据的排序,即使是对非常大的表进行全表扫描,也不会使用过多的内存。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。