Bug #13327 VIEW performs index scan
| Submitted: | 19 Sep 2005 16:29 | Modified: | 13 Oct 2005 2:38 |
|---|---|---|---|
| Reporter: | Georg Richter | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Optimizer | Severity: | S1 (Critical) |
| Version: | 5.0.14 | OS: | |
| Assigned to: | Evgeny Potemkin | CPU Architecture: | Any |
[3 Oct 2005 14:23]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/internals/30638
[10 Oct 2005 14:53]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/internals/30860
[11 Oct 2005 20:14]
Evgeny Potemkin
check_equality() finds equalities among field items. It checks input items to be Item_fields thus skipping view's fields, which are represented by Item_direct_view_ref. Because of this index wasn't applied in all cases it can be. Fixed in 5.0.15, cset 1.2019.3.9
[13 Oct 2005 2:38]
Mike Hillyer
Documented in 5.0.15 changelog:
<listitem>
<para>
Queries that use index in normal SELECT may cause range scan
in VIEWs. (Bug #13327)
</para>
</listitem>
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.041 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: View with a simple join on 2 fields performs an index scan, while corresponding select statement uses an index. Explain output: mysql> explain select * from v1 where a=1\G *************************** 1. row *************************** id: 1 select_type: PRIMARY table: t2 type: index possible_keys: a key: a key_len: 10 ref: NULL rows: 20 Extra: Using index *************************** 2. row *************************** id: 1 select_type: PRIMARY table: t1 type: ref possible_keys: a key: a key_len: 10 ref: const,test.t2.b rows: 2 Extra: Using where; Using index 2 rows in set (0.00 sec) mysql> EXPLAIN SELECT t1.* FROM t1 join t2 where t1.a=t2.a and t1.b=t2.b and t1.a=1 \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: t2 type: ref possible_keys: a key: a key_len: 5 ref: const rows: 10 Extra: Using where; Using index *************************** 2. row *************************** id: 1 select_type: SIMPLE table: t1 type: ref possible_keys: a key: a key_len: 10 ref: const,test.t2.b rows: 2 Extra: Using where; Using index 2 rows in set (0.00 sec) How to repeat: CREATE TABLE t1 (a int, b int, index(a,b)); CREATE TABLE t2 LIKE t1; INSERT INTO `t1` VALUES (1,1),(1,5),(1,5),(1,5),(1,7),(1,7),(1,8),(1,9),(1,10),(1,10),(1,10),(1,13),(1,13),(1,14),(1,15),(1,16),(1,16),(1,17),(1,17),(1,18),(1,19),(1,19),(1,19),(1,20),(1,20),(1,21),(1,22),(1,22),(1,22),(1,23),(1,23),(1,23),(1,25),(1,25),(1,25),(1,25),(1,26),(1,26),(1,27),(1,27),(1,27),(1,27),(1,28),(1,29),(1,31),(1,33),(1,33),(1,34),(1,34),(1,35),(1,35),(1,37),(1,37),(1,38),(1,38),(1,39),(1,39),(1,40),(1,40),(1,40),(1,41),(1,42),(1,42),(1,42),(1,42),(1,45),(1,45),(1,45),(1,46),(1,47),(1,47),(1,50),(1,51),(1,52),(1,52),(1,54),(1,54),(1,54),(1,55),(1,55),(1,56),(1,56),(1,56),(1,57),(1,58),(1,58),(1,58),(1,59),(1,60),(1,62),(1,62),(1,63),(1,63),(1,63),(1,64),(1,64),(1,66),(1,67),(1,68),(1,71),(1,72),(1,74),(1,75),(1,75),(1,77),(1,79),(1,81),(1,83),(1,84),(1,87),(1,87),(1,87),(1,87),(1,87),(1,87),(1,87),(1,91),(1,93),(1,93),(1,93),(1,95),(1,95),(1,96),(1,96),(1,97),(1,97),(1,97),(1,97); INSERT INTO `t2` VALUES (1,1),(1,1),(1,5),(1,5),(1,5),(1,7),(1,7),(1,8),(1,9),(1,10),(1,10),(5,1),(5,1),(5,1),(7,1),(7,1),(8,1),(9,1),(10,1),(10,1); CREATE VIEW v1 AS SELECT t1.* FROM t1 join t2 where t1.a=t2.a and t1.b=t2.b; explain select * from v1 where a=1; EXPLAIN SELECT t1.* FROM t1 join t2 where t1.a=t2.a and t1.b=t2.b and t1.a=1;