我在设计数据库模式方面没有很多经验,当然在 MySQL 中也没有。
所以我的问题是:“如果我有静态数据集,如国家、城市、性别 - 男性/女性/未定:P 等。如果我在内存中创建这个相对较小的表格,这对我来说会是一个优势吗? "
我在设计数据库模式方面没有很多经验,当然在 MySQL 中也没有。
所以我的问题是:“如果我有静态数据集,如国家、城市、性别 - 男性/女性/未定:P 等。如果我在内存中创建这个相对较小的表格,这对我来说会是一个优势吗? "
长话短说:不。因为少量的主要读取数据将根据其访问频率被缓存或放置到缓冲区中。
内存表也会在 MySQL 服务重新启动时清空,因此每次服务启动时您必须至少填充一次它们。
当您真的想避免 IO 时,MySQL 内存表最有用,因为您有大量的算术或 IO 以特定表为中心,并且如果服务器崩溃或重新启动,可能会丢失数据。由于在服务重新启动时被清除而使用有限的 MEMORY 表。
InnoDB 表将是最安全的选择。
如果您需要在服务器关闭期间保留数据,它不会帮助您在内存中创建这些表。内存表应该只用于存储临时数据。然而,没有什么可说的,您不能将基础数据存储在基于磁盘的表中,并使用一些过程将数据加载到内存表中以便更快地访问。
然而,这对我来说似乎是很多工作,因为,如果:
您使用正确索引的基于磁盘的表
您为整个索引分配足够的内存以驻留在内存中
你设计你的查询总是正确地利用你的索引
你利用 MySQL 的查询缓存
对于相对较小的表,您不太可能看到这些可能的显着性能提升。
这是一个很好的问题,但它不是一个容易回答的问题,因为它确实取决于个人用例。在大多数情况下,答案是否定的。
MEMORY 引擎与普通存储有点不同,顾名思义,它将数据存储在内存中而不是磁盘上——它默认使用基于散列的索引系统,速度非常快(尽管您也可以使用二叉树索引)。
MEMORY 引擎非常适合创建临时表,但是当服务器关闭时,数据会丢失。这将在您的应用程序逻辑中创建额外的工作来检查它是否存在并具有数据,如果不存在则填充它。
更好的方法是使用普通的数据库存储类型并具有良好的索引,因此它很快,如果经常使用,甚至可以查看缓存。
MEMORY 表有一些重要的限制:
不可以。创建一个普通的表并使用 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 您要缓存哪些查询,以及您不想缓存哪些查询。例如,您想缓存国家/地区列表,但如果您已经有内存缓存,您可能不想缓存配置文件查询。在这里使用缓存提示很有意义。