0

我有一个巨大的人员数据库,并在上面用名字进行普通搜索。

SELECT * FROM tbl_person WHERE full_name LIKE 'Sparow%Jack%';
SELECT * FROM tbl_person WHERE full_name LIKE 'Sparow%';

我很少在这个表中插入新数据。

我想将常见的姓氏查询存储在硬盘上,查询已经存储在内存中,但每次服务器重新启动时我都会丢失它。

我的表中有 17 亿行,每行(带索引)占用 1k,是的,它是一个 1.7Tb 的数据库。

这是我想在磁盘上存储公共选择的主要原因。

Variable_name,Value
query_alloc_block_size,8192
query_cache_limit,1048576
query_cache_min_res_unit,1024
query_cache_size,4294966272
query_cache_type,ON
query_cache_wlock_invalidate,OFF
query_prealloc_size,8192

编辑 :

SELECT * FROM tbl_person WHERE full_name LIKE 'Savard%';

第一次执行 1000 秒,之后执行 2 秒。如果我重新启动系统并再次执行,查询又需要 1000 秒。

我只是想避免 mysql 再花 1000 秒运行我在重启之前已经做过的相同查询。

4

2 回答 2

0

如果您对数据执行许多此类查询,我建议您使用Apache LuceneSphinx索引您的表。数据库速度很快,但在对数百万行执行部分匹配时效率不高(尤其是 MySQL)。

我已经回答了一个关于 Zend Framework 和 Lucene 的类似问题,并且赞成 Zend 的解决方案,因为我相信它是最容易在 PHP 环境中设置和使用的。

幸运的是,Zend Framework 可以由模块使用,您可以轻松地仅使用Zend Search Lucene 模块本身,而无需整个类库。

** 编辑 **

索引器的作用不是替换您的数据库,而是通过提供一种执行部分搜索的方法来改进它的搜索功能。例如,给定您的表,您可能只索引一些字段(使它们“可查询”),并有其他静态(非索引)字段来引用数据库中的行。

使用索引器的优点是您还可以索引预计算并直接搜索它们,而不是查询数据库。

于 2013-09-05T14:25:08.803 回答
0

为什么不考虑使用 Redis 之类的东西进行缓存呢?

它是一种内存数据存储,现在非常流行。使用 Redis 的站点: http ://blog.togo.io/redisphere/redis-roundup-what-c​​ompanies-use-redis

Redis 还可以将数据持久化到磁盘:http ://redis.io/topics/persistence

但是对于缓存,保存到磁盘不应该是绝对关键的。这个想法是,如果某些数据没有被缓存,最坏的情况并不总是手动从磁盘加载,而是直接进入您的数据库。

于 2013-08-30T18:58:36.853 回答