【发布时间】:2016-01-27 12:48:41
【问题描述】:
我有一个页面,其中有一个 <select> 菜单,其中包含一个小表(229 行)中的所有值,例如 <option value='KEY'>VALUE</option>。
此选择菜单是针对在大型表(350 万行)上运行的查询的过滤器。 大表中有一个外键引用小表中的KEY。
但是,在大表查询的结果中,我还需要显示来自小表的相对VALUE。
我可以很容易地执行INNER JOIN 来检索结果,或者我可以对较小的表执行单独的“预”查询,将其值提取到数组中,然后让应用程序获取VALUE来自小表结果。
应用程序是用 PHP 编写的。
硬件资源是个问题(现在无法升级到更高的实例,老板受限)-我在 Amazon Web Services 实例上的 t2.micro RDS 上运行它。 我在 WHERE 和 HAVING 子句中的列上添加了单个索引和覆盖索引,并且我的服务器报告我有 46mb RAM 可用。
鉴于上述情况,我知道JOIN 可能很昂贵,尤其是在大桌子上。在我可以协商更好的资源之前,执行 2 次查询并让应用程序处理一些工作是否有意义?
编辑:
无加入:6.9 秒
SELECT nationality_id, COUNT(DISTINCT(txn_id)) as numtrans,
SUM(sales) as sales, SUM(units) as units, YrQtr
FROM 1_txns
GROUP BY nationality_id;
EXPLAIN
'1', 'SIMPLE', '1_txns', 'index', 'covering,nat', 'nat', '5', NULL, '3141206', NULL
加入:59.03 秒
SELECT 4_nationality.nationality, COUNT(DISTINCT(txn_id)) as numtrans,
SUM(sales) as sales, SUM(units) as units, YrQtr
FROM 1_txns INNER JOIN 4_nationality USING (nationality_id)
GROUP BY nationality_id
HAVING YrQtr LIKE :period;
EXPLAIN
'1', 'SIMPLE', '4_nationality', 'ALL', 'PRIMARY', NULL, NULL, NULL, '229', 'Using temporary; Using filesort'
'1', 'SIMPLE', '1_txns', 'ref', 'covering,nat', 'nat', '5', 'reports.4_nationality.nationality_id', '7932', NULL
架构是
Table 1_txns (txn_id, nationality_id, yrqtr, sales, units)
Table 4_nationality (nationality_id, nationality)
我对每个 nationality_id、txn_id、yrqtr 都有单独的索引。在我的大交易表中。并且只是我的小表上的一个主键索引。
还有一点奇怪的是,没有连接的查询在结果中缺少一行!
【问题讨论】:
-
在这种情况下我可以理解,当然。但我首先会尝试进行一些测量,看看 JOIN 一开始的表现会差多少。如果设置了适当的索引,那也不应该那么糟糕。 (而且它可以让你不必在以后重新编写代码。)
-
向我们展示一些示例数据和期望结果。但是 db 是为了执行
JOIN而构建的,只需在连接字段上创建正确的索引 -
已更新,非常感谢您迄今为止的回复。
-
这两个查询是不等价的。您正在对第二个使用限制。在
YrQtr列上创建索引并在 where 子句中使用该列 -
对不起,性能结果是等效查询,只是复制粘贴错误。我会试试的。