mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Implement point selectivity for JSON histograms
* Also merges tests relating to JSON statistics into one file Signed-off-by: Michael Okoko <okokomichaels@outlook.com>
This commit is contained in:
committed by
Sergei Petrunia
parent
547f805311
commit
bff65a813e
@ -1,38 +0,0 @@
|
|||||||
create table users (
|
|
||||||
city varchar(100)
|
|
||||||
);
|
|
||||||
insert into users select 'Moscow' from seq_1_to_99;
|
|
||||||
insert into users select 'Helsinki' from seq_1_to_2;
|
|
||||||
analyze table users persistent for all;
|
|
||||||
Table Op Msg_type Msg_text
|
|
||||||
test.users analyze status Engine-independent statistics collected
|
|
||||||
test.users analyze status OK
|
|
||||||
select hex(histogram) from mysql.column_stats where table_name='users';
|
|
||||||
hex(histogram)
|
|
||||||
00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
|
|
||||||
explain extended select * from users where city = 'Moscow';
|
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
||||||
1 SIMPLE users ALL NULL NULL NULL NULL 101 97.66 Using where
|
|
||||||
Warnings:
|
|
||||||
Note 1003 select `test`.`users`.`city` AS `city` from `test`.`users` where `test`.`users`.`city` = 'Moscow'
|
|
||||||
analyze select * from users where city = 'Moscow';
|
|
||||||
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
|
|
||||||
1 SIMPLE users ALL NULL NULL NULL NULL 101 101.00 97.66 98.02 Using where
|
|
||||||
delete from mysql.column_stats where table_name='users';
|
|
||||||
set histogram_type=json;
|
|
||||||
set histogram_size=10;
|
|
||||||
analyze table users persistent for all;
|
|
||||||
Table Op Msg_type Msg_text
|
|
||||||
test.users analyze status Engine-independent statistics collected
|
|
||||||
test.users analyze status Table is already up to date
|
|
||||||
select histogram from mysql.column_stats where table_name='users';
|
|
||||||
histogram
|
|
||||||
[]
|
|
||||||
explain extended select * from users where city = 'Moscow';
|
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
||||||
1 SIMPLE users ALL NULL NULL NULL NULL 101 50.00 Using where
|
|
||||||
Warnings:
|
|
||||||
Note 1003 select `test`.`users`.`city` AS `city` from `test`.`users` where `test`.`users`.`city` = 'Moscow'
|
|
||||||
analyze select * from users where city = 'Moscow';
|
|
||||||
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
|
|
||||||
1 SIMPLE users ALL NULL NULL NULL NULL 101 101.00 50.00 98.02 Using where
|
|
@ -1,21 +0,0 @@
|
|||||||
--source include/have_sequence.inc
|
|
||||||
create table users (
|
|
||||||
city varchar(100)
|
|
||||||
);
|
|
||||||
insert into users select 'Moscow' from seq_1_to_99;
|
|
||||||
insert into users select 'Helsinki' from seq_1_to_2;
|
|
||||||
|
|
||||||
analyze table users persistent for all;
|
|
||||||
select hex(histogram) from mysql.column_stats where table_name='users';
|
|
||||||
explain extended select * from users where city = 'Moscow';
|
|
||||||
analyze select * from users where city = 'Moscow';
|
|
||||||
|
|
||||||
delete from mysql.column_stats where table_name='users';
|
|
||||||
|
|
||||||
set histogram_type=json;
|
|
||||||
set histogram_size=10;
|
|
||||||
|
|
||||||
analyze table users persistent for all;
|
|
||||||
select histogram from mysql.column_stats where table_name='users';
|
|
||||||
explain extended select * from users where city = 'Moscow';
|
|
||||||
analyze select * from users where city = 'Moscow';
|
|
@ -1,357 +0,0 @@
|
|||||||
#
|
|
||||||
# Test to inspect the range_selectivity returned by Histogram_json and Histogram_binary
|
|
||||||
# todo: should be merged with statistics_json.test
|
|
||||||
#
|
|
||||||
set @save_histogram_type=@@histogram_type;
|
|
||||||
set @save_histogram_size=@@histogram_size;
|
|
||||||
create table ten(a int primary key);
|
|
||||||
insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
|
||||||
create table t1_bin (a varchar(255));
|
|
||||||
insert into t1_bin select concat('a-', a) from ten;
|
|
||||||
set histogram_size=100;
|
|
||||||
analyze table t1_bin persistent for all;
|
|
||||||
Table Op Msg_type Msg_text
|
|
||||||
test.t1_bin analyze status Engine-independent statistics collected
|
|
||||||
test.t1_bin analyze status OK
|
|
||||||
select hex(histogram) from mysql.column_stats where table_name='t1_bin';
|
|
||||||
hex(histogram)
|
|
||||||
00000000000000000000711C711C711C711C711CE338E338E338E338E33855555555555555555555C671C671C671C671C671388E388E388E388E388EAAAAAAAAAAAAAAAAAAAA1BC71BC71BC71BC71BC78DE38DE38DE38DE38DE3FFFFFFFFFFFFFFFFFFFF
|
|
||||||
explain extended select * from t1_bin where a between 'a-3a' and 'zzzzzzzzz';
|
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
||||||
1 SIMPLE t1_bin ALL NULL NULL NULL NULL 10 58.82 Using where
|
|
||||||
Warnings:
|
|
||||||
Note 1003 select `test`.`t1_bin`.`a` AS `a` from `test`.`t1_bin` where `test`.`t1_bin`.`a` between 'a-3a' and 'zzzzzzzzz'
|
|
||||||
analyze select * from t1_bin where a between 'a-3a' and 'zzzzzzzzz';
|
|
||||||
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
|
|
||||||
1 SIMPLE t1_bin ALL NULL NULL NULL NULL 10 10.00 58.82 60.00 Using where
|
|
||||||
create table t1_json (a varchar(255));
|
|
||||||
insert into t1_json select concat('a-', a) from ten;
|
|
||||||
set histogram_type=json;
|
|
||||||
analyze table t1_json persistent for all;
|
|
||||||
Table Op Msg_type Msg_text
|
|
||||||
test.t1_json analyze status Engine-independent statistics collected
|
|
||||||
test.t1_json analyze status OK
|
|
||||||
select * from mysql.column_stats where table_name='t1_json';
|
|
||||||
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
|
||||||
test t1_json a a-0 a-9 0.0000 3.0000 1.0000 100 JSON [
|
|
||||||
"a-0",
|
|
||||||
"a-0",
|
|
||||||
"a-0",
|
|
||||||
"a-0",
|
|
||||||
"a-0",
|
|
||||||
"a-0",
|
|
||||||
"a-0",
|
|
||||||
"a-0",
|
|
||||||
"a-0",
|
|
||||||
"a-0",
|
|
||||||
"a-1",
|
|
||||||
"a-1",
|
|
||||||
"a-1",
|
|
||||||
"a-1",
|
|
||||||
"a-1",
|
|
||||||
"a-1",
|
|
||||||
"a-1",
|
|
||||||
"a-1",
|
|
||||||
"a-1",
|
|
||||||
"a-1",
|
|
||||||
"a-2",
|
|
||||||
"a-2",
|
|
||||||
"a-2",
|
|
||||||
"a-2",
|
|
||||||
"a-2",
|
|
||||||
"a-2",
|
|
||||||
"a-2",
|
|
||||||
"a-2",
|
|
||||||
"a-2",
|
|
||||||
"a-2",
|
|
||||||
"a-3",
|
|
||||||
"a-3",
|
|
||||||
"a-3",
|
|
||||||
"a-3",
|
|
||||||
"a-3",
|
|
||||||
"a-3",
|
|
||||||
"a-3",
|
|
||||||
"a-3",
|
|
||||||
"a-3",
|
|
||||||
"a-3",
|
|
||||||
"a-4",
|
|
||||||
"a-4",
|
|
||||||
"a-4",
|
|
||||||
"a-4",
|
|
||||||
"a-4",
|
|
||||||
"a-4",
|
|
||||||
"a-4",
|
|
||||||
"a-4",
|
|
||||||
"a-4",
|
|
||||||
"a-4",
|
|
||||||
"a-5",
|
|
||||||
"a-5",
|
|
||||||
"a-5",
|
|
||||||
"a-5",
|
|
||||||
"a-5",
|
|
||||||
"a-5",
|
|
||||||
"a-5",
|
|
||||||
"a-5",
|
|
||||||
"a-5",
|
|
||||||
"a-5",
|
|
||||||
"a-6",
|
|
||||||
"a-6",
|
|
||||||
"a-6",
|
|
||||||
"a-6",
|
|
||||||
"a-6",
|
|
||||||
"a-6",
|
|
||||||
"a-6",
|
|
||||||
"a-6",
|
|
||||||
"a-6",
|
|
||||||
"a-6",
|
|
||||||
"a-7",
|
|
||||||
"a-7",
|
|
||||||
"a-7",
|
|
||||||
"a-7",
|
|
||||||
"a-7",
|
|
||||||
"a-7",
|
|
||||||
"a-7",
|
|
||||||
"a-7",
|
|
||||||
"a-7",
|
|
||||||
"a-7",
|
|
||||||
"a-8",
|
|
||||||
"a-8",
|
|
||||||
"a-8",
|
|
||||||
"a-8",
|
|
||||||
"a-8",
|
|
||||||
"a-8",
|
|
||||||
"a-8",
|
|
||||||
"a-8",
|
|
||||||
"a-8",
|
|
||||||
"a-8",
|
|
||||||
"a-9",
|
|
||||||
"a-9",
|
|
||||||
"a-9",
|
|
||||||
"a-9",
|
|
||||||
"a-9",
|
|
||||||
"a-9",
|
|
||||||
"a-9",
|
|
||||||
"a-9",
|
|
||||||
"a-9",
|
|
||||||
"a-9"
|
|
||||||
]
|
|
||||||
explain extended select * from t1_json where a between 'a-3a' and 'zzzzzzzzz';
|
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
||||||
1 SIMPLE t1_json ALL NULL NULL NULL NULL 10 60.87 Using where
|
|
||||||
Warnings:
|
|
||||||
Note 1003 select `test`.`t1_json`.`a` AS `a` from `test`.`t1_json` where `test`.`t1_json`.`a` between 'a-3a' and 'zzzzzzzzz'
|
|
||||||
analyze select * from t1_json where a between 'a-3a' and 'zzzzzzzzz';
|
|
||||||
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
|
|
||||||
1 SIMPLE t1_json ALL NULL NULL NULL NULL 10 10.00 60.87 60.00 Using where
|
|
||||||
create table t2_bin(a int);
|
|
||||||
insert into t2_bin select a*10 from ten;
|
|
||||||
set histogram_type=@save_histogram_type;
|
|
||||||
analyze table t2_bin persistent for all;
|
|
||||||
Table Op Msg_type Msg_text
|
|
||||||
test.t2_bin analyze status Engine-independent statistics collected
|
|
||||||
test.t2_bin analyze status OK
|
|
||||||
explain extended select * from t2_bin where a between '44' and '55';
|
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
||||||
1 SIMPLE t2_bin ALL NULL NULL NULL NULL 10 11.76 Using where
|
|
||||||
Warnings:
|
|
||||||
Note 1003 select `test`.`t2_bin`.`a` AS `a` from `test`.`t2_bin` where `test`.`t2_bin`.`a` between '44' and '55'
|
|
||||||
analyze select * from t2_bin where a between '44' and '55';
|
|
||||||
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
|
|
||||||
1 SIMPLE t2_bin ALL NULL NULL NULL NULL 10 10.00 11.76 10.00 Using where
|
|
||||||
create table t2_json(a int);
|
|
||||||
insert into t2_json select a*10 from ten;
|
|
||||||
set histogram_type=json;
|
|
||||||
analyze table t2_json persistent for all;
|
|
||||||
Table Op Msg_type Msg_text
|
|
||||||
test.t2_json analyze status Engine-independent statistics collected
|
|
||||||
test.t2_json analyze status OK
|
|
||||||
select * from mysql.column_stats where table_name='t2_json';
|
|
||||||
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
|
||||||
test t2_json a 0 90 0.0000 4.0000 1.0000 100 JSON [
|
|
||||||
"0",
|
|
||||||
"0",
|
|
||||||
"0",
|
|
||||||
"0",
|
|
||||||
"0",
|
|
||||||
"0",
|
|
||||||
"0",
|
|
||||||
"0",
|
|
||||||
"0",
|
|
||||||
"0",
|
|
||||||
"10",
|
|
||||||
"10",
|
|
||||||
"10",
|
|
||||||
"10",
|
|
||||||
"10",
|
|
||||||
"10",
|
|
||||||
"10",
|
|
||||||
"10",
|
|
||||||
"10",
|
|
||||||
"10",
|
|
||||||
"20",
|
|
||||||
"20",
|
|
||||||
"20",
|
|
||||||
"20",
|
|
||||||
"20",
|
|
||||||
"20",
|
|
||||||
"20",
|
|
||||||
"20",
|
|
||||||
"20",
|
|
||||||
"20",
|
|
||||||
"30",
|
|
||||||
"30",
|
|
||||||
"30",
|
|
||||||
"30",
|
|
||||||
"30",
|
|
||||||
"30",
|
|
||||||
"30",
|
|
||||||
"30",
|
|
||||||
"30",
|
|
||||||
"30",
|
|
||||||
"40",
|
|
||||||
"40",
|
|
||||||
"40",
|
|
||||||
"40",
|
|
||||||
"40",
|
|
||||||
"40",
|
|
||||||
"40",
|
|
||||||
"40",
|
|
||||||
"40",
|
|
||||||
"40",
|
|
||||||
"50",
|
|
||||||
"50",
|
|
||||||
"50",
|
|
||||||
"50",
|
|
||||||
"50",
|
|
||||||
"50",
|
|
||||||
"50",
|
|
||||||
"50",
|
|
||||||
"50",
|
|
||||||
"50",
|
|
||||||
"60",
|
|
||||||
"60",
|
|
||||||
"60",
|
|
||||||
"60",
|
|
||||||
"60",
|
|
||||||
"60",
|
|
||||||
"60",
|
|
||||||
"60",
|
|
||||||
"60",
|
|
||||||
"60",
|
|
||||||
"70",
|
|
||||||
"70",
|
|
||||||
"70",
|
|
||||||
"70",
|
|
||||||
"70",
|
|
||||||
"70",
|
|
||||||
"70",
|
|
||||||
"70",
|
|
||||||
"70",
|
|
||||||
"70",
|
|
||||||
"80",
|
|
||||||
"80",
|
|
||||||
"80",
|
|
||||||
"80",
|
|
||||||
"80",
|
|
||||||
"80",
|
|
||||||
"80",
|
|
||||||
"80",
|
|
||||||
"80",
|
|
||||||
"80",
|
|
||||||
"90",
|
|
||||||
"90",
|
|
||||||
"90",
|
|
||||||
"90",
|
|
||||||
"90",
|
|
||||||
"90",
|
|
||||||
"90",
|
|
||||||
"90",
|
|
||||||
"90",
|
|
||||||
"90"
|
|
||||||
]
|
|
||||||
explain extended select * from t2_json where a between '44' and '55';
|
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
||||||
1 SIMPLE t2_json ALL NULL NULL NULL NULL 10 10.10 Using where
|
|
||||||
Warnings:
|
|
||||||
Note 1003 select `test`.`t2_json`.`a` AS `a` from `test`.`t2_json` where `test`.`t2_json`.`a` between '44' and '55'
|
|
||||||
analyze select * from t2_json where a between '44' and '55';
|
|
||||||
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
|
|
||||||
1 SIMPLE t2_json ALL NULL NULL NULL NULL 10 10.00 10.10 10.00 Using where
|
|
||||||
create table users (
|
|
||||||
city varchar(100)
|
|
||||||
);
|
|
||||||
set histogram_size=50;
|
|
||||||
insert into users select 'Moscow' from seq_1_to_99;
|
|
||||||
insert into users select 'Helsinki' from seq_1_to_2;
|
|
||||||
set histogram_type=json;
|
|
||||||
analyze table users persistent for all;
|
|
||||||
Table Op Msg_type Msg_text
|
|
||||||
test.users analyze status Engine-independent statistics collected
|
|
||||||
test.users analyze status OK
|
|
||||||
select histogram from mysql.column_stats where table_name='users';
|
|
||||||
histogram
|
|
||||||
[
|
|
||||||
"Helsinki",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow",
|
|
||||||
"Moscow"
|
|
||||||
]
|
|
||||||
explain extended select * from users where city <= 'Moscow';
|
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
||||||
1 SIMPLE users ALL NULL NULL NULL NULL 101 100.00 Using where
|
|
||||||
Warnings:
|
|
||||||
Note 1003 select `test`.`users`.`city` AS `city` from `test`.`users` where `test`.`users`.`city` <= 'Moscow'
|
|
||||||
analyze select * from users where city <= 'Moscow';
|
|
||||||
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
|
|
||||||
1 SIMPLE users ALL NULL NULL NULL NULL 101 101.00 100.00 100.00 Using where
|
|
||||||
drop table t1_bin;
|
|
||||||
drop table t1_json;
|
|
||||||
drop table t2_bin;
|
|
||||||
drop table t2_json;
|
|
||||||
drop table users;
|
|
@ -1,64 +0,0 @@
|
|||||||
--echo #
|
|
||||||
--echo # Test to inspect the range_selectivity returned by Histogram_json and Histogram_binary
|
|
||||||
--echo # todo: should be merged with statistics_json.test
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
set @save_histogram_type=@@histogram_type;
|
|
||||||
set @save_histogram_size=@@histogram_size;
|
|
||||||
|
|
||||||
create table ten(a int primary key);
|
|
||||||
insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
|
||||||
|
|
||||||
create table t1_bin (a varchar(255));
|
|
||||||
insert into t1_bin select concat('a-', a) from ten;
|
|
||||||
|
|
||||||
set histogram_size=100;
|
|
||||||
analyze table t1_bin persistent for all;
|
|
||||||
select hex(histogram) from mysql.column_stats where table_name='t1_bin';
|
|
||||||
explain extended select * from t1_bin where a between 'a-3a' and 'zzzzzzzzz';
|
|
||||||
analyze select * from t1_bin where a between 'a-3a' and 'zzzzzzzzz';
|
|
||||||
|
|
||||||
create table t1_json (a varchar(255));
|
|
||||||
insert into t1_json select concat('a-', a) from ten;
|
|
||||||
set histogram_type=json;
|
|
||||||
analyze table t1_json persistent for all;
|
|
||||||
select * from mysql.column_stats where table_name='t1_json';
|
|
||||||
explain extended select * from t1_json where a between 'a-3a' and 'zzzzzzzzz';
|
|
||||||
analyze select * from t1_json where a between 'a-3a' and 'zzzzzzzzz';
|
|
||||||
|
|
||||||
|
|
||||||
create table t2_bin(a int);
|
|
||||||
insert into t2_bin select a*10 from ten;
|
|
||||||
set histogram_type=@save_histogram_type;
|
|
||||||
analyze table t2_bin persistent for all;
|
|
||||||
explain extended select * from t2_bin where a between '44' and '55';
|
|
||||||
analyze select * from t2_bin where a between '44' and '55';
|
|
||||||
|
|
||||||
create table t2_json(a int);
|
|
||||||
insert into t2_json select a*10 from ten;
|
|
||||||
set histogram_type=json;
|
|
||||||
analyze table t2_json persistent for all;
|
|
||||||
select * from mysql.column_stats where table_name='t2_json';
|
|
||||||
explain extended select * from t2_json where a between '44' and '55';
|
|
||||||
analyze select * from t2_json where a between '44' and '55';
|
|
||||||
|
|
||||||
--source include/have_sequence.inc
|
|
||||||
create table users (
|
|
||||||
city varchar(100)
|
|
||||||
);
|
|
||||||
set histogram_size=50;
|
|
||||||
insert into users select 'Moscow' from seq_1_to_99;
|
|
||||||
insert into users select 'Helsinki' from seq_1_to_2;
|
|
||||||
set histogram_type=json;
|
|
||||||
analyze table users persistent for all;
|
|
||||||
select histogram from mysql.column_stats where table_name='users';
|
|
||||||
explain extended select * from users where city <= 'Moscow';
|
|
||||||
analyze select * from users where city <= 'Moscow';
|
|
||||||
|
|
||||||
|
|
||||||
drop table t1_bin;
|
|
||||||
drop table t1_json;
|
|
||||||
drop table t2_bin;
|
|
||||||
drop table t2_json;
|
|
||||||
drop table users;
|
|
||||||
|
|
@ -4,6 +4,175 @@
|
|||||||
drop table if exists t1;
|
drop table if exists t1;
|
||||||
set @save_histogram_type=@@histogram_type;
|
set @save_histogram_type=@@histogram_type;
|
||||||
set @save_histogram_size=@@histogram_size;
|
set @save_histogram_size=@@histogram_size;
|
||||||
|
create table ten(a int primary key);
|
||||||
|
insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||||
|
create table t1_bin (a varchar(255));
|
||||||
|
insert into t1_bin select concat('a-', a) from ten;
|
||||||
|
set histogram_size=100;
|
||||||
|
analyze table t1_bin persistent for all;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1_bin analyze status Engine-independent statistics collected
|
||||||
|
test.t1_bin analyze status OK
|
||||||
|
select hex(histogram) from mysql.column_stats where table_name='t1_bin';
|
||||||
|
hex(histogram)
|
||||||
|
00000000000000000000711C711C711C711C711CE338E338E338E338E33855555555555555555555C671C671C671C671C671388E388E388E388E388EAAAAAAAAAAAAAAAAAAAA1BC71BC71BC71BC71BC78DE38DE38DE38DE38DE3FFFFFFFFFFFFFFFFFFFF
|
||||||
|
explain extended select * from t1_bin where a between 'a-3a' and 'zzzzzzzzz';
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1_bin ALL NULL NULL NULL NULL 10 58.82 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1_bin`.`a` AS `a` from `test`.`t1_bin` where `test`.`t1_bin`.`a` between 'a-3a' and 'zzzzzzzzz'
|
||||||
|
analyze select * from t1_bin where a between 'a-3a' and 'zzzzzzzzz';
|
||||||
|
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
|
||||||
|
1 SIMPLE t1_bin ALL NULL NULL NULL NULL 10 10.00 58.82 60.00 Using where
|
||||||
|
create table t1_json (a varchar(255));
|
||||||
|
insert into t1_json select concat('a-', a) from ten;
|
||||||
|
set histogram_type=json;
|
||||||
|
analyze table t1_json persistent for all;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1_json analyze status Engine-independent statistics collected
|
||||||
|
test.t1_json analyze status OK
|
||||||
|
select * from mysql.column_stats where table_name='t1_json';
|
||||||
|
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
||||||
|
test t1_json a a-0 a-9 0.0000 3.0000 1.0000 100 JSON [
|
||||||
|
"a-0",
|
||||||
|
"a-0",
|
||||||
|
"a-0",
|
||||||
|
"a-0",
|
||||||
|
"a-0",
|
||||||
|
"a-0",
|
||||||
|
"a-0",
|
||||||
|
"a-0",
|
||||||
|
"a-0",
|
||||||
|
"a-0",
|
||||||
|
"a-1",
|
||||||
|
"a-1",
|
||||||
|
"a-1",
|
||||||
|
"a-1",
|
||||||
|
"a-1",
|
||||||
|
"a-1",
|
||||||
|
"a-1",
|
||||||
|
"a-1",
|
||||||
|
"a-1",
|
||||||
|
"a-1",
|
||||||
|
"a-2",
|
||||||
|
"a-2",
|
||||||
|
"a-2",
|
||||||
|
"a-2",
|
||||||
|
"a-2",
|
||||||
|
"a-2",
|
||||||
|
"a-2",
|
||||||
|
"a-2",
|
||||||
|
"a-2",
|
||||||
|
"a-2",
|
||||||
|
"a-3",
|
||||||
|
"a-3",
|
||||||
|
"a-3",
|
||||||
|
"a-3",
|
||||||
|
"a-3",
|
||||||
|
"a-3",
|
||||||
|
"a-3",
|
||||||
|
"a-3",
|
||||||
|
"a-3",
|
||||||
|
"a-3",
|
||||||
|
"a-4",
|
||||||
|
"a-4",
|
||||||
|
"a-4",
|
||||||
|
"a-4",
|
||||||
|
"a-4",
|
||||||
|
"a-4",
|
||||||
|
"a-4",
|
||||||
|
"a-4",
|
||||||
|
"a-4",
|
||||||
|
"a-4",
|
||||||
|
"a-5",
|
||||||
|
"a-5",
|
||||||
|
"a-5",
|
||||||
|
"a-5",
|
||||||
|
"a-5",
|
||||||
|
"a-5",
|
||||||
|
"a-5",
|
||||||
|
"a-5",
|
||||||
|
"a-5",
|
||||||
|
"a-5",
|
||||||
|
"a-6",
|
||||||
|
"a-6",
|
||||||
|
"a-6",
|
||||||
|
"a-6",
|
||||||
|
"a-6",
|
||||||
|
"a-6",
|
||||||
|
"a-6",
|
||||||
|
"a-6",
|
||||||
|
"a-6",
|
||||||
|
"a-6",
|
||||||
|
"a-7",
|
||||||
|
"a-7",
|
||||||
|
"a-7",
|
||||||
|
"a-7",
|
||||||
|
"a-7",
|
||||||
|
"a-7",
|
||||||
|
"a-7",
|
||||||
|
"a-7",
|
||||||
|
"a-7",
|
||||||
|
"a-7",
|
||||||
|
"a-8",
|
||||||
|
"a-8",
|
||||||
|
"a-8",
|
||||||
|
"a-8",
|
||||||
|
"a-8",
|
||||||
|
"a-8",
|
||||||
|
"a-8",
|
||||||
|
"a-8",
|
||||||
|
"a-8",
|
||||||
|
"a-8",
|
||||||
|
"a-9",
|
||||||
|
"a-9",
|
||||||
|
"a-9",
|
||||||
|
"a-9",
|
||||||
|
"a-9",
|
||||||
|
"a-9",
|
||||||
|
"a-9",
|
||||||
|
"a-9",
|
||||||
|
"a-9",
|
||||||
|
"a-9"
|
||||||
|
]
|
||||||
|
explain extended select * from t1_json where a between 'a-3a' and 'zzzzzzzzz';
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1_json ALL NULL NULL NULL NULL 10 60.87 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1_json`.`a` AS `a` from `test`.`t1_json` where `test`.`t1_json`.`a` between 'a-3a' and 'zzzzzzzzz'
|
||||||
|
analyze select * from t1_json where a between 'a-3a' and 'zzzzzzzzz';
|
||||||
|
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
|
||||||
|
1 SIMPLE t1_json ALL NULL NULL NULL NULL 10 10.00 60.87 60.00 Using where
|
||||||
|
create table users (
|
||||||
|
city varchar(100)
|
||||||
|
);
|
||||||
|
set histogram_size=50;
|
||||||
|
insert into users select 'Moscow' from seq_1_to_99;
|
||||||
|
insert into users select 'Helsinki' from seq_1_to_2;
|
||||||
|
set histogram_type=json;
|
||||||
|
analyze table users persistent for all;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.users analyze status Engine-independent statistics collected
|
||||||
|
test.users analyze status OK
|
||||||
|
explain extended select * from users where city = 'Moscow';
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE users ALL NULL NULL NULL NULL 101 98.04 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`users`.`city` AS `city` from `test`.`users` where `test`.`users`.`city` = 'Moscow'
|
||||||
|
analyze select * from users where city = 'Moscow';
|
||||||
|
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
|
||||||
|
1 SIMPLE users ALL NULL NULL NULL NULL 101 101.00 98.04 98.02 Using where
|
||||||
|
explain extended select * from users where city = 'Helsinki';
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE users ALL NULL NULL NULL NULL 101 50.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`users`.`city` AS `city` from `test`.`users` where `test`.`users`.`city` = 'Helsinki'
|
||||||
|
analyze select * from users where city = 'helsinki';
|
||||||
|
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
|
||||||
|
1 SIMPLE users ALL NULL NULL NULL NULL 101 101.00 50.00 1.98 Using where
|
||||||
|
drop table t1_bin;
|
||||||
|
drop table t1_json;
|
||||||
|
drop table users;
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
a int NOT NULL PRIMARY KEY,
|
a int NOT NULL PRIMARY KEY,
|
||||||
b varchar(32),
|
b varchar(32),
|
||||||
@ -252,6 +421,10 @@ Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` A
|
|||||||
analyze select * from t1 where a between '20' and '70';
|
analyze select * from t1 where a between '20' and '70';
|
||||||
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
|
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
|
||||||
1 SIMPLE t1 ALL PRIMARY NULL NULL NULL 40 40.00 57.50 57.50 Using where
|
1 SIMPLE t1 ALL PRIMARY NULL NULL NULL 40 40.00 57.50 57.50 Using where
|
||||||
|
UPDATE mysql.column_stats SET histogram='["1", {"a": "b"}, "2"]' WHERE table_name='t1';
|
||||||
|
FLUSH TABLES;
|
||||||
|
explain extended select * from t1 where a between '20' and '70';
|
||||||
|
ERROR HY000: Failed to parse histogram, encountered JSON_TYPE '1'.
|
||||||
DELETE FROM mysql.column_stats;
|
DELETE FROM mysql.column_stats;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
create schema world;
|
create schema world;
|
||||||
|
@ -11,6 +11,46 @@ drop table if exists t1;
|
|||||||
set @save_histogram_type=@@histogram_type;
|
set @save_histogram_type=@@histogram_type;
|
||||||
set @save_histogram_size=@@histogram_size;
|
set @save_histogram_size=@@histogram_size;
|
||||||
|
|
||||||
|
create table ten(a int primary key);
|
||||||
|
insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||||
|
|
||||||
|
create table t1_bin (a varchar(255));
|
||||||
|
insert into t1_bin select concat('a-', a) from ten;
|
||||||
|
|
||||||
|
set histogram_size=100;
|
||||||
|
analyze table t1_bin persistent for all;
|
||||||
|
select hex(histogram) from mysql.column_stats where table_name='t1_bin';
|
||||||
|
explain extended select * from t1_bin where a between 'a-3a' and 'zzzzzzzzz';
|
||||||
|
analyze select * from t1_bin where a between 'a-3a' and 'zzzzzzzzz';
|
||||||
|
|
||||||
|
create table t1_json (a varchar(255));
|
||||||
|
insert into t1_json select concat('a-', a) from ten;
|
||||||
|
set histogram_type=json;
|
||||||
|
analyze table t1_json persistent for all;
|
||||||
|
select * from mysql.column_stats where table_name='t1_json';
|
||||||
|
explain extended select * from t1_json where a between 'a-3a' and 'zzzzzzzzz';
|
||||||
|
analyze select * from t1_json where a between 'a-3a' and 'zzzzzzzzz';
|
||||||
|
|
||||||
|
--source include/have_sequence.inc
|
||||||
|
create table users (
|
||||||
|
city varchar(100)
|
||||||
|
);
|
||||||
|
set histogram_size=50;
|
||||||
|
insert into users select 'Moscow' from seq_1_to_99;
|
||||||
|
insert into users select 'Helsinki' from seq_1_to_2;
|
||||||
|
set histogram_type=json;
|
||||||
|
analyze table users persistent for all;
|
||||||
|
explain extended select * from users where city = 'Moscow';
|
||||||
|
analyze select * from users where city = 'Moscow';
|
||||||
|
|
||||||
|
explain extended select * from users where city = 'Helsinki';
|
||||||
|
analyze select * from users where city = 'helsinki';
|
||||||
|
|
||||||
|
|
||||||
|
drop table t1_bin;
|
||||||
|
drop table t1_json;
|
||||||
|
drop table users;
|
||||||
|
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
a int NOT NULL PRIMARY KEY,
|
a int NOT NULL PRIMARY KEY,
|
||||||
b varchar(32),
|
b varchar(32),
|
||||||
@ -81,11 +121,11 @@ SELECT COUNT(*) FROM t1;
|
|||||||
explain extended select * from t1 where a between '20' and '70';
|
explain extended select * from t1 where a between '20' and '70';
|
||||||
analyze select * from t1 where a between '20' and '70';
|
analyze select * from t1 where a between '20' and '70';
|
||||||
|
|
||||||
# todo: test different valid JSON strings that are invalid histograms.
|
# test different valid JSON strings that are invalid histograms.
|
||||||
# UPDATE mysql.column_stats SET histogram='["1", {"a": "b"}, "2"]' WHERE table_name='t1';
|
UPDATE mysql.column_stats SET histogram='["1", {"a": "b"}, "2"]' WHERE table_name='t1';
|
||||||
# FLUSH TABLES;
|
FLUSH TABLES;
|
||||||
# --error ER_JSON_HISTOGRAM_PARSE_FAILED
|
--error ER_JSON_HISTOGRAM_PARSE_FAILED
|
||||||
# explain extended select * from t1 where a between '20' and '70';
|
explain extended select * from t1 where a between '20' and '70';
|
||||||
|
|
||||||
DELETE FROM mysql.column_stats;
|
DELETE FROM mysql.column_stats;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@ -1452,10 +1452,37 @@ double pos_in_interval_through_strxfrm(Field *field,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
double Histogram_json::point_selectivity(Field *field, key_range *min_endp,
|
double Histogram_json::point_selectivity(Field *field, key_range *endpoint, double avg_sel)
|
||||||
key_range *max_endp, double avg_sel)
|
|
||||||
{
|
{
|
||||||
return 0.5;
|
double sel;
|
||||||
|
store_key_image_to_rec(field, (uchar *) endpoint->key,
|
||||||
|
field->key_length());
|
||||||
|
const uchar *min_key = endpoint->key;
|
||||||
|
if (field->real_maybe_null())
|
||||||
|
min_key++;
|
||||||
|
uint min_idx= find_bucket(field, min_key);
|
||||||
|
|
||||||
|
uint max_idx= min_idx;
|
||||||
|
|
||||||
|
// find how many buckets this value occupies
|
||||||
|
while ((max_idx + 1 < get_width() ) &&
|
||||||
|
(field->key_cmp((uchar *)histogram_bounds[max_idx + 1].data(), min_key) == 0)) {
|
||||||
|
max_idx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//todo: do we need to account for zero value-length similarly to binary histograms.
|
||||||
|
|
||||||
|
if (max_idx > min_idx)
|
||||||
|
{
|
||||||
|
// value spans multiple buckets
|
||||||
|
double bucket_sel= 1.0/(get_width() + 1);
|
||||||
|
sel= bucket_sel * (max_idx - min_idx + 1);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
// the value fits within a single bucket
|
||||||
|
sel = MIN(avg_sel, get_width());
|
||||||
|
}
|
||||||
|
return sel;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@param field The table field histogram is for. We don't care about the
|
@param field The table field histogram is for. We don't care about the
|
||||||
@ -1572,11 +1599,8 @@ int Histogram_json::find_bucket(Field *field, const uchar *endpoint)
|
|||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
low = mid + 1;
|
low = mid + 1;
|
||||||
min_bucket_index = mid;
|
min_bucket_index = mid;
|
||||||
} else if (res > 0) {
|
} else if (res >= 0) {
|
||||||
high = mid - 1;
|
high = mid - 1;
|
||||||
} else {
|
|
||||||
//todo: endpoint is on a bucket boundary
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4326,7 +4350,7 @@ double get_column_range_cardinality(Field *field,
|
|||||||
if (hist && hist->is_usable(thd))
|
if (hist && hist->is_usable(thd))
|
||||||
{
|
{
|
||||||
res= col_non_nulls *
|
res= col_non_nulls *
|
||||||
hist->point_selectivity(field, min_endp, max_endp,
|
hist->point_selectivity(field, min_endp,
|
||||||
avg_frequency / col_non_nulls);
|
avg_frequency / col_non_nulls);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4390,8 +4414,7 @@ double get_column_range_cardinality(Field *field,
|
|||||||
value.
|
value.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
double Histogram_binary::point_selectivity(Field *field, key_range *min_endp,
|
double Histogram_binary::point_selectivity(Field *field, key_range *min_endp, double avg_sel)
|
||||||
key_range *max_endp, double avg_sel)
|
|
||||||
{
|
{
|
||||||
double sel;
|
double sel;
|
||||||
Column_statistics *col_stats= field->read_stats;
|
Column_statistics *col_stats= field->read_stats;
|
||||||
|
@ -169,8 +169,7 @@ public:
|
|||||||
|
|
||||||
virtual void set_size(ulonglong sz)=0;
|
virtual void set_size(ulonglong sz)=0;
|
||||||
|
|
||||||
virtual double point_selectivity(Field *field, key_range *min_endp,
|
virtual double point_selectivity(Field *field, key_range *endpoint, double avg_selection)=0;
|
||||||
key_range *max_endp, double avg_selection)=0;
|
|
||||||
|
|
||||||
virtual double range_selectivity(Field *field, key_range *min_endp,
|
virtual double range_selectivity(Field *field, key_range *min_endp,
|
||||||
key_range *max_endp)=0;
|
key_range *max_endp)=0;
|
||||||
@ -334,8 +333,7 @@ public:
|
|||||||
/*
|
/*
|
||||||
Estimate selectivity of "col=const" using a histogram
|
Estimate selectivity of "col=const" using a histogram
|
||||||
*/
|
*/
|
||||||
double point_selectivity(Field *field, key_range *min_endp,
|
double point_selectivity(Field *field, key_range *endpoint, double avg_sel) override;
|
||||||
key_range *max_endp, double avg_sel) override;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class Histogram_json : public Histogram_base
|
class Histogram_json : public Histogram_base
|
||||||
@ -399,8 +397,7 @@ public:
|
|||||||
|
|
||||||
uchar *get_values() override { return (uchar *) values; }
|
uchar *get_values() override { return (uchar *) values; }
|
||||||
|
|
||||||
double point_selectivity(Field *field, key_range *min_endp,
|
double point_selectivity(Field *field, key_range *endpoint, double avg_selection) override;
|
||||||
key_range *max_endp, double avg_selection) override;
|
|
||||||
|
|
||||||
double range_selectivity(Field *field, key_range *min_endp,
|
double range_selectivity(Field *field, key_range *min_endp,
|
||||||
key_range *max_endp) override;
|
key_range *max_endp) override;
|
||||||
|
Reference in New Issue
Block a user