字符串查找优化的建议

时间:2012-09-24 18:07:27

标签: mysql django algorithm lookup backend

我们有以下MySQL数据库表,大约有75,000个条目。表中的每个条目表示系统中可以检索其他数据的符号。查询此表是为了自动完成目的 - 用户查找符号,然后匹配符号的名称或其标记(以分号分隔的字符串列表)。当用户选择正确的符号时,获取相关数据。这是表格的描述:

CREATE TABLE `symbols` (  
  `id` int(11) NOT NULL AUTO_INCREMENT,   
  `name` varchar(512) NOT NULL,  
  `tags` varchar(512) DEFAULT NULL,  
  `type` enum('1','2','3','4','5','6','7','8','9') NOT NULL,  
  `popularity` int(11) DEFAULT '0',  
  PRIMARY KEY (`id`),  
  UNIQUE KEY `uc_symbol_name` (`type`,`symbol`),  
  KEY `symbol_idx` (`symbol`),  
  KEY `type_popularity_idx` (`type`,`popularity`)  
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

上表与大量数据一起存储在后端机器上,该机器通过JSON API提供此数据。目前,我们的前端JavaScript代码直接在AJAX中查询后端服务器以执行自动完成。相反,为了加快速度,我们希望在服务器前端的服务器上创建符号表的本地缓存版本(前端用django编写)。这是可能的,因为该表包含不到100,000个符号,并且因为该表仅每分钟更新一次。此外,它将允许我们实现更好的匹配算法,如Levenshtein距离。

您将如何创建此类缓存符号表?显然,查找必须在代码(可能是Python)中进行,但是如何存储数据,以及如何每分钟同步一次?我们在django前端服务器上运行了Redis服务器,但这引入了持久性问题......非常欢迎任何想法!

1 个答案:

答案 0 :(得分:0)

只需使用简单的哈希表以及“上次更新时间”。每次在哈希中进行查找时,请检查“上次更新”时间。如果它过去超过一分钟,则将数据转储到哈希中并从数据库重新加载。当然,你必须确保避免竞争条件......

还有其他选择,但这是最简单的方法,并且最容易正确编码。如果您发现每分钟达到一个事务并且大数据库操作的额外延迟是不可接受的,那么您可以提出一些更复杂的事情(例如在后台线程上异步运行数据库操作)。要为这种可能性做好准备,请将此代码封装在一个类中。 (如果它太慢,你可以在不影响任何其他代码的情况下使用实现。)

当然,如果您需要更高的性能,还可以做其他事情。您可以在数据库记录中添加updated_time列,然后只加载自上次以来已更新的列。这会让事情变得更快吗?如果确实如此,差异是否足够大,甚至不重要?除非你试一试,否则没有办法知道。这就是为什么最好先尝试更简单的解决方案,看看它是否达到了你的性能目标。