目前正在开展一个以医学词汇表 SNOMED 为中心的项目。Snomed 的核心是一个长度为 350,000 个术语/记录的(关系)数据集。我们希望能够快速查询此数据集以获取数据输入部分,我们希望在其中实现某种形式的自动完成/建议。
它目前位于 MySQL MyISAM DB 中,仅用于开发目的,但我们想开始尝试一些内存选项。它目前有 30MB,包括索引。MEMORY MySQL Engine 和 MemCached 是显而易见的选择,所以我的问题是您会建议其中哪一个,或者有更好的选择吗?如果这有区别的话,我们主要在应用程序级别使用 Python。
旁注:数据集具有单独的关系,将这些概念映射到常见的别名和缩写,大约有 130 万条记录......最终我们也希望在这里使用其中的一个子集。
答案1
目前尚不清楚您的要求到底是什么,但是对于如此小的数据库,由于所有数据都适合内存,因此任何引擎上的查询都可能很快。
MyISAM 和 InnoDB 之类的东西需要进行一些调整才能工作。Memcached 仅在您需要扩展到非常高负载的基于读取的工作负载时才有用,即那些对于单个服务器来说太高而无法从传统内存数据库提供服务的工作负载(Memcached 的主要功能是能够跨服务器池进行扩展)。但是 memcached 无法执行常规查询(例如范围扫描),只能查找特定键,因此它不是通用数据库。
我建议使用缓冲池大于数据集的 innodb,并正确选择主键。主键范围扫描应该表现良好,并且应该能够用于前缀匹配(例如完成用例)。
在普通硬件上,您可以将其扩展到每秒 1000 个查询。如果您需要更多,请添加复制从属服务器或考虑使用 memcached 之类的东西。
考虑在 StackOverflow 上提问?
答案2
您可以将表保存为 MEMORY 类型。这样会非常快,但需要您在使用前对其进行播种。我感觉您可以从中获得很多性能。在内存中,对于读取操作来说,它肯定比 InnoDB 和 MyISAM 更快。
我建议尝试几种不同的方法,然后使用 ApacheBench 进行超载搜索,看看哪种方法在压力之下最快屈服。