lealone / Lealone

比 MySQL 和 MongoDB 快10倍的 OLTP 关系数据库和文档数据库
Other
2.48k stars 520 forks source link

索引字段查询更新出现错误 #192

Closed ContyChen closed 1 year ago

ContyChen commented 1 year ago

表中记录应该是在运行过程中产生了错误,导致查询、更新出现异常 表结构

CREATE TABLE config_info (
  id bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
  data_id varchar(255) NOT NULL COMMENT 'data_id',
  group_id varchar(128) DEFAULT NULL,
  content clob NOT NULL COMMENT 'content',
  md5 varchar(32) DEFAULT NULL COMMENT 'md5',
  gmt_create datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  gmt_modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  src_user clob COMMENT 'source user',
  src_ip varchar(50) DEFAULT NULL COMMENT 'source ip',
  app_name varchar(128) DEFAULT NULL,
  tenant_id varchar(128) DEFAULT ''',
  c_desc varchar(256) DEFAULT NULL,
  c_use varchar(64) DEFAULT NULL,
  effect varchar(64) DEFAULT NULL,
  type varchar(64) DEFAULT NULL,
  c_schema clob,
  encrypted_data_key clob NOT NULL,
  CONSTRAINT pk_config_info PRIMARY KEY (id),
  CONSTRAINT uk_configinfo_datagrouptenant UNIQUE (data_id,group_id,tenant_id)
) parameters(use_table_lob_storage=true);

表中存在两条data_id='datasource.yml' 的记录,通过data_id查询只能返回一条,通过id查询可以返回

SELECT * FROM config_info WHERE data_id='datasource.yml'; -- id=2的未返回 image

SELECT * FROM config_info WHERE id=2; --正常返回 image

SELECT * FROM config_info WHERE trim(data_id)='datasource.yml'; --正常返回,实际数据未发现存在空格 image

--更新索引字段报错 UPDATE config_info SET data_id=trim(data_id) WHERE id=2; image

其他记录未发现问题,只有id=2的异常,通过其他索引关联字段group_id,tenant_id操作,出现同样问题

codefollower commented 1 year ago

@2G1O)NHC~60ZP8QU6@K8PE 我这里重现不了你的问题。

codefollower commented 1 year ago

use_table_lob_storage 这个参数默认就是 true,可以不用显示指定。

这里的索引问题可能在运行时产生了 bug,不太好重现。

ContyChen commented 1 year ago

不太好重现,我重新建表测试也没有问题。 数据文件发邮箱了codefollower,您看看能不能找到线索

codefollower commented 1 year ago

不太好重现,我重新建表测试也没有问题。 数据文件发邮箱了codefollower,您看看能不能找到线索

我调试了一下,由 (data_id,group_id,tenant_id) 构建的 UNIQUE 索引少了一条记录, id=2的那条记录在 UNIQUE 索引中不存在了,id=32的记录存在。

SELECT * FROM config_info WHERE trim(data_id)='datasource.yml' 能找到两条记录,是因为没有走 UNIQUE 索引。

至于为什么 UNIQUE 索引和主表的数据不一致?这个还需要排查原因。