我有一个巨大的个人数据库,并用上面的名字进行普通搜索。
SELECT * FROM tbl_person WHERE full_name LIKE 'Sparow%Jack%';
SELECT * FROM tbl_person WHERE full_name LIKE 'Sparow%';
我很少在这个表中插入新数据。
我想在hark磁盘上存储常见的last_name查询,这些查询已经存储在ram中,但每次服务器重新启动时我都会丢失。
我的表中有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秒运行我已经做过的查询。
为什么不考虑像Redis这样的缓存呢?
这是一个内存中的数据存储,现在非常流行。使用Redis的站点:http://blog.togo.io/redisphere/redis-roundup-what-companies-use-redis
Redis还可以将数据持久化到磁盘:http://redis.io/topics/persistence
不过,对于缓存来说,保存到磁盘不应该是绝对关键的。这个想法是,如果一些数据没有缓存,最坏的情况不是总是手动从磁盘加载,而是直接加载到数据库。
如果您正在对数据执行许多这样的查询,我建议您使用ApacheLucene或Sphinx对表进行索引。数据库速度很快,但在对数百万行执行部分匹配时效率不高(尤其是MySQL)。
我已经回答了一个关于Zend Framework和Lucene的类似问题,并支持Zend的解决方案,因为我认为它是最容易在PHP环境中设置和使用的。
幸运的是,Zend Framework可以由模块使用,并且您可以很容易地仅使用Zend Search Lucene模块本身,而不需要整个类库。
**编辑**
索引器的作用不是替换数据库,而是通过提供执行部分搜索的方法来改进数据库的搜索功能。例如,给定您的表,您可能只对一些字段进行索引(使它们"可查询"),并让其他静态(非索引)字段引用数据库中的行。
使用索引器的优点是,您还可以为预先计算建立索引并直接搜索它们,而不是查询数据库。