把表结构一起发出来,再就是你的过滤条件适合建立复合索引,会快很多
再给点信息,表数据量,表结构,预期的符合条件的数量
一眼看上去就是缺索引啊 ,那个公司字段猜起来过滤性不错,建议建公司+时间复合索引,如果其他列选择性也好,也可以加进去,加到时间前边
表结构:CREATE TABLE tf_tax_orderinfo_uploading
(
ID
bigint(19) NOT NULL AUTO_INCREMENT COMMENT ‘ID’,
ORDER_ID
bigint(19) NOT NULL
COMPANY_CODE
varchar(50) COLLATE utf8_bin DEFAULT NULL
ORDER_ORIGIN
smallint(2) DEFAULT NULL COMMENT ‘订单来源 1:定时器拉取 2:mq补偿 3:脚本插入’,
UPLOAD_FLAG
smallint(1) DEFAULT ‘0’ COMMENT ‘上传标记:0 无基础数据,1 待上传 ,2:已第一次上传 3:已第二次上传 4:已第三次上传’,
FIRST_EXCEPTION_TYPE
varchar(4) COLLATE utf8_bin DEFAULT NULL COMMENT ‘第一次异常类型:1:信息缺失 2:上传拦截’,
CURRENT_INTERCEPT_REASON_MESS
varchar(500) COLLATE utf8_bin DEFAULT NULL COMMENT ‘基础数据拉取失败未上传原因,所有必填字段为空等’,
SECND_EXCEPTION_TYPE
varchar(4) COLLATE utf8_bin DEFAULT NULL COMMENT ‘第二次异常类型:1:信息缺失 2:上传拦截’,
SECND_INTERCEPT_REASON_MESS
varchar(500) COLLATE utf8_bin DEFAULT NULL COMMENT ‘第二数据抽取拦截原因’,
THIRD_EXCEPTION_TYPE
varchar(4) COLLATE utf8_bin DEFAULT NULL COMMENT ‘第三次异常类型:1:信息缺失 2:上传拦截’,
THIRD_INTERCEPT_REASON_MESS
varchar(500) COLLATE utf8_bin DEFAULT NULL COMMENT ‘第三次数据抽取拦截原因’,
DESPATCH_TIME
datetime DEFAULT NULL COMMENT ‘发货时间’,
VALID_TIME
varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT ‘有效时长’,
UP_CAPITAL_FLAG
smallint(1) DEFAULT ‘0’
DRIVER_SETTLE_FLAG
smallint(1) DEFAULT ‘0’
ETC_RESULT_FLAG
smallint(1) DEFAULT ‘0’
CONSIGNOR_INVOICE_FLAG
smallint(1) DEFAULT ‘0’
RECEIPT_APPROVE_FLAG
smallint(6) DEFAULT NULL
TRACE_NORMAL_FLAG
smallint(6) DEFAULT NULL
ALTER_FLAG
smallint(1) DEFAULT ‘0’ COMMENT ‘是否需修改上传:0是 1否’,
UPDATELOAD_FIRST_RESPONSE_CODE
varchar(10) COLLATE utf8_bin DEFAULT NULL COMMENT ‘第一次上传回参code值’,
UPDATELOAD_FIRST_RESPONSE_MESS
varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT ‘第一次上传返回信息’,
UPDATELOAD_FIRST_TIME
datetime DEFAULT NULL COMMENT ‘第一次上传时间’,
UPDATELOAD_SECND_RESPONSE_CODE
varchar(10) COLLATE utf8_bin DEFAULT NULL COMMENT ‘第二次上传回参code值’,
UPDATELOAD_SECND_RESPONSE_MESS
varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT ‘第二次上传返回信息’,
UPDATELOAD_SECND_TIME
datetime DEFAULT NULL COMMENT ‘第二次上传时间’,
UPDATELOAD_THIRD_RESPONSE_CODE
varchar(10) COLLATE utf8_bin DEFAULT NULL COMMENT ‘第三次上传回参code值’,
UPDATELOAD_THIRD_RESPONSE_MESS
varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT ‘第三次上传返回信息’,
UPDATELOAD_THIRD_TIME
datetime DEFAULT NULL COMMENT ‘第三次上传时间’,
UPDATELOAD_ALERT_RESPONSE_CODE
varchar(10) COLLATE utf8_bin DEFAULT NULL COMMENT ‘修改上传回参code值’,
UPDATELOAD_ALERT_RESPONSE_MESS
varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT ‘修改上传返回信息’,
ALERT_EXCEPTION_TYPE
varchar(4) COLLATE utf8_bin DEFAULT NULL COMMENT ‘修改异常类型 1:信息缺失 2:上传拦截’,
UPDATELOAD_ALERT_TIME
datetime DEFAULT NULL COMMENT ‘修改上传时间’,
CREATED_TIME
datetime DEFAULT NULL COMMENT ‘创建时间’,
LAST_UPT_TIME
datetime DEFAULT NULL COMMENT ‘修改时间’,
DELETE_FLAG
smallint(1) DEFAULT ‘0’ COMMENT ‘删除标记:0 否,1 是’,
VEHICLE_NUMBER
varchar(32) COLLATE utf8_bin DEFAULT NULL
USER_NM
varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT
CUSTOMER_NM
varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT
CONSIGNOR_NAME
varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT
REMARK
varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT ‘备注’,
REMARK2
varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT ‘第二次备注’,
REMARK3
varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT ‘第三次备注’,
REMARK4
varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT ‘第一次修改备注’,
REMARK5
varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT
OPERATE_NAME
varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT
LOW_CAPITAL_FLAG
smallint(1) DEFAULT ‘0’ COMMENT
CONSIGNOR_SETTLE_FLAG
smallint(1) DEFAULT ‘0’ COMMENT
CONSIGNOR_USER_ID
bigint(19) DEFAULT NULL COMMENT
CARRIER_USER_ID
bigint(19) DEFAULT NULL COMMENT
CONSIGNOR_USER_TYPE
char(2) COLLATE utf8_bin DEFAULT NULL COMMENT
CARRIER_USER_TYPE
char(2) COLLATE utf8_bin DEFAULT NULL COMMENT
IS_BEYOND_FIVE_VEHICLE
smallint(1) DEFAULT ‘0’ COMMENT
CHECK_TIME
datetime DEFAULT NULL COMMENT
HAVE_SECND_UPLOAD_TIME
datetime DEFAULT NULL COMMENT
FIRST_DISPLAY_TIME
datetime DEFAULT NULL
BUSINESS_AREA_CODE
varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT ‘业务归属区域CODE’,
BUSINESS_AREA_NAME
varchar(256) COLLATE utf8_bin DEFAULT NULL COMMENT ‘业务归属区域名称’,
PENDING_REVIEW_REASON
varchar(512) COLLATE utf8_bin DEFAULT NULL
TRACK_RELEASE_REASON
varchar(512) COLLATE utf8_bin DEFAULT NULL
FIRST_REUPLOAD_NUM
smallint(6) DEFAULT ‘0’ COMMENT ‘第一次重传次数’,
SECOND_REUPLOAD_NUM
smallint(6) DEFAULT ‘0’ COMMENT ‘第二次重传次数’,
THIRD_REUPLOAD_NUM
smallint(6) DEFAULT ‘0’ COMMENT ‘第三次重传次数’,
DELIVER_FLAG
smallint(1) DEFAULT ‘0’
ARRIVAL_INFO_EXCEPTION_TYPE
varchar(4) COLLATE utf8_bin DEFAULT NULL
ARRIVAL_INFO_UPLOAD_TIME
datetime DEFAULT NULL
ARRIVAL_INFO_RESPONSE_CODE
varchar(10) COLLATE utf8_bin DEFAULT NULL
ARRIVAL_INFO_RESPONSE_MESS
varchar(200) COLLATE utf8_bin DEFAULT NULL
ARRIVALINFO_REUPLOAD_NUM
smallint(6) DEFAULT ‘0’ COMMENT ‘运抵信息重传次数’,
IS_EXIST_ADJUST
smallint(1) DEFAULT ‘0’
ADJUST_MONEY
decimal(19,3) DEFAULT NULL
REVOCATION_SEC_STATUS
smallint(1) DEFAULT ‘0’ COMMENT ‘撤回第二次数据状态: 0 未撤回, 1 已撤回,2撤回失败’,
REVOCATION_SEC_RESPONSE_MESS
varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT ‘撤回返回信息’,
REVOCATION_SEC_TIME
datetime DEFAULT NULL COMMENT ‘撤回时间’,
TAX_EXCEPTION_TYPE
smallint(6) DEFAULT ‘1’
IS_REMOVE_CONTROL_OPEN_INVOICE
smallint(6) DEFAULT NULL COMMENT ‘是否解除管控开票: 0管控中,1已解除’,
PRIMARY KEY (ID
),
UNIQUE KEY ORDER_ID_INDEX
(ORDER_ID
),
KEY idx_VEHICLE_NUMBER
(VEHICLE_NUMBER
),
KEY idx_USER_NM
(USER_NM
),
KEY idx_CUSTOMER_NM
(CUSTOMER_NM
),
KEY idx_CONSIGNOR_USER_ID
(CONSIGNOR_USER_ID
),
KEY idx_CARRIER_USER_ID
(CARRIER_USER_ID
),
KEY index_HAVE_SECND_UPLOAD_TIME
(HAVE_SECND_UPLOAD_TIME
),
KEY index_FIRST_DISPLAY_TIME
(FIRST_DISPLAY_TIME
),
KEY index_DESPATCH_TIME
(DESPATCH_TIME
),
KEY index_UPDATELOAD_FIRST_TIME
(UPDATELOAD_FIRST_TIME
),
KEY index_UPDATELOAD_SECND_TIME
(UPDATELOAD_SECND_TIME
),
KEY index_UPDATELOAD_THIRD_TIME
(UPDATELOAD_THIRD_TIME
),
KEY index_UPDATELOAD_ALERT_TIME
(UPDATELOAD_ALERT_TIME
),
KEY idx_LAST_UPT_TIME
(LAST_UPT_TIME
)
) ENGINE=InnoDB AUTO_INCREMENT=3071 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
数据量:1594126
我试试
针对时间建立的索引,区间跨度太大的情况下,即使走索引也会很慢,建议根据字段区分度来调整索引
我去测测看,看这个时间段的数据量,然后再看看如何加索引合适
应该是这个问题了,看了下,全表150w多条数据,这个时间段就有115w多条数据,走了索引还有这么多数据,确实加个联合索引比较合适
索引基本上效果不大,用UPDATELOAD_ALERT_TIME,看看查询字段里,有没有字段的分布更广一点的,建一个索引或联合索引,减少数据查询范围
CONSIGNOR_NAME、ALERT_EXCEPTION_TYPE、UPDATELOAD_ALERT_TIME,可以尝试按这个顺序建立一个联合索引
是滴,谢谢大佬
我去试试,差不多就这个方向
索引能找到的数据一般20%以下才走索引,再多就看索引区分度是不是不够,换其他列
表结构看看
复合索引根据实际情况,选择度添加
数据量超过40%j就不走索引了,业务也要优化一下,尽可能多过滤数据。
有表结构吗
现在这条SQL耗时多少,期望优化到耗时多少之内? 感觉优化一定得有个可量化 的目标。
字段 公司 + 时间创建索引