索引mysql键选择

dojqjjoe  于 2022-12-28  发布在  Mysql
关注(0)|答案(1)|浏览(133)

我需要有关此查询性能的帮助

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(创建时间,事务原因,类型)
有什么建议吗?
我需要创建新索引或修改查询

nuypyhwy

nuypyhwy1#

您需要列(type, created_at)(type, transaction_reason)上的索引。
然后重构查询。不要在WHERE子句中使用OR,而是运行两个查询和UNION,它们各自的结果如下:

SELECT *
FROM transactions 
WHERE type = 'DEPOSIT' 
 AND created_at BETWEEN '2022-08-25 01:03:21' AND '2022-12-13 01:03:21'
 AND transaction_reason IN ('ORIGINAL','REVERSAL_OF_ADJUSTMENT'))
UNION 
SELECT *
FROM transactions
WHERE type = 'WITHDRAWAL'
 AND transaction_reason IN ('ADJUSTMENT','REVERSAL_OF_ORIGINAL') 
ORDER BY transaction_id ASC;

不能在同一个WHERE子句中同时优化BETWEENIN。这两个都是范围条件。一个索引只能支持一个范围条件(尽管现在MySQL 8.0支持跳过扫描范围优化)。

相关问题