0

对于一个客户,我目前正在研究对其数据库结构的改进。

我的客户在他们的网站上提供假期出租。在他们的首页上,他们有一个搜索功能,该功能将查询发送到 MySQL 数据库架构(Master-Master setup),该架构会针对客户感兴趣的所有度假租赁回答该查询。

由于公司的发展和服务器负载的增加,搜索查询当前运行时间长达 10 多秒。主要是因为查询以 ORDER BY 结尾,这导致 MySQL 创建一个临时表并对所有数据进行排序,一个平均搜索查询可以返回多达 20k 的度假屋。当然,我们正在做的一件事是调查查询,重写它们并将索引放在需要的地方。不幸的是,在这种情况下,我们无法获得更多性能。这就是为什么我们正在研究在 MySQL 之上实现 Memcached 以将这些大型数据集缓存在内存中以便更快地检索。不幸的是,查询返回的数据集非常大,这使得 Memcached 在这一点上没有那么有效。MySQL 返回的数组当前大约有 15k 行,每行大约有 60 个值。Memcached 之所以有趣,是因为我们想大幅改进搜索功能,并降低 MySQL 平台的负载。这将使其更具可扩展性。

我想知道是否有人熟悉(长期)在 Memcached 中缓存 MySQL 数据并使其对大型数据集更有效?

非常感谢!

4

1 回答 1

1

Memcache 用于存储键值对,而不是用于存储大量数据。它会起作用吗?是的。当然会的。但是随着你们要投入多少数据,你很快就会耗尽内存并最终访问数据库,因为你的搜索结果可能会经常改变。请记住,仅仅因为它是 memcache 并不意味着它不必通过 web 套接字连接到(很可能)不同的机器。您的问题似乎是您将 MySQL 用于它从未设计好的东西,即它用作搜索引擎。无论您优化了多少事情,您所做的只是一次将天花板提高一英寸。

我可以把这篇文章放在“你需要优化 MySQL 参数以便它不必创建那些临时表”的方向上,但我假设你已经研究过了并继续前进。

我的建议是你在 MySQL 之上实现一些东西来处理搜索。在我自己寻求快速搜索的过程中,这些是我最重视的解决方案:

狮身人面像:http
://sphinxsearch.com Solr:http
: //lucene.apache.org/solr Elasticsearch:http ://www.elasticsearch.org

您会在 StackOverflow 上找到大量资源,其中哪些更好更快,哪些不是。出于我们的目的,我们为我们的一个项目选择了 Elasticsearch,为另一个项目选择了 Solr。

于 2012-08-04T14:57:35.180 回答