给一个表创建索引,创建结束后不显示该索引

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

  • 【TiDB 版本】:5.7.10-TiDB-v2.0.2
  • 【问题描述】:给一个表创建索引,创建结束后不显示该索引

1、创建了索引,show create table 的时候看不到该索引(但是那个索引的位置是已经空出来了); image

2、强制使用该索引报索引不存在;

3、重新创建该索引报索引已经存在

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

ADMIN SHOW DDL JOBS 看下创建索引的是否成功,另外 curl http://{TiDBIP}:10080/info/all 拿下集群 DDL 信息。

admin show ddl jobs显示报错 ID:13894, Type:add index, State:running, SchemaState:write reorganization, SchemaID:8060, TableID:13485, RowCount:20603312, ArgLen:0, start time: 2019-12-30 13:56:51.435 +0800 CST, Err:, ErrCount:0, SnapshotVersion:413580764940861464

状态是running

这个表多大?另外加索引的 DDL 执行很久了吗,看给出的信息是在回填数据。可以再等下查表结构是否加索引成功。

数据量2650万条,执行了70分钟

我是放在shell里面执行的,nohup &,然后打印日志,记录开始时间和结束时间,日志里面结束时间已经打印出来了

是RowCount那里跑完了就创建完成?以前都是日志打印出来就创建完成了

麻烦贴一下上面两个命令的截图,方便看下具体是什么问题。根据刚才给出来的信息只能判断还在加索引。

SELECT * FROM company_punishment_info_creditchina force INDEX(idx_companyname_punishnumber) LIMIT 10;

/* SQL错误(1176):Key ‘idx_companyname_punishnumber’ doesn’t exist in table ‘company_punishment_info_creditchina’ */

/* 受影响记录行数: 0 已找到记录行: 0 警告: 0 持续时间 0 的 1 查询: 0.000 秒. */

ALTER TABLE company_punishment_info_creditchina ADD INDEX idx_companyname_punishnumber(company_name,punish_number);

/* SQL错误(1061):index already exist idx_companyname_punishnumber */

/* 受影响记录行数: 0 已找到记录行: 0 警告: 0 持续时间 0 的 1 查询: 0.000 秒. */

现在RowCount已经和表里面的数据对的上,索引显示了,查询强制索引也正常

里面的机制是不是有点问题,感觉是索引没创建完就返回完成了

TiDB 跟 mysql 创建索引的机制不一样,DDL 请求会放在队列里然后再去取出来执行真正的 DDL 操作。在发送 add index 请求之后,索引还没有创建完成是不可见的,也暂时无法使用,只有当经历四个状态变成 public 才对外可见,可以使用,特别是表数据量比较大,在回填数据的时候会比较久。