mirror of
https://github.com/MariaDB/server.git
synced 2025-08-23 03:54:27 +03:00
-- innodb-wl5522-debug-zip (path differences win/unix) -- innodb_defragment_fill_factor (stabilise) -- innodb_force_pk (case difference win/unix)
166 lines
6.4 KiB
Plaintext
166 lines
6.4 KiB
Plaintext
--source include/have_innodb.inc
|
|
--source include/big_test.inc
|
|
--source include/not_valgrind.inc
|
|
--source include/not_embedded.inc
|
|
--source include/have_innodb_16k.inc
|
|
|
|
--disable_warnings
|
|
DROP TABLE if exists t1;
|
|
DROP TABLE if exists t2;
|
|
--enable_warnings
|
|
|
|
--echo Testing tables with large records
|
|
# Create table.
|
|
CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b VARCHAR(256), KEY SECOND(a, b)) ENGINE=INNODB;
|
|
|
|
# Populate table.
|
|
INSERT INTO t1 VALUES (1, REPEAT('A', 256));
|
|
INSERT INTO t1 (b) SELECT b from t1;
|
|
INSERT INTO t1 (b) SELECT b from t1;
|
|
INSERT INTO t1 (b) SELECT b from t1;
|
|
INSERT INTO t1 (b) SELECT b from t1;
|
|
INSERT INTO t1 (b) SELECT b from t1;
|
|
INSERT INTO t1 (b) SELECT b from t1;
|
|
INSERT INTO t1 (b) SELECT b from t1;
|
|
INSERT INTO t1 (b) SELECT b from t1;
|
|
INSERT INTO t1 (b) SELECT b from t1;
|
|
INSERT INTO t1 (b) SELECT b from t1;
|
|
|
|
--disable_query_log
|
|
let $size = 10;
|
|
while ($size)
|
|
{
|
|
let $j = 100 * $size;
|
|
eval delete from t1 where a between $j - 20 and $j + 5;
|
|
dec $size;
|
|
}
|
|
--enable_query_log
|
|
|
|
--source include/restart_mysqld.inc
|
|
optimize table t1;
|
|
select sleep(1);
|
|
|
|
--source include/restart_mysqld.inc
|
|
select count(*) from t1;
|
|
|
|
# After deletion & defragmentation, there are 800 records left. Each page can hold about 57 records. We fill the page 90% full,
|
|
# so there should be less than 16 pages total.
|
|
--let $primary_before = query_get_value(select count(*) as Value from information_schema.innodb_buffer_page where table_name like '%t1%' and index_name = 'PRIMARY', Value, 1)
|
|
|
|
select count(*) from t1 force index (second);
|
|
|
|
# secondary index is slightly bigger than primary index so the number of pages should be similar.
|
|
--let $second_before = query_get_value(select count(*) as Value from information_schema.innodb_buffer_page where table_name like '%t1%' and index_name = 'second', Value, 1)
|
|
|
|
--echo # A few more insertions on the page should not cause a page split.
|
|
insert into t1 values (81, REPEAT('A', 256));
|
|
insert into t1 values (83, REPEAT('A', 256));
|
|
insert into t1 values (87, REPEAT('A', 256));
|
|
insert into t1 values (82, REPEAT('A', 256));
|
|
insert into t1 values (86, REPEAT('A', 256));
|
|
--let $primary_after = query_get_value(select count(*) as Value from information_schema.innodb_buffer_page where table_name like '%t1%' and index_name = 'PRIMARY', Value, 1)
|
|
--let $second_after = query_get_value(select count(*) as Value from information_schema.innodb_buffer_page where table_name like '%t1%' and index_name = 'second', Value, 1)
|
|
|
|
if ($primary_before != $primary_after) {
|
|
--echo Insertion caused page split on primary, which should be avoided by innodb_defragment_fill_factor.
|
|
}
|
|
|
|
if ($second_before != $second_after) {
|
|
--echo Insertion caused page split on second, which should be avoided by innodb_defragment_fill_factor.
|
|
}
|
|
|
|
--echo # More insertions will cause page splits
|
|
insert into t1 values (88, REPEAT('A', 256));
|
|
insert into t1 values (85, REPEAT('A', 256));
|
|
insert into t1 values (84, REPEAT('A', 256));
|
|
--let $primary_after = query_get_value(select count(*) as Value from information_schema.innodb_buffer_page where table_name like '%t1%' and index_name = 'PRIMARY', Value, 1)
|
|
--let $second_after = query_get_value(select count(*) as Value from information_schema.innodb_buffer_page where table_name like '%t1%' and index_name = 'second', Value, 1)
|
|
|
|
if ($primary_before == $primary_after) {
|
|
--echo Too much space are reserved on primary index.
|
|
}
|
|
|
|
if ($second_before == $second_after) {
|
|
--echo Too much space are reserved on second index.
|
|
}
|
|
|
|
DROP TABLE t1;
|
|
|
|
--echo Testing table with small records
|
|
CREATE TABLE t2 (a INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b VARchar(16), KEY SECOND(a,b)) ENGINE=INNODB;
|
|
# Populate table.
|
|
--disable_query_log
|
|
INSERT INTO t2 VALUES (1, REPEAT('A', 16));
|
|
INSERT INTO t2 (b) SELECT b from t2;
|
|
INSERT INTO t2 (b) SELECT b from t2;
|
|
INSERT INTO t2 (b) SELECT b from t2;
|
|
INSERT INTO t2 (b) SELECT b from t2;
|
|
INSERT INTO t2 (b) SELECT b from t2;
|
|
INSERT INTO t2 (b) SELECT b from t2;
|
|
INSERT INTO t2 (b) SELECT b from t2;
|
|
INSERT INTO t2 (b) SELECT b from t2;
|
|
INSERT INTO t2 (b) SELECT b from t2;
|
|
INSERT INTO t2 (b) SELECT b from t2;
|
|
INSERT INTO t2 (b) SELECT b from t2;
|
|
INSERT INTO t2 (b) SELECT b from t2;
|
|
--enable_query_log
|
|
|
|
--disable_query_log
|
|
let $size = 40;
|
|
while ($size)
|
|
{
|
|
let $j = 100 * $size;
|
|
eval delete from t2 where a between $j - 20 and $j;
|
|
dec $size;
|
|
}
|
|
--enable_query_log
|
|
|
|
--source include/restart_mysqld.inc
|
|
optimize table t2;
|
|
select sleep(1);
|
|
|
|
--source include/restart_mysqld.inc
|
|
select count(*) from t2 force index(second);
|
|
|
|
--let $second_before = query_get_value(select count(*) as Value from information_schema.innodb_buffer_page where table_name like '%t2%' and index_name = 'second', Value, 1)
|
|
|
|
--echo The page should have room for about 20 insertions
|
|
insert into t2 values(1181, REPEAT('A', 16));
|
|
insert into t2 values(1191, REPEAT('A', 16));
|
|
insert into t2 values(1182, REPEAT('A', 16));
|
|
insert into t2 values(1192, REPEAT('A', 16));
|
|
insert into t2 values(1183, REPEAT('A', 16));
|
|
insert into t2 values(1193, REPEAT('A', 16));
|
|
insert into t2 values(1184, REPEAT('A', 16));
|
|
insert into t2 values(1194, REPEAT('A', 16));
|
|
insert into t2 values(1185, REPEAT('A', 16));
|
|
insert into t2 values(1195, REPEAT('A', 16));
|
|
insert into t2 values(1186, REPEAT('A', 16));
|
|
insert into t2 values(1196, REPEAT('A', 16));
|
|
insert into t2 values(1187, REPEAT('A', 16));
|
|
insert into t2 values(1197, REPEAT('A', 16));
|
|
insert into t2 values(1188, REPEAT('A', 16));
|
|
insert into t2 values(1198, REPEAT('A', 16));
|
|
insert into t2 values(1189, REPEAT('A', 16));
|
|
insert into t2 values(1199, REPEAT('A', 16));
|
|
insert into t2 values(1190, REPEAT('A', 16));
|
|
insert into t2 values(1180, REPEAT('A', 16));
|
|
|
|
--let $second_after = query_get_value(select count(*) as Value from information_schema.innodb_buffer_page where table_name like '%t2%' and index_name = 'second', Value, 1)
|
|
|
|
if ($second_before != $second_after) {
|
|
--echo Insertion caused page split on second, which should be avoided by innodb_defragment_fill_factor.
|
|
}
|
|
|
|
--echo More insertions will cause page split.
|
|
insert into t2 values(1280, REPEAT('A', 16));
|
|
insert into t2 values(1290, REPEAT('A', 16));
|
|
insert into t2 values(1281, REPEAT('A', 16));
|
|
insert into t2 values(1291, REPEAT('A', 16));
|
|
|
|
--let $second_after = query_get_value(select count(*) as Value from information_schema.innodb_buffer_page where table_name like '%t2%' and index_name = 'second', Value, 1)
|
|
if ($second_before == $second_after) {
|
|
--echo Too much space are reserved on second index.
|
|
}
|
|
|
|
DROP TABLE t2; |