mysql - 带有左连接的简单查询导致 ndb 集群超时,但在 innodb 上工作正常
问题描述
最近我只是将我的数据库移动到 ndb 集群,我得到了大约 200.000 条记录的数据库
我尝试运行此查询以获取月度报告,但总是在 ndb 集群中出现查询超时,当我尝试在 InnoDB 上进行查询时,它会给出快速查询结果 < 1 秒这个查询:
SELECT
m.merchant_name,
COUNT(CASE WHEN pay.payment_status = '00' THEN 1 ELSE NULL END) AS 'Success',
SUM(CASE WHEN pay.payment_status = '00' THEN pay.transaction_amount ELSE 0 END) AS 'Total success',
COUNT(CASE WHEN pay.payment_status != '00' THEN 1 ELSE NULL END) AS 'Fail',
SUM(CASE WHEN pay.payment_status != '00' THEN pay.transaction_amount ELSE 0 END) AS 'Total Fail',
COUNT(pay.trx_id) AS 'Total',
SUM(pay.transaction_amount) AS 'Total Amount'
FROM
(
SELECT
mchn.merchant_name,
mchl.channel_id
FROM
db_merchant mchn
LEFT JOIN db_merchant_channel mchl ON
mchl.merchant_id = mchn.merchant_id ) AS m
LEFT JOIN (
SELECT
x.trx_id,
x.channel_id,
fq.transaction_amount,
fq.transaction_status,
fs.payment_status
FROM
t_transaction x
LEFT JOIN flag_request fq ON
x.channel_id = fq.channel_id
AND x.transaction_no = fq.transaction_no
LEFT JOIN flag_response fs ON
fs.freq_id = fq.freq_id
WHERE
LEFT(DATE(fs.created_at),7) = '2020-03' ) AS pay ON
CONVERT(m.channel_id USING utf8) = CONVERT(pay.channel_id USING utf8)
GROUP BY
m.channel_id
可能有什么问题?
解决方案
NDB 和 InnoDB 之间有很多区别。无论如何,这里有一些使查询效率低下的事情:
这种模式效率低下;看看您是否可以将其重新表述为其他内容:
FROM ( SELECT ... ) JOIN ( SELECT ... ) ON ...
不可分割:
LEFT(DATE(fs.created_at),7) = '2020-03'
改成
fs.created_at >= '2020-03-01'
AND fs.created_at < '2020-03-01' + INTERVAL 1 MONTH
不可分割:
ON CONVERT(m.channel_id USING utf8) = CONVERT(pay.channel_id USING utf8)
相反,请确保两者都被声明为使用相同的CHARACTER SET
并且COLLATION
做简单
ON m.channel_id = pay.channel_id
请提供SHOW CREATE TABLE
,以便我们讨论索引。
推荐阅读
- java - 使用 java 连接 Atlas MongoDB 失败
- excel - 从其他工作表的单元格中获取值
- python - 平均剩余帧的颜色
- c# - 如何将目标框架 4.5 更改为 3.5 vs 2017
- python - 使用 Python 从个人 OneDrive 下载文件
- php - 如何从 WooCommerce 中的订单项目中获取购物车项目密钥
- javascript - If/else 用于语音选项设置
- excel - 在 VBA 宏中使用某些条件删除行但公式不更新
- python - 使用周期性网格时,并行和顺序运行在 FiPy 中给出不同的结果
- javascript - 将 .json 文件导入 javascript 时,我的 HTML 文件无法从 javascript 代码调用函数