我们有一个Mysql Master Slave架构。我们有大约 1000 张 table 。我们数据库中的 5 或 6 个表每个大约 30 到 40 GB。我们不能将一个 30 GB 的表连接到另一个 30 GB 的表,因为它从不返回结果。
我们所做的:从一个表中选择所需的数据,然后在另一个表中以 block 的形式找到匹配的数据。这给了我们结果,但这很慢。
在以 block 的形式连接两个表之后,我们进一步处理这些表。我们根据用例使用了更多的连接。
当前数据库:架构:5 个主服务器,100 个从服务器。
<强>1。我们怎样才能让它更快?索引在这里不是问题,我们已经在使用它。
<强>2。我们是否需要一些大数据方法来更快地获得结果。
编辑:查询详情如下
Query select count(*) from A, B where A.id = B.uid;
表 A 30 GB,有 51 列。 id为主键,自增整数。
表 B 27 GB,有 48 列。 uid (int 11) 是非唯一索引。
使用MySql ISAM。
最佳答案
这是一个糟糕的查询。它要么
- 扫描所有A
- 对于每个 id,在 B 的索引中(随机地)查找 uid。
或
- 扫描B在uid上的所有索引
- 对于每个 uid,查找(随机)A 中的 id(在 PK 中,因此是数据)。
无论哪种情况,
- A的30GB全部被触及
- B 的大部分 uid 索引将被触及
- 第 1 步将是线性扫描
- 第 2 步将是随机探测,大概涉及大量 I/O。
如果查询,请解释意图;也许我们可以帮助您重新制定它以实现相同或相似的目的。
与此同时,您有多少 RAM? innodb_buffer_pool_size
的设置是什么?表是 InnoDB 吗?
查询最终会返回一个结果,除非某些“超时”终止了它。
id
是 AUTO_INCREMENT
吗?还是 uid
是“UUID”? (UUID 会使性能变差,但有一些小技巧可以提供帮助。)
关于mysql - 源为 Mysql 的报告速度更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39313944/