Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
fb077c0e
Commit
fb077c0e
authored
Sep 19, 2006
by
sergefp@pylon.mylan
Browse files
Options
Browse Files
Download
Plain Diff
Merge spetrunia@bk-internal.mysql.com:/home/bk/mysql-5.1-opt
into mysql.com:/home/psergey/mysql-5.1-bug22393
parents
ba7a8731
13901802
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
64 additions
and
0 deletions
+64
-0
mysql-test/r/range.result
mysql-test/r/range.result
+14
-0
mysql-test/t/range.test
mysql-test/t/range.test
+27
-0
sql/sql_select.cc
sql/sql_select.cc
+23
-0
No files found.
mysql-test/r/range.result
View file @
fb077c0e
...
@@ -941,3 +941,17 @@ item started price
...
@@ -941,3 +941,17 @@ item started price
A1 2005-11-01 08:00:00 1000.000
A1 2005-11-01 08:00:00 1000.000
A1 2005-11-15 00:00:00 2000.000
A1 2005-11-15 00:00:00 2000.000
DROP TABLE t1;
DROP TABLE t1;
create table t1 (a int);
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t2 (a int, b int, filler char(100));
insert into t2 select A.a + 10 * (B.a + 10 * C.a), 10, 'filler' from t1 A,
t1 B, t1 C where A.a < 5;
insert into t2 select 1000, b, 'filler' from t2;
alter table t2 add index (a,b);
select 'In following EXPLAIN the access method should be ref, #rows~=500 (and not 2)' Z;
Z
In following EXPLAIN the access method should be ref, #rows~=500 (and not 2)
explain select * from t2 where a=1000 and b<11;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 ref a a 5 const 502 Using where
drop table t1, t2;
mysql-test/t/range.test
View file @
fb077c0e
...
@@ -740,3 +740,30 @@ SELECT * FROM t1 WHERE item='A1' AND started<='2005-12-02 00:00:00';
...
@@ -740,3 +740,30 @@ SELECT * FROM t1 WHERE item='A1' AND started<='2005-12-02 00:00:00';
DROP
TABLE
t1
;
DROP
TABLE
t1
;
# End of 5.0 tests
# End of 5.0 tests
# BUG#22393 fix: Adjust 'ref' estimate if we have 'range' estimate for
# a smaller scan interval
create
table
t1
(
a
int
);
insert
into
t1
values
(
0
),(
1
),(
2
),(
3
),(
4
),(
5
),(
6
),(
7
),(
8
),(
9
);
create
table
t2
(
a
int
,
b
int
,
filler
char
(
100
));
insert
into
t2
select
A
.
a
+
10
*
(
B
.
a
+
10
*
C
.
a
),
10
,
'filler'
from
t1
A
,
t1
B
,
t1
C
where
A
.
a
<
5
;
insert
into
t2
select
1000
,
b
,
'filler'
from
t2
;
alter
table
t2
add
index
(
a
,
b
);
# t2 values
# ( 1 , 10, 'filler')
# ( 2 , 10, 'filler')
# ( 3 , 10, 'filler')
# (... , 10, 'filler')
# ...
# (1000, 10, 'filler') - 500 times
# 500 rows, 1 row
select
'In following EXPLAIN the access method should be ref, #rows~=500 (and not 2)'
Z
;
explain
select
*
from
t2
where
a
=
1000
and
b
<
11
;
drop
table
t1
,
t2
;
sql/sql_select.cc
View file @
fb077c0e
...
@@ -3717,7 +3717,30 @@ best_access_path(JOIN *join,
...
@@ -3717,7 +3717,30 @@ best_access_path(JOIN *join,
{
{
/* Check if we have statistic about the distribution */
/* Check if we have statistic about the distribution */
if
((
records
=
keyinfo
->
rec_per_key
[
max_key_part
-
1
]))
if
((
records
=
keyinfo
->
rec_per_key
[
max_key_part
-
1
]))
{
/*
Fix for the case where the index statistics is too
optimistic: If
(1) We're considering ref(const) and there is quick select
on the same index,
(2) and that quick select uses more keyparts (i.e. it will
scan equal/smaller interval then this ref(const))
(3) and E(#rows) for quick select is higher then our
estimate,
Then
We'll use E(#rows) from quick select.
Q: Why do we choose to use 'ref'? Won't quick select be
cheaper in some cases ?
TODO: figure this out and adjust the plan choice if needed.
*/
if
(
!
found_ref
&&
table
->
quick_keys
.
is_set
(
key
)
&&
// (1)
table
->
quick_key_parts
[
key
]
>
max_key_part
&&
// (2)
records
<
(
double
)
table
->
quick_rows
[
key
])
// (3)
records
=
(
double
)
table
->
quick_rows
[
key
];
tmp
=
records
;
tmp
=
records
;
}
else
else
{
{
/*
/*
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment