【问题标题】:Store common queries on disk with Mysql and windows使用 Mysql 和 windows 在磁盘上存储常见查询
【发布时间】:2013-08-30 15:28:17
【问题描述】:

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

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 秒运行我在重启之前已经执行过的相同查询。

【问题讨论】:

  • 抱歉,有什么问题?
  • Mysql 怎么把查询缓存到磁盘上?类似于 memcache 但在硬盘上的东西。能够在系统重新启动后检索它。
  • 用mysql真的不可能在硬盘上缓存查询吗?
  • 应用程序的编程语言是什么?
  • 我目前使用 WAMP 服务器,所以它是一个 PHP 应用程序,在 windows server 2008 64 位机器上带有 apache 服务器。

标签: mysql performance caching memcached query-tuning


【解决方案1】:

为什么不考虑像 Redis 这样的缓存呢?

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

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

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

【讨论】:

  • 我有很多查询需要全表扫描(即使启用了索引)是的,这是最坏的情况。这就是为什么我更喜欢能够读取磁盘上的一个 10MB 文件而不是进行全表扫描的原因。我想要一个在 Windows 上运行 mysql 的解决方案。
【解决方案2】:

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

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

幸运的是,Zend Framework 可以被模块使用,你可以很容易地只使用 Zend Search Lucene 模块本身,而不需要整个类库。

** 编辑 **

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

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

【讨论】:

    猜你喜欢
    • 2022-10-15
    • 1970-01-01
    • 2016-12-12
    • 2012-05-13
    • 1970-01-01
    • 2012-06-25
    • 2011-06-08
    • 2012-08-02
    • 1970-01-01
    相关资源
    最近更新 更多