我需要有关此查询性能的帮助
SELECT *
FROM transactions
WHERE created_at BETWEEN '2022-08-25 01:03:21' AND '2022-12-13 01:03:21'
AND ((transaction_reason IN ('ORIGINAL','REVERSAL_OF_ADJUSTMENT')
AND type = 'DEPOSIT')
OR (transaction_reason IN ('ADJUSTMENT','REVERSAL_OF_ORIGINAL')
AND type = 'WITHDRAWAL') )
ORDER BY transaction_id ASC
主键:识别号
外键:事务标识
解释
| 身份证|选择类型|桌|分区|类型|可能的密钥|钥匙|密钥_长度|参考|行|滤过的|额外|
| - ------| - ------| - ------| - ------| - ------| - ------| - ------| - ------| - ------| - ------| - ------| - ------|
| 1个|简单|交易||全部|idx_交易_日||||小行星18356|十八时|使用位置;使用文件排序|
键为空,我的索引为idx_transactions_dd(创建时间,事务原因,类型)
有什么建议吗?
我需要创建新索引或修改查询
1条答案
按热度按时间nuypyhwy1#
您需要列
(type, created_at)
和(type, transaction_reason)
上的索引。然后重构查询。不要在WHERE子句中使用
OR
,而是运行两个查询和UNION
,它们各自的结果如下:不能在同一个WHERE子句中同时优化
BETWEEN
和IN
。这两个都是范围条件。一个索引只能支持一个范围条件(尽管现在MySQL 8.0支持跳过扫描范围优化)。