【问题详细描述】
1. 在 mysql 中执行update force index,该 update 语句下压到 sequoiadb 后,sequoiadb 会强制走该索引更新吗
【解决办法】
1. update force index 在真正 update 记录前会先根据匹配的 where 条件执行 query 查询将要更新的记录,该 query 操作会将强制索引下压到 sequoiadb,sequoiadb 会相应的执行 hint 强制走索引查询。而当真正 update 的时候,会逐条记录进行更新。需要注意的是,逐条更新下压至 sequoiadb 的匹配条件和 query 时匹配的 where 条件不一样,真正逐条 update 时下压至 sequoiadb 的匹配条件会满足如此规则:如果有主键或者唯一索引,则会优先使用主键匹配,其次唯一索引,否则进行全记录匹配。
2. 示例如下:
表结构: create table t1 ( a int primary key, b char(10), c text, index(b));
更新语句:update t1 force index (b) set b = "update" where c = "a" ;
1) 真正更新前首先要执行 query 查询出 c = "a" 的记录,该查询下压至 sequoiadb 后会强制走hint
2) 真正更新时,会执行逐条更新。该更新操作下压至 sequoiadb 后不会走强制hint,且此时下压至 sequoiadb 的匹配条件与 query 时的匹配条件不一样。由于该表存在主键索引,因此真正逐条更新时下压至 sequoiadb 的匹配条件为主键的匹配条件:
update t1 set b = "update" where a = 1;
update t1 set b = "update" where a = 2;
......................................................
3) 若将主键索引删掉,则上述真正逐条 update 时,下压至 sequoiadb 的匹配条件为全记录匹配(包含 oid):
update t1 set b = "update" where a = 1, b = "b1", c = "a", _id={$oid:xxxxxxxxx}
update t1 set b = "update" where a = 2, b = "b2", c = "a", _id={$oid:xxxxxxxxx}
......................................................