0

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

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

4

4 回答 4

2

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

内存表也会在 MySQL 服务重新启动时清空,因此每次服务启动时您必须至少填充一次它们。

当您真的想避免 IO 时,MySQL 内存表最有用,因为您有大量的算术或 IO 以特定表为中心,并且如果服务器崩溃或重新启动,可能会丢失数据。由于在服务重新启动时被清除而使用有限的 MEMORY 表。

InnoDB 表将是最安全的选择。

于 2013-03-15T16:15:14.393 回答
1

如果您需要在服务器关闭期间保留数据,它不会帮助您在内存中创建这些表。内存表应该只用于存储临时数据。然而,没有什么可说的,您不能将基础数据存储在基于磁盘的表中,并使用一些过程将数据加载到内存表中以便更快地访问。

然而,这对我来说似乎是很多工作,因为,如果:

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

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

  • 你设计你的查询总是正确地利用你的索引

  • 你利用 MySQL 的查询缓存

对于相对较小的表,您不太可能看到这些可能的显着性能提升。

于 2013-03-15T16:15:07.097 回答
1

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

MEMORY 引擎与普通存储有点不同,顾名思义,它将数据存储在内存中而不是磁盘上——它默认使用基于散列的索引系统,速度非常快(尽管您也可以使用二叉树索引)。

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

更好的方法是使用普通的数据库存储类型并具有良好的索引,因此它很快,如果经常使用,甚至可以查看缓存。

MEMORY 表有一些重要的限制:

  • MEMORY 表使用固定的行大小,因此如果您使用可变长度数据类型(例如 VARCHAR),它实际上将是固定的,并为每行使用可能的整个空间。
  • MEMORY 表不能包含 TEXT / BLOB 类型
  • 没有为了回收内存而进行垃圾收集的概念。如果从 MEMORY 表中删除单个行,则在删除整个表之前,以前使用的内存不会返回给操作系统。您可以使用 ALTER TABLE 命令强制执行此操作,但通常值得考虑是否要保留 MEMORY 表一段时间。
于 2013-03-15T16:15:28.327 回答
1

不可以。创建一个普通的表并使用 SQL_CACHE 来提高性能。

SELECT SQL_CACHE id, name FROM customer;

结果将被缓存在内存中以获得更好的性能,但数据仍会持久保存在硬盘中。

参考:http ://dev.mysql.com/doc/refman/4.1/en/query-cache-in-select.html

更新[添加更多信息]

参考链接

在 my.cnf 中,您可以为查询缓存类型设置 3 个可能的值:

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.

默认情况下,该值为 1(打开)。

但是,您的记忆力将受到限制。因此,您更愿意告诉 mysql 您要缓存哪些查询,以及您不想缓存哪些查询。例如,您想缓存国家/地区列表,但如果您已经有内存缓存,您可能不想缓存配置文件查询。在这里使用缓存提示很有意义。

于 2013-03-15T21:08:54.900 回答