我有一个庞大的人员数据库,并使用名称进行常见搜索。
SELECT * FROM tbl_person WHERE full_name LIKE 'Sparow%Jack%';
SELECT * FROM tbl_person WHERE full_name LIKE 'Sparow%';
我很少在此表中插入新数据。
我想在hark磁盘上存储常见的last_name查询,已经存储在ram中的查询,但每次服务器重新启动时都会将其全部丢失。
我的表中有1.7亿个行,每行(带索引)占用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秒运行我在重启之前已经做过的同样的查询。
答案 0 :(得分:0)
为什么不考虑使用Redis进行缓存?
它是一个内存数据存储,现在非常受欢迎。使用Redis的网站: http://blog.togo.io/redisphere/redis-roundup-what-companies-use-redis
Redis还可以将数据保存到磁盘:http://redis.io/topics/persistence
但是,对于缓存,保存到磁盘不应该是绝对关键的。这个想法是,如果没有缓存某些数据,最坏的情况并不总是手动从磁盘加载,而是直接进入数据库。
答案 1 :(得分:0)
如果您对数据执行了很多此类查询,建议您使用Apache Lucene或Sphinx为您的表编制索引。数据库速度很快,但在数百万行上执行部分匹配时效率不高(尤其是MySQL)。
我已经回答了关于Zend Framework和Lucene的similar question,并且赞成Zend的解决方案,因为我相信它是最容易设置和使用PHP环境的。
幸运的是,Zend Framework可以被模块使用,你可以轻松地只使用Zend Search Lucene模块而不需要整个类库。
索引器的作用不是替换您的数据库,而是通过提供执行部分搜索的方法来改进它的搜索功能。例如,给定您的表,您可能只索引几个字段(使它们“可查询”)并使用其他静态(非索引)字段来引用数据库中的行。
使用索引器的优点是您还可以索引预先计算并直接搜索它们,而不是查询数据库。