当前位置:首页 > 内存 > 正文

MySQL把整个表缓存到内存

  • 内存
  • 2024-06-07 20:34:15
  • 2329

一、MySQL内存使用以及优化中需要的几点注意
1.从内存读取数据需要几微秒。从磁盘读取需要几毫秒。两者之间的差异是一个数量级。所以如果要优化数据库,首先需要优化i。



[thread]在Myisam中只是用来在插入数据时临时缓存数据。如果我们使用下面的写语句,该内存区域将用于批量写入数据文件:insert...select...insertinto...values...loaddatainfile...into...[global]设置大小内存区域,innodb存储引擎用来存储数据字典信息和一些内部数据结构。因此,如果我们的mysql实例包含很多数据库对象(比如很多表),我们就需要相应调整这个参数的大小,以保证所有数据都在内存中,以保证效率。确定该参数是否有足够的内存是相对容易的。因为如果太小,MySQL会在错误日志中记录警告。[global]用于控制Innodb缓冲池中脏页(已修改但未写入数据文件的脏数据)未写入数据文件的比例。该值越大,从内存写入磁盘的次数就越少。因此,可以在一定程度上减少磁盘I/O。但是,如果这个值很大,数据库崩溃,重启时间可能会很长。因为会有大量的事务数据需要从日志文件中恢复并写入数据文件。同时,太大的ratio值也会导致flush进程在达到ratio设置的上限后“过于暴力”地写入数据,导致性能大幅波动。8、如果我们要检索整个表的大部分数据,索引扫描并不一定比全表扫描好。是基于行的数据库,而读取数据是基于页的。行存储在每个页面上。随着每行中的数据量减少,每页上存储的行数增加。每次使用io时,都可以删除更多行。处理相同的数据时,处理的页面更少。也就是减少了io的数量。直接提高性能。另外,由于我们的内存大小是有限的,增加每页的行数就意味着增加每块数据缓存的数据量,提高命中率。10.我们无法改变数据的存储内容,但我们可以改变数据的存储方式。1)数字类型。作为最后的手段,您不应使用Double类型。除了空间要求比较大之外,还存在精度问题。同样,对于固定精度的十进制数,请勿使用十进制数。建议乘以固定倍数,转为整数存储。可以节省存储空间,无需额外的维护成本。对于存储整数,建议分开tinyint/int/bigint。它们所占用的存储空间对于存储数据有一定的间隙。2)字符类型。作为最后的手段,不要使用文本类型。其加工效率低于木炭和varchar。建议使用char类型的固定长度字段。使用Varchar来实现可变长度。Varchar不能随意分配很大的长度。由于长度范围不同,MySQL对它们的处理方式有所不同。博客上有一篇文章介绍了Varchar的处理方法。假设声明了varchar(1000),当MySQL将这些数据存储在磁盘上时,数据长度为45,它们在磁盘上占用大约45个空间。然而,当这个数据在内存中时,它仍然占用了1000个空间。浪费了很多。3)事件类型。尝试使用时间戳。所使用的存储空间仅为datetime类型的一半。对于需要精确到特定日期的类型,建议使用日期类型。因为它需要三个字节来保存。小于时间戳。不建议使用int来存储Unix时间戳。这是违反直觉的,并且没有任何好处。4)对表的字段进行适当的冗余。例如,包含文章的摘要以及文章信息表,而不是文章的详细内容表。