mysql - 寻找大表查询的优化

标签 mysql sql

我有一个包含多方之间交易的表,想要查询它以创建可视化并执行基本会计。 表格是这样的:

+----+-----------+--------+----------------------------+-------------+------------+-------+-------+
| 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 做一些事情。

  1. 创建各方之间所有不同的路径以进行可视化
  2. 计算这些路径中各方之间销售的商品总量
  3. 在这些不同路径中执行的交易总数。

这是我的 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;

最佳答案

您的表使用索引吗?索引是提高性能的方法。看看这个:

What is an index in SQL?

关于mysql - 寻找大表查询的优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44738778/

相关文章:

php - 如何设计一个包含手机联系人的 mysql 数据库并查找是否有使用相同应用程序的联系人?

mysql - 使用 MySQL 生成按货币分组的填补空白的每日销售报告

mysql - 选择多列和行的条件

sql - 如何在 Presto 中将时间戳转换为日期?

mysql - 使用列检查选择其他表中是否存在所有行 ID

html - 没有这样的文件或目录 : var/www/html in ec2 instance

mysql - 使用存储过程中的循环增量创建表

MySQL修改密码不起作用

python - 如何使用原始 SQL 查询实现搜索功能

mysql - 基于日期的总价和基于 mysql 中俱乐部的打印