BUG#15935: In mysql_update, don't use full index scan when we could have used quick select scan.
mysql-test/r/update.result: Testcase for BUG#15935 mysql-test/t/update.test: Testcase for BUG#15935 sql/sql_update.cc: BUG#15935: - Do account for the fact that used_index!=MAX_KEY is also true for cases when quick select is used, and use quick select then (and not full index scan). - Also removed the redundant "used_index= MAX_KEY" statement
This commit is contained in:
parent
52ff597a8a
commit
d33ac37ba6
@ -358,3 +358,18 @@ update t2,t1 set f1=3,f2=3 where f1=f2 and f1=1;
|
||||
affected rows: 3
|
||||
info: Rows matched: 3 Changed: 3 Warnings: 0
|
||||
drop table t1,t2;
|
||||
create table t1 (a int);
|
||||
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t2 (a int, filler1 char(200), filler2 char(200), key(a));
|
||||
insert into t2 select A.a + 10*B.a, 'filler','filler' from t1 A, t1 B;
|
||||
flush status;
|
||||
update t2 set a=3 where a=2;
|
||||
show status like 'handler_read%';
|
||||
Variable_name Value
|
||||
Handler_read_first 0
|
||||
Handler_read_key 1
|
||||
Handler_read_next 1
|
||||
Handler_read_prev 0
|
||||
Handler_read_rnd 1
|
||||
Handler_read_rnd_next 0
|
||||
drop table t1, t2;
|
||||
|
@ -287,4 +287,16 @@ update t1 set f1=1 where f1=3;
|
||||
update t2,t1 set f1=3,f2=3 where f1=f2 and f1=1;
|
||||
--disable_info
|
||||
drop table t1,t2;
|
||||
|
||||
|
||||
# BUG#15935
|
||||
create table t1 (a int);
|
||||
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t2 (a int, filler1 char(200), filler2 char(200), key(a));
|
||||
insert into t2 select A.a + 10*B.a, 'filler','filler' from t1 A, t1 B;
|
||||
flush status;
|
||||
update t2 set a=3 where a=2;
|
||||
show status like 'handler_read%';
|
||||
drop table t1, t2;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
@ -212,7 +212,6 @@ int mysql_update(THD *thd,
|
||||
SORT_FIELD *sortorder;
|
||||
ha_rows examined_rows;
|
||||
|
||||
used_index= MAX_KEY; // For call to init_read_record()
|
||||
table->sort.io_cache = (IO_CACHE *) my_malloc(sizeof(IO_CACHE),
|
||||
MYF(MY_FAE | MY_ZEROFILL));
|
||||
if (!(sortorder=make_unireg_sortorder(order, &length)) ||
|
||||
@ -244,7 +243,7 @@ int mysql_update(THD *thd,
|
||||
DISK_BUFFER_SIZE, MYF(MY_WME)))
|
||||
goto err;
|
||||
|
||||
if (used_index == MAX_KEY)
|
||||
if (used_index == MAX_KEY || (select && select->quick))
|
||||
init_read_record(&info,thd,table,select,0,1);
|
||||
else
|
||||
init_read_record_idx(&info, thd, table, 1, used_index);
|
||||
|
Loading…
x
Reference in New Issue
Block a user