查询选错索引

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【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 TABLE dcs_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),
    KEY index_file_id (file_id),
    KEY index_order_id (order_id),
    KEY index_state (state),
    KEY index_account (account),
    KEY update_time (update_time),
    KEY sub_msg (sub_msg),
    KEY add_time (add_time),
    KEY index_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很慢

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出打印结果,请务必全选并复制粘贴上传。

1.从你提供的表结构上看,有一个字段 project_id 和 add_time 的组合索引,还有一个 add_time 字段的单列索引,之前字段 project_id 上是有一个单列索引被你删掉了吗?
2.关于索引的选择,可以参考下面这篇文档:
https://docs.pingcap.com/zh/tidb/stable/choose-index