-
Notifications
You must be signed in to change notification settings - Fork 5.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
executor: only rebase auto increment ID when needed #7515
Conversation
/run-all-tests |
c.Assert(err, IsNil) | ||
c.Assert(s.ctx.Txn().Commit(context.Background()), IsNil) | ||
|
||
tk.MustExec(`update t set b = 3 where a = 30001;`) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please add comments to this case,
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reset LGTM
PTAL @winkyao |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it seems more complex...hold on
executor/write.go
Outdated
cmp, err := newData[i].CompareDatum(sc, &oldData[i]) | ||
if err != nil { | ||
return false, handleChanged, newHandle, 0, errors.Trace(err) | ||
} | ||
// Rebase auto increment id if the field is changed. | ||
if mysql.HasAutoIncrementFlag(col.Flag) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How about
if mysql.HasAutoIncrementFlag(col.Flag) && cmp != 0 {
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If cmp == 0, we still need to set the last_insert_id. Actually, we already have the cases at line 595 to 627.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if cmp != 0
still can not change last_insert_id when under on duplicate key update
.
tidb:
mysql> show create table ti2;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ti2 | CREATE TABLE `ti2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`v` int(11) DEFAULT NULL,
`idx` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx` (`idx`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin AUTO_INCREMENT=30001 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from ti2;
+----+------+------+
| id | v | idx |
+----+------+------+
| 1 | 1 | 1 |
+----+------+------+
1 row in set (0.00 sec)
mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)
mysql> insert into ti2 (idx) values (1) on duplicate key update id = 3;
Query OK, 3 rows affected (3.78 sec)
mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 3 |
+------------------+
1 row in set (0.00 sec)
mysql:
mysql> show create table ti2;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ti2 | CREATE TABLE `ti2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`v` int(11) DEFAULT NULL,
`idx` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx` (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from ti2;
+----+------+------+
| id | v | idx |
+----+------+------+
| 1 | 1 | 1 |
+----+------+------+
1 row in set (0.00 sec)
mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)
mysql> insert into ti2 (idx) values (1) on duplicate key update id = 3;
Query OK, 2 rows affected (0.01 sec)
mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, you're right. I think we need another pr to fix it.
// For issue 7422. | ||
// There is no need to do the rebase when updating a record if the auto-increment ID not changed. | ||
// This could make the auto ID increasing speed slower. | ||
func (s *testSuite) TestRebaseIfNeeded(c *C) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe need add insert on duplicate key update
testcase, and check last_insert_id()
value.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Already have the cases at line 595 to 627.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I means rebase auto_increment in on duplicate key update
, current case seems not update id? e.g. use duplicate on second unique index then update primary key...
PTAL @lysu |
LGTM |
/run-all-tests |
What problem does this PR solve?
Fix #7422 . It is better to compare the value of the auto-increment ID before rebasing it in
updateRecord
. Update an old value which was inserted from another TiDB when the auto-increment column has no change does not need to rebase its ID. After this PR, the increasing speed of the auto-increment ID value will be slower than before.What is changed and how it works?
Compare the values before rebasing the ID.
Check List
Tests
The same SQL in Updating rows by auto_increment id cause id increasing dramatically #7422
Code changes
Side effects
Related changes
PTAL @zimulala @coocood