mysql - 无法提高查询的查询性能
问题描述
我有以下 2 个表:
CREATE TABLE table1 (
ID INT(11) NOT NULL AUTO_INCREMENT,
AccountID INT NOT NULL,
Type VARCHAR(50) NOT NULL,
ValidForBilling BOOLEAN NULL DEFAULT false,
MerchantCreationTime TIMESTAMP NOT NULL,
PRIMARY KEY (ID),
UNIQUE KEY (OrderID, Type)
);
与索引:
INDEX accID_type_merchCreatTime_vfb (AccountID, Type, MerchantCreationTime, ValidForBilling);
CREATE TABLE table2 (
OrderID INT NOT NULL,
AccountID INT NOT NULL,
LineType VARCHAR(256) NOT NULL,
CreationDate TIMESTAMP NOT NULL,
CalculatedAmount NUMERIC(4,4) NULL,
table1ID INT(11) NOT NULL
);
我正在运行以下查询:
SELECT COALESCE(SUM(CalculatedAmount), 0.0) AS CalculatedAmount
FROM table2
INNER JOIN table1 ON table1.ID = table2.table1ID
WHERE table1.ValidForBilling is TRUE
AND table1.AccountID = 388
AND table1.Type = 'TPG_DISCOUNT'
AND table1.MerchantCreationTime >= '2018-11-01T05:00:00'
AND table1.MerchantCreationTime < '2018-12-01T05:00:00';
大约需要2分钟才能完成。
我这样做EXPLAIN
是为了尝试提高查询性能并得到以下输出:
+----+-------------+------------------+------------+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------+---------+----------------------+-------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------------+------------+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------+---------+----------------------+-------+----------+--------------------------+
| 1 | SIMPLE | table1 | NULL | range | PRIMARY,i_fo_merchant_time_account,FO_AccountID_MerchantCreationTime,FO_AccountID_ExecutionTime,FO_AccountID_Type_ExecutionTime,FO_AccountID_Type_MerchantCreationTime,accID_type_merchCreatTime_vfb | accID_type_merchCreatTime_vfb | 61 | NULL | 71276 | 100.00 | Using where; Using index |
| 1 | SIMPLE | table2 | NULL | eq_ref | table1ID,i_oc_fo_id | table1ID | 4 | finance.table1.ID | 1 | 100.00 | NULL |
+----+-------------+------------------+------------+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------+---------+----------------------+-------+----------+--------------------------+
我看到我扫描了 71276 行,table1
我似乎无法降低这个数字。
我可以创建一个索引来提高此查询性能吗?
解决方案
移入ValidForBilling
前。MerchantCreationTime
_ accID_type_merchCreatTime_vfb
您需要=TRUE
在索引中使用范围之前进行 ref 查找。
对于表 2,似乎已经是一个 table1ID 索引,并且附加 CalculatedAmount 将能够在结果中使用:
CREATE INDEX tbl1IDCalcAmount (table1ID,CalculatedAmount) ON table2
推荐阅读
- jenkins - 无法部署工件:无法传输工件
- java - 当新图像传入时,保持 ffmpeg 将图像转换为视频
- bash - 如果 BASH 中只有三个变量中的一个为 True,如何返回 True?
- angular - 在 Angular 库中导入路径
- java - 知道为什么这个请求适用于 curl 而不是 java 吗?
- android - 添加 LiveData 观察者时 Android 崩溃
- regex - 使用位置值选择子字符串的正则表达式
- curl - Curl 在命令行上工作,但不在 Expect 脚本内
- c# - OData:如何使用 DTO 模型的 DataMember 名称作为具有 ODataQueryOptions 的过滤器
- node.js - ServiceUnavailableError:当我尝试在无限循环中读取消息时,解决消息的操作已超时