我有一个包含多方之间交易的表,想要查询它以创建可视化并执行基本会计。 表格是这样的:
+----+-----------+--------+----------------------------+-------------+------------+-------+-------+
| id |transaction| amount | logged_at | buyer | seller | b_pos | s_pos |
+----+-----------+--------+----------------------------+-------------+------------+-------+-------+
| 1 | 1 | 125000 | 2017-05-28 21:54:53.069000 | store2 | store1 | 4 | 5 |
| 2 | 1 | 109375 | 2017-05-28 21:54:53.069000 | store3 | store2 | 3 | 4 |
| 3 | 1 | 75000 | 2017-05-28 21:54:53.069000 | store4 | store3 | 2 | 3 |
| 4 | 1 | 100000 | 2017-05-28 21:54:53.069000 | store5 | store4 | 1 | 2 |
| 5 | 2 | 50000 | 2017-05-28 21:55:53.069000 | store5 | store3 | 1 | 2 |
所以 b_pos 和 s_pos 是它们之间的交易链中商店的位置。所以链看起来像 store1 -> store2 -> store3 等等。
所以我尝试用 SQL 做一些事情。
- 创建各方之间所有不同的路径以进行可视化
- 计算这些路径中各方之间销售的商品总量
- 在这些不同路径中执行的交易总数。
这是我的 SQL。唯一的问题是,当表超过 100 万条记录(30 秒)时,该查询变得非常慢,而我的表可能有 7 亿条记录那么大。我该如何解决这个问题?
我可以将查询限制在特定的时间间隔内,但它需要相当快。
SELECT seller, CONCAT(seller, s_pos - offset) seller_id, buyer,
CONCAT(buyer, b_pos - offset) buyer_id, SUM(amount), cnt as transactions, amount/cnt as ROI
FROM transaction_table
JOIN (SELECT DISTINCT transaction,
CASE
WHEN seller = 'store3' THEN s_pos
WHEN buyer = 'store3' THEN b_pos
END AS offset
FROM
transaction_table
WHERE buyer = 'store3' OR seller = 'store3'
AND logged_at >= '2014-06-23 17:34:20'
AND logged_at <= '2018-06-23 17:34:00'
) ck_offset
ON transaction_table.transaction = ck_offset.transaction
JOIN
(SELECT transaction, count(transaction) as cnt from (select * from transaction_table
WHERE buyer = 'store3' OR seller = 'store3'
AND logged_at >= '2014-06-23 17:34:20'
AND logged_at <= '2018-06-23 17:34:00' group by transaction, logged_at) AS dist_chainkeys
group BY transaction) key_counts
ON key_counts.transaction = ck_offset.transaction
WHERE logged_at >= '2014-06-23 17:34:20'
AND logged_at <= '2018-06-23 17:34:00'
GROUP BY seller, seller_id, buyer, buyer_id;
最佳答案
您的表使用索引吗?索引是提高性能的方法。看看这个:
关于mysql - 寻找大表查询的优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44738778/