Commit a00e99ac authored by Monty's avatar Monty Committed by Sergei Golubchik

MDEV-33152 Add QUERIES to INDEX_STATISTICS

Other changes:
- Do not collect index statistics for system tables like index_stats
  table_stats, performance_schema, information_schema etc as the user
  has no control of these and the generate noise in the statistics.
parent 869e67c9
......@@ -16,30 +16,32 @@ select count(*) from just_a_test where state = 'California';
count(*)
2
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ
test just_a_test IND_just_a_test_first_name_last_name 1
test just_a_test IND_just_a_test_state 2
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ QUERIES
test just_a_test IND_just_a_test_first_name_last_name 1 1
test just_a_test IND_just_a_test_state 2 1
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
TABLE_SCHEMA TABLE_NAME ROWS_READ ROWS_CHANGED ROWS_CHANGED_X_INDEXES
test just_a_test 18 5 5
alter table just_a_test drop key IND_just_a_test_first_name_last_name;
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ
test just_a_test IND_just_a_test_state 2
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ QUERIES
test just_a_test IND_just_a_test_state 2 1
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
TABLE_SCHEMA TABLE_NAME ROWS_READ ROWS_CHANGED ROWS_CHANGED_X_INDEXES
test just_a_test 23 5 5
alter table just_a_test drop column state;
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ QUERIES
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
TABLE_SCHEMA TABLE_NAME ROWS_READ ROWS_CHANGED ROWS_CHANGED_X_INDEXES
test just_a_test 28 5 5
drop table just_a_test;
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ QUERIES
drop table just_a_test;
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
TABLE_SCHEMA TABLE_NAME ROWS_READ ROWS_CHANGED ROWS_CHANGED_X_INDEXES
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ QUERIES
create table just_a_test(id int not null primary key,first_name varchar(10),last_name varchar(10),address varchar(100),phone bigint,email varchar(30), state varchar(30),key(first_name,last_name),key(state));
insert into just_a_test values(1,'fa','la','china_a',11111111,'fa_la@163.com','California'),
(2,'fb','lb','china_b',22222222,'fb_lb@163.com','Arizona'),
......@@ -56,16 +58,16 @@ select count(*) from just_a_test where id between 2 and 4;
count(*)
3
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ
test just_a_test PRIMARY 4
test just_a_test first_name 1
test just_a_test state 2
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ QUERIES
test just_a_test PRIMARY 4 1
test just_a_test first_name 1 1
test just_a_test state 2 1
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
TABLE_SCHEMA TABLE_NAME ROWS_READ ROWS_CHANGED ROWS_CHANGED_X_INDEXES
test just_a_test 7 5 15
drop table just_a_test;
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ QUERIES
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
TABLE_SCHEMA TABLE_NAME ROWS_READ ROWS_CHANGED ROWS_CHANGED_X_INDEXES
set global userstat=@save_userstat;
......@@ -24,9 +24,10 @@ select * from information_schema.table_statistics where table_schema='test' and
alter table just_a_test drop column state;
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
drop table just_a_test;
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
drop table just_a_test;
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
#
# Test direct drop table
#
......
......@@ -130,9 +130,9 @@ TABLE_SCHEMA TABLE_NAME ROWS_READ ROWS_CHANGED ROWS_CHANGED_X_INDEXES
test T1 4 4 4
test t1 4 4 4
SELECT * FROM INFORMATION_SCHEMA.INDEX_STATISTICS ORDER BY BINARY TABLE_NAME;
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ
test T1 a 4
test t1 a 4
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ QUERIES
test T1 a 4 1
test t1 a 4 1
DROP TABLE t1;
DROP TABLE T1;
SET GLOBAL userstat=DEFAULT;
......
......@@ -7128,8 +7128,8 @@ Table_schema Table_name Rows_read Rows_changed Rows_changed_x_#indexes
test t1 2 0 0
test t2 3 0 0
show index_statistics;
Table_schema Table_name Index_name Rows_read
test t2 b 1
Table_schema Table_name Index_name Rows_read Queries
test t2 b 1 1
set global userstat=@tmp_mdev410;
DROP TABLE t1,t2,t3,t4;
#
......
......@@ -7130,8 +7130,8 @@ Table_schema Table_name Rows_read Rows_changed Rows_changed_x_#indexes
test t1 2 0 0
test t2 3 0 0
show index_statistics;
Table_schema Table_name Index_name Rows_read
test t2 b 1
Table_schema Table_name Index_name Rows_read Queries
test t2 b 1 1
set global userstat=@tmp_mdev410;
DROP TABLE t1,t2,t3,t4;
#
......
......@@ -7126,8 +7126,8 @@ Table_schema Table_name Rows_read Rows_changed Rows_changed_x_#indexes
test t1 2 0 0
test t2 3 0 0
show index_statistics;
Table_schema Table_name Index_name Rows_read
test t2 b 1
Table_schema Table_name Index_name Rows_read Queries
test t2 b 1 1
set global userstat=@tmp_mdev410;
DROP TABLE t1,t2,t3,t4;
#
......
......@@ -7123,8 +7123,8 @@ Table_schema Table_name Rows_read Rows_changed Rows_changed_x_#indexes
test t1 2 0 0
test t2 3 0 0
show index_statistics;
Table_schema Table_name Index_name Rows_read
test t2 b 1
Table_schema Table_name Index_name Rows_read Queries
test t2 b 1 1
set global userstat=@tmp_mdev410;
DROP TABLE t1,t2,t3,t4;
#
......
......@@ -7134,8 +7134,8 @@ Table_schema Table_name Rows_read Rows_changed Rows_changed_x_#indexes
test t1 2 0 0
test t2 3 0 0
show index_statistics;
Table_schema Table_name Index_name Rows_read
test t2 b 1
Table_schema Table_name Index_name Rows_read Queries
test t2 b 1 1
set global userstat=@tmp_mdev410;
DROP TABLE t1,t2,t3,t4;
#
......
......@@ -7123,8 +7123,8 @@ Table_schema Table_name Rows_read Rows_changed Rows_changed_x_#indexes
test t1 2 0 0
test t2 3 0 0
show index_statistics;
Table_schema Table_name Index_name Rows_read
test t2 b 1
Table_schema Table_name Index_name Rows_read Queries
test t2 b 1 1
set global userstat=@tmp_mdev410;
DROP TABLE t1,t2,t3,t4;
#
......
......@@ -59,6 +59,7 @@ TABLE_SCHEMA varchar(192) NO NULL
TABLE_NAME varchar(192) NO NULL
INDEX_NAME varchar(192) NO NULL
ROWS_READ bigint(21) NO NULL
QUERIES bigint(21) NO NULL
show columns from information_schema.table_statistics;
Field Type Null Key Default Extra
TABLE_SCHEMA varchar(192) NO NULL
......@@ -138,13 +139,13 @@ handler_read_key
disconnect ssl_con;
set @@global.userstat=0;
select * from information_schema.index_statistics;
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ QUERIES
select * from information_schema.table_statistics;
TABLE_SCHEMA TABLE_NAME ROWS_READ ROWS_CHANGED ROWS_CHANGED_X_INDEXES
show table_statistics;
Table_schema Table_name Rows_read Rows_changed Rows_changed_x_#indexes
show index_statistics;
Table_schema Table_name Index_name Rows_read
Table_schema Table_name Index_name Rows_read Queries
select TOTAL_CONNECTIONS, TOTAL_SSL_CONNECTIONS, CONCURRENT_CONNECTIONS, ROWS_READ, ROWS_SENT, ROWS_DELETED, ROWS_INSERTED, ROWS_UPDATED, SELECT_COMMANDS, UPDATE_COMMANDS, COMMIT_TRANSACTIONS, ROLLBACK_TRANSACTIONS, DENIED_CONNECTIONS, LOST_CONNECTIONS, ACCESS_DENIED, EMPTY_QUERIES from information_schema.client_statistics;;
TOTAL_CONNECTIONS 2
TOTAL_SSL_CONNECTIONS 1
......@@ -188,7 +189,7 @@ OTHER_COMMANDS IN (7,8)
flush table_statistics;
flush index_statistics;
select * from information_schema.index_statistics;
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ QUERIES
select * from information_schema.table_statistics;
TABLE_SCHEMA TABLE_NAME ROWS_READ ROWS_CHANGED ROWS_CHANGED_X_INDEXES
show status like "%generic%";
......@@ -248,3 +249,24 @@ drop function f;
#
# End of 10.2 tests
#
#
# MDEV-33901 INDEX_STATISTICS.QUERIES is incremented additionally for
# subqueries
#
SET @save_userstat= @@userstat;
set global userstat= 1;
create or replace table t1 (a int, key(a)) engine=MyISAM;
insert into t1 values (1),(2),(3),(4);
flush index_statistics;
select a from t1 where a in ( select a from t1 );
a
1
2
3
4
show index_statistics;
Table_schema Table_name Index_name Rows_read Queries
test t1 a 8 1
drop table t1;
set global userstat=@save_userstat;
# End of 11.5 tests
......@@ -133,3 +133,21 @@ drop function f;
--echo #
--echo # End of 10.2 tests
--echo #
--echo #
--echo # MDEV-33901 INDEX_STATISTICS.QUERIES is incremented additionally for
--echo # subqueries
--echo #
SET @save_userstat= @@userstat;
set global userstat= 1;
create or replace table t1 (a int, key(a)) engine=MyISAM;
insert into t1 values (1),(2),(3),(4);
flush index_statistics;
select a from t1 where a in ( select a from t1 );
show index_statistics;
drop table t1;
set global userstat=@save_userstat;
--echo # End of 11.5 tests
......@@ -184,6 +184,7 @@ def information_schema GLOBAL_STATUS VARIABLE_VALUE 2 NULL NO varchar 4096 12288
def information_schema GLOBAL_VARIABLES VARIABLE_NAME 1 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) select NEVER NULL NO NO
def information_schema GLOBAL_VARIABLES VARIABLE_VALUE 2 NULL NO varchar 4096 12288 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(4096) select NEVER NULL NO NO
def information_schema INDEX_STATISTICS INDEX_NAME 3 NULL NO varchar 192 576 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(192) select NEVER NULL NO NO
def information_schema INDEX_STATISTICS QUERIES 5 NULL NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL NO NO
def information_schema INDEX_STATISTICS ROWS_READ 4 NULL NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL NO NO
def information_schema INDEX_STATISTICS TABLE_NAME 2 NULL NO varchar 192 576 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(192) select NEVER NULL NO NO
def information_schema INDEX_STATISTICS TABLE_SCHEMA 1 NULL NO varchar 192 576 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(192) select NEVER NULL NO NO
......@@ -779,6 +780,7 @@ NULL information_schema GEOMETRY_COLUMNS SRID smallint NULL NULL NULL NULL small
3.0000 information_schema INDEX_STATISTICS TABLE_NAME varchar 192 576 utf8mb3 utf8mb3_general_ci varchar(192)
3.0000 information_schema INDEX_STATISTICS INDEX_NAME varchar 192 576 utf8mb3 utf8mb3_general_ci varchar(192)
NULL information_schema INDEX_STATISTICS ROWS_READ bigint NULL NULL NULL NULL bigint(21)
NULL information_schema INDEX_STATISTICS QUERIES bigint NULL NULL NULL NULL bigint(21)
3.0000 information_schema KEYWORDS WORD varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64)
3.0000 information_schema KEY_CACHES KEY_CACHE_NAME varchar 192 576 utf8mb3 utf8mb3_general_ci varchar(192)
NULL information_schema KEY_CACHES SEGMENTS int NULL NULL NULL NULL int(3) unsigned
......
......@@ -184,6 +184,7 @@ def information_schema GLOBAL_STATUS VARIABLE_VALUE 2 NULL NO varchar 4096 12288
def information_schema GLOBAL_VARIABLES VARIABLE_NAME 1 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) NEVER NULL NO NO
def information_schema GLOBAL_VARIABLES VARIABLE_VALUE 2 NULL NO varchar 4096 12288 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(4096) NEVER NULL NO NO
def information_schema INDEX_STATISTICS INDEX_NAME 3 NULL NO varchar 192 576 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(192) NEVER NULL NO NO
def information_schema INDEX_STATISTICS QUERIES 5 NULL NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL NO NO
def information_schema INDEX_STATISTICS ROWS_READ 4 NULL NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL NO NO
def information_schema INDEX_STATISTICS TABLE_NAME 2 NULL NO varchar 192 576 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(192) NEVER NULL NO NO
def information_schema INDEX_STATISTICS TABLE_SCHEMA 1 NULL NO varchar 192 576 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(192) NEVER NULL NO NO
......@@ -779,6 +780,7 @@ NULL information_schema GEOMETRY_COLUMNS SRID smallint NULL NULL NULL NULL small
3.0000 information_schema INDEX_STATISTICS TABLE_NAME varchar 192 576 utf8mb3 utf8mb3_general_ci varchar(192)
3.0000 information_schema INDEX_STATISTICS INDEX_NAME varchar 192 576 utf8mb3 utf8mb3_general_ci varchar(192)
NULL information_schema INDEX_STATISTICS ROWS_READ bigint NULL NULL NULL NULL bigint(21)
NULL information_schema INDEX_STATISTICS QUERIES bigint NULL NULL NULL NULL bigint(21)
3.0000 information_schema KEYWORDS WORD varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64)
3.0000 information_schema KEY_CACHES KEY_CACHE_NAME varchar 192 576 utf8mb3 utf8mb3_general_ci varchar(192)
NULL information_schema KEY_CACHES SEGMENTS int NULL NULL NULL NULL int(3) unsigned
......
......@@ -6,6 +6,7 @@ static ST_FIELD_INFO index_stats_fields[]=
Column("TABLE_NAME", Varchar(NAME_LEN), NOT_NULL, "Table_name"),
Column("INDEX_NAME", Varchar(NAME_LEN), NOT_NULL, "Index_name"),
Column("ROWS_READ", SLonglong(), NOT_NULL, "Rows_read"),
Column("QUERIES", SLonglong(), NOT_NULL, "Queries"),
CEnd()
};
......@@ -44,6 +45,7 @@ static int index_stats_fill(THD *thd, TABLE_LIST *tables, COND *cond)
system_charset_info);
table->field[2]->store(index_name, (uint) index_name_length, system_charset_info);
table->field[3]->store((longlong)index_stats->rows_read, TRUE);
table->field[4]->store((longlong)index_stats->queries, TRUE);
if (schema_table_store_record(thd, table))
{
......
......@@ -6033,6 +6033,9 @@ void handler::update_global_index_stats()
{
DBUG_ASSERT(table->s);
if (table->s->table_category != TABLE_CATEGORY_USER)
return; // Ignore stat tables, performance_schema, information_schema etc.
if (!table->in_use->userstat_running)
{
/* Reset all index read values */
......@@ -6073,6 +6076,15 @@ void handler::update_global_index_stats()
}
/* Updates the global index stats. */
index_stats->rows_read+= index_rows_read[index];
/*
Ensure we do not update queries if the table is used
twice in the same statement.
*/
if (index_stats->query_id != table->in_use->query_id)
{
index_stats->query_id= table->in_use->query_id;
index_stats->queries++;
}
index_rows_read[index]= 0;
end:
mysql_mutex_unlock(&LOCK_global_index_stats);
......
......@@ -30,6 +30,7 @@
#include "sql_bitmap.h"
#include "lex_charset.h"
#include "lex_ident.h"
#include "sql_basic_types.h" /* query_id_t */
struct TABLE;
class Type_handler;
......@@ -381,6 +382,8 @@ typedef struct st_index_stats
char index[NAME_LEN * 3 + 3];
size_t index_name_length; /* Length of 'index' */
ulonglong rows_read;
ulonglong queries;
query_id_t query_id;
} INDEX_STATS;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment