首页 > 解决方案 > 带有左连接的简单查询导致 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 集群的结果 解释 ndb 集群的结果

解释innodb的结果 解释innodb的结果

可能有什么问题?

标签: mysqlinnodbmysql-cluster

解决方案


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,以便我们讨论索引。


推荐阅读