大表上的 MySQL 性能问题 - 如何有效地缓存结果?

标签 mysql database performance database-design

我有一个 MySQL 表来存储用户统计信息,其中包含 >2MM 行和 8 列以及 userID 上的索引。当用户访问他的个人资料时,会从数据库中检索大量信息,从而导致(最坏的情况)有时会与其他表连接的几十个 SELECT 查询。它类似于 SO 上的配置文件,它也必须提取大量数据。

一些查询(例如获取用户分数)需要 COUNT 和其他消耗 MySQL 性能的函数。因此,仅查询个人资料页面就可能需要长达 10-20 秒的时间。

现在我的问题:

  1. 像 SO 这样的网站如何快速获取如此多的信息?
  2. 我需要缓存层吗?
  3. 我应该预先计算 消耗MySQL性能的分数等?
  4. 我应该使用一个吗 写优化表和一张读优化表?如果是这样怎么办 我可以像 SO 一样检索实时数据吗?
  5. 我应该放弃 MySQL 吗?

最佳答案

How does a website like SO pull so many informations that quickly?

它们给你一种提取“这么多”数据的错觉,但实际上它们一次只能获取一大块。基本上,您需要一个查询来获取结果的 COUNT,并需要另一个查询来获取该结果集中任何页面的数据。结果集不被缓存。查询的参数可以被缓存。但最好以每个页面请求都提供查询参数的方式来实现。

Do I need a caching layer?

也许是。但没有必要实现这一点。缓存对于存储先前获取的页面可能很有用,并且相同的页面由整个社区而不是一个用户使用。

Should I precalculate the count of the score, etc. that consume MySQL performance?

与此用例无关。

Should I use one writing optimized table and one reading optimized table? If so how could I retrieve live data like on SO?

不需要。

Should I move away from MySQL?

不需要。

有关此概念的更多详细信息,请查找分页 Ajax 网格

关于大表上的 MySQL 性能问题 - 如何有效地缓存结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11531106/

相关文章:

php - wordpress 无法使用定义的常量连接到 mysql

mysql - 如何从MySQL中的每个类别中获取随机记录?

java - 如何对多对多关系执行存在查询

sql - 将 CSV 文件导入 sqlite 表

java - 导出对象之间的关系

r - 字符串分解

java - PostgreSQL 多个 'WHERE' 条件(1000+)请求

MySQL 递归关系阻止我进行插入

php - 如何根据where条件值创建mysql查询结果?

PHP MYSQL数据库结构,一条记录多次查询