Mysql 对静态值集使用内存表

Mysql 对静态值集使用内存表,mysql,Mysql,我在设计数据库模式方面没有很多经验,当然在MySQL方面也没有 所以我的问题是:“如果我有静态的数据集,比如国家、城市、性别-男/女/未决定:p等等。如果我在内存中创建这个相对较小的表,这对我来说会是一个优势吗?”如果您需要在服务器关闭期间持久保存数据,那么在内存中创建这些表对您没有帮助。内存表只能用于存储临时数据。不过,没什么好说的,您不能将基本数据存储在基于磁盘的表中,并使用一些进程将数据加载到内存表中以实现更快的访问 然而,这对我来说似乎是一个很大的工作,因为,如果: 使用正确索引的基于

我在设计数据库模式方面没有很多经验,当然在MySQL方面也没有


所以我的问题是:“如果我有静态的数据集,比如国家、城市、性别-男/女/未决定:p等等。如果我在内存中创建这个相对较小的表,这对我来说会是一个优势吗?”

如果您需要在服务器关闭期间持久保存数据,那么在内存中创建这些表对您没有帮助。内存表只能用于存储临时数据。不过,没什么好说的,您不能将基本数据存储在基于磁盘的表中,并使用一些进程将数据加载到内存表中以实现更快的访问

然而,这对我来说似乎是一个很大的工作,因为,如果:

  • 使用正确索引的基于磁盘的表

  • 您可以为整个索引分配足够的内存以驻留在内存中

  • 您将查询设计为始终正确使用索引

  • 您可以利用MySQL的查询缓存


对于大小相对较小的表,您可能看不到有如此显著的性能提高。

如果您需要在服务器关闭期间持久保存数据,那么在内存中创建这些表对您没有帮助。内存表只能用于存储临时数据。不过,没什么好说的,您不能将基本数据存储在基于磁盘的表中,并使用一些进程将数据加载到内存表中以实现更快的访问

然而,这对我来说似乎是一个很大的工作,因为,如果:

  • 使用正确索引的基于磁盘的表

  • 您可以为整个索引分配足够的内存以驻留在内存中

  • 您将查询设计为始终正确使用索引

  • 您可以利用MySQL的查询缓存


对于相对较小的表,您可能看不到有如此显著的性能提高。

长话短说:没有。因为少量的读取数据将根据访问频率缓存或放入缓冲区

重新启动MySQL服务时,内存表也会清空,所以每次启动服务时,您必须至少填充一次内存表

当您确实想要避免IO时,MySQL内存表非常有用,因为您有大量的算术运算或IO集中在一个特定的表上,如果服务器崩溃或重新启动,可能会丢失数据。由于服务重新启动时被清除而导致使用受限的内存表


InnoDB表将是最安全的选择

长话短说:不。因为少量的读取数据将根据访问频率被缓存或放入缓冲区

重新启动MySQL服务时,内存表也会清空,所以每次启动服务时,您必须至少填充一次内存表

当您确实想要避免IO时,MySQL内存表非常有用,因为您有大量的算术运算或IO集中在一个特定的表上,如果服务器崩溃或重新启动,可能会丢失数据。由于服务重新启动时被清除而导致使用受限的内存表


InnoDB表将是最安全的选择

这是一个好问题,但回答起来并不容易,因为它确实取决于单个用例。在大多数情况下,答案是否定的

内存引擎与普通存储略有不同,因为它的名称表明它将数据存储在内存中而不是磁盘上–默认情况下,它使用基于哈希的索引系统,速度非常快(尽管您也可以使用二叉树索引)

内存引擎非常适合创建临时表,但当服务器关闭时,数据会丢失。这将在应用程序逻辑中创建额外的工作,以检查它是否存在,是否有数据,如果没有,则填充它

一个更好的方法是使用普通的数据库存储类型,并有一个好的索引,这样它很快,如果使用得很多,甚至可以查看缓存

内存表有一些重要的限制:

  • 内存表使用固定的行大小,因此如果使用VARCHAR之类的可变长度数据类型,它实际上是固定的,并且使用每行可能的全部空间
  • 内存表不能包含文本/BLOB类型
  • 为了回收内存,没有垃圾回收的概念。如果从内存表中删除单个行,则在删除整个表之前,不会将以前使用的内存返回操作系统。您可以使用ALTERTABLE命令强制执行此操作,但如果您要将内存表保留一段时间,通常值得考虑

    • 这是一个很好的问题,但回答起来并不容易,因为它确实取决于各个用例。在大多数情况下,答案是否定的

      内存引擎与普通存储略有不同,因为它的名称表明它将数据存储在内存中而不是磁盘上–默认情况下,它使用基于哈希的索引系统,速度非常快(尽管您也可以使用二叉树索引)

      内存引擎非常适合创建临时表,但当服务器关闭时,数据会丢失。这将在应用程序逻辑中创建额外的工作,以检查它是否存在,是否有数据,如果没有,则填充它

      一个更好的方法是使用普通的数据库存储类型,并有一个好的索引,这样它很快,如果使用得很多,甚至可以查看缓存

      内存表有一些重要的限制:

      • 内存表使用固定的行大小,因此如果使用VARCHAR之类的可变长度数据类型,它实际上是固定的,并且使用每行可能的全部空间
      • 内存表不能包含文本/BLOB类型
      • 没有垃圾收集的概念
        SELECT SQL_CACHE id, name FROM customer;
        
        query_cache_type = 0 --> query cache is totally off. MySQL won't cache anything at all.
        query_cache_type = 1 --> query cache is on by default. you have to use SQL_NO_CACHE hint to disallow caching some queries (e.g., highly dynamic queries)
        query_cache_type = 2 --> query cache is off by default. you have to use SQL_CACHE hint to allow caching.