为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
- 【TiDB 版本】:4.0.6
- 【问题描述】:表单有2个索引,一个为项目ID(project_id),一个为添加时间 add_time,在查询时,从成本考虑应优先使用project_id,再查询add_time 应该是最快的,但是explain显示索引使用了add_time,没有使用project_id,导致查询较慢。添加索引 project_id,add_time后正常,explain显示使用了正确的索引。
表结构:
CREATE TABLEdcs_reward
(
id
int(11) NOT NULL AUTO_INCREMENT COMMENT ‘主键id’,
order_id
varchar(255) DEFAULT NULL COMMENT ‘订单id’,
name
varchar(255) DEFAULT NULL,
account
varchar(255) DEFAULT NULL COMMENT ‘账号/手机号码’,
amount
decimal(20,2) DEFAULT 0.00 COMMENT ‘金额’,
source
tinyint(4) DEFAULT 0 COMMENT ‘1-产品,2-定制化’,
state
tinyint(4) DEFAULT 0 COMMENT ‘状态,0-待发放,1-发放成功,2-发放失败,3-发放中(话费),4-系统异常’,
type
tinyint(4) DEFAULT NULL COMMENT ‘1-支付宝,2-话费’,
project_id
int(11) DEFAULT NULL COMMENT ‘项目id’,
project_name
varchar(255) DEFAULT NULL COMMENT ‘项目名’,
user_id
varchar(255) DEFAULT ‘’ COMMENT ‘用户id’,
file_id
varchar(255) DEFAULT NULL COMMENT ‘如果是上传文件,则有文件id’,
rate
varchar(32) DEFAULT ‘’ COMMENT ‘eztalk答题率’,
sub_msg
varchar(255) DEFAULT NULL,
sub_code
varchar(255) DEFAULT NULL COMMENT ‘充值或转账返回的状态码’,
add_time
int(11) DEFAULT NULL,
update_time
int(11) DEFAULT NULL,
service_provider
varchar(20) DEFAULT ‘’ COMMENT ‘服务提供商’,
answer_time
int(11) DEFAULT 0 COMMENT ‘答题时间’,
tax_amount
decimal(20,2) DEFAULT 0.00 COMMENT ‘含税金额’,
PRIMARY KEY (id
),
KEYindex_file_id
(file_id
),
KEYindex_order_id
(order_id
),
KEYindex_state
(state
),
KEYindex_account
(account
),
KEYupdate_time
(update_time
),
KEYsub_msg
(sub_msg
),
KEYadd_time
(add_time
),
KEYindex_project_id
(project_id
,add_time
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=103391139 COMMENT=‘奖励表’;
查询sql:explain select * from dcs_reward where project_id in (427586) and state in (0,3) and add_time > 0 and add_time <= 1597221254 group by project_id
请问TIDB索引选择的策略文档在哪里能看到,经常遇到索引选择与mysql不符或者与预期不符,导致sql很慢
若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出打印结果,请务必全选并复制粘贴上传。