Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Defragmentation support for partitioned InnoDB table #10

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
DROP TABLE if exists t1;
## Prepare test table
CREATE TABLE t1 (
id INT NOT NULL AUTO_INCREMENT,
fname CHAR(30) DEFAULT NULL,
lname CHAR(30) NOT NULL DEFAULT '',
PRIMARY KEY (id, lname),
INDEX ix_lname (lname)
) ENGINE=InnoDB
PARTITION BY RANGE (id)
SUBPARTITION BY KEY (lname)
SUBPARTITIONS 2
(PARTITION p0 VALUES LESS THAN (100) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (300) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (600) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = InnoDB);
INSERT INTO t1 VALUES (NULL, 'matt', 'lee'), (NULL, 'lara', 'kim'), (NULL, 'seonguck', 'ryu');
INSERT INTO t1 SELECT NULL, fname, lname FROM t1;
INSERT INTO t1 SELECT NULL, fname, lname FROM t1;
INSERT INTO t1 SELECT NULL, fname, lname FROM t1;
INSERT INTO t1 SELECT NULL, fname, lname FROM t1;
INSERT INTO t1 SELECT NULL, fname, lname FROM t1;
INSERT INTO t1 SELECT NULL, fname, lname FROM t1;
INSERT INTO t1 SELECT NULL, fname, lname FROM t1;
INSERT INTO t1 SELECT NULL, fname, lname FROM t1;
## Delete hole rows
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
## Test-1 defragment specific partition and index
ALTER TABLE t1 DEFRAGMENT PARTITION (p0sp0, P1SP1) INDEX PRIMARY;
## Test-2 defragment specific partition without index
ALTER TABLE t1 DEFRAGMENT PARTITION (p0sp0, P1SP1);
## Test-3 defragment specific index without partition
ALTER TABLE t1 DEFRAGMENT INDEX ix_lname;
## Test-4 defragment whole partitioned table
ALTER TABLE t1 DEFRAGMENT;
## Test-5 defragment specific partition and index (async commit)
ALTER TABLE t1 DEFRAGMENT PARTITION (p0sp0, P1SP1) INDEX PRIMARY async_commit;
## Test-6 defragment specific partition without index (async commit)
ALTER TABLE t1 DEFRAGMENT PARTITION (p0sp0, P1SP1) async_commit;
## Test-7 defragment specific index without partition (async commit)
ALTER TABLE t1 DEFRAGMENT INDEX ix_lname async_commit;
## Test-8 defragment whole partitioned table (async commit)
ALTER TABLE t1 DEFRAGMENT async_commit;
## Clean test table
DROP TABLE t1;
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
--source include/have_innodb.inc

--disable_warnings
DROP TABLE if exists t1;
--enable_warnings



--echo ## Prepare test table
CREATE TABLE t1 (
id INT NOT NULL AUTO_INCREMENT,
fname CHAR(30) DEFAULT NULL,
lname CHAR(30) NOT NULL DEFAULT '',
PRIMARY KEY (id, lname),
INDEX ix_lname (lname)
) ENGINE=InnoDB
PARTITION BY RANGE (id)
SUBPARTITION BY KEY (lname)
SUBPARTITIONS 2
(PARTITION p0 VALUES LESS THAN (100) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (300) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (600) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = InnoDB);

INSERT INTO t1 VALUES (NULL, 'matt', 'lee'), (NULL, 'lara', 'kim'), (NULL, 'seonguck', 'ryu');
INSERT INTO t1 SELECT NULL, fname, lname FROM t1;
INSERT INTO t1 SELECT NULL, fname, lname FROM t1;
INSERT INTO t1 SELECT NULL, fname, lname FROM t1;
INSERT INTO t1 SELECT NULL, fname, lname FROM t1;
INSERT INTO t1 SELECT NULL, fname, lname FROM t1;
INSERT INTO t1 SELECT NULL, fname, lname FROM t1;
INSERT INTO t1 SELECT NULL, fname, lname FROM t1;
INSERT INTO t1 SELECT NULL, fname, lname FROM t1;

--echo ## Delete hole rows
let $delete_rows = 150;
while($delete_rows)
{
DELETE FROM t1 WHERE id = ROUND(RAND()*1000) % 768;
dec $delete_rows;
}

--echo ## Test-1 defragment specific partition and index
ALTER TABLE t1 DEFRAGMENT PARTITION (p0sp0, P1SP1) INDEX PRIMARY;

--echo ## Test-2 defragment specific partition without index
ALTER TABLE t1 DEFRAGMENT PARTITION (p0sp0, P1SP1);

--echo ## Test-3 defragment specific index without partition
ALTER TABLE t1 DEFRAGMENT INDEX ix_lname;

--echo ## Test-4 defragment whole partitioned table
ALTER TABLE t1 DEFRAGMENT;


--echo ## Test-5 defragment specific partition and index (async commit)
ALTER TABLE t1 DEFRAGMENT PARTITION (p0sp0, P1SP1) INDEX PRIMARY async_commit;

--echo ## Test-6 defragment specific partition without index (async commit)
ALTER TABLE t1 DEFRAGMENT PARTITION (p0sp0, P1SP1) async_commit;

--echo ## Test-7 defragment specific index without partition (async commit)
ALTER TABLE t1 DEFRAGMENT INDEX ix_lname async_commit;

--echo ## Test-8 defragment whole partitioned table (async commit)
ALTER TABLE t1 DEFRAGMENT async_commit;

--echo ## Clean test table
DROP TABLE t1;
97 changes: 97 additions & 0 deletions sql/ha_partition.cc
Original file line number Diff line number Diff line change
Expand Up @@ -578,6 +578,103 @@ int ha_partition::rename_table(const char *from, const char *to)
DBUG_RETURN(del_ren_table(from, to));
}

/*
Defragment table

SYNOPSIS
defragment_table()
name Table name
index_name Index name
async Whether to wait until finish (If async is true, then defragmentation will be run parallel as many as partition count)
alter_info Altering info for partition selection

RETURN VALUES
>0 Error
0 Success
*/
int ha_partition::defragment_table(const char* name, const char* index_name, bool async, Alter_info* alter_info)
{
uint i = 0;
bool error= false;
char part_name_buff[FN_REFLEN];
uint num_parts= m_part_info->partitions.elements;
uint num_subparts= m_part_info->num_subparts;
uint req_parts = 0;

List_iterator<partition_element> part_it(m_part_info->partitions);

DBUG_ENTER("ha_partition::defragment");

if(alter_info){
req_parts = alter_info->defrag_parts.elements;
}

do
{
partition_element *part_elem= part_it++;
if (m_is_sub_partitioned)
{
List_iterator<partition_element> sub_it(part_elem->subpartitions);
uint j= 0, part;
do
{
bool skip = false;
partition_element *sub_elem= sub_it++;
part= i * num_subparts + j;

if(req_parts>0){
skip = true;
String* req_part_name;
List_iterator<String> req_part_it(alter_info->defrag_parts);
while((req_part_name= req_part_it++))
{
const char* req_part_name_cptr = req_part_name->c_ptr();
if(!my_strcasecmp(system_charset_info, sub_elem->partition_name, req_part_name_cptr))
{
skip = false;
break;
}
}
}

if(!skip)
{
create_subpartition_name(part_name_buff, name, part_elem->partition_name, sub_elem->partition_name, NORMAL_PART_NAME);
if (m_file[part]->ha_defragment_table(part_name_buff, index_name, async, NULL))
error= true;
}
} while (!error && ++j < num_subparts);
}
else
{
bool skip = false;

if(req_parts>0){
skip = true;
String* req_part_name;
List_iterator<String> req_part_it(alter_info->defrag_parts);
while((req_part_name= req_part_it++))
{
const char* req_part_name_cptr = req_part_name->c_ptr();
if(!my_strcasecmp(system_charset_info, part_elem->partition_name, req_part_name_cptr))
{
skip = false;
break;
}
}
}

if(!skip)
{
create_partition_name(part_name_buff, name, part_elem->partition_name, NORMAL_PART_NAME, TRUE);
if (m_file[i]->ha_defragment_table(part_name_buff, index_name, async, NULL))
error= true;
}
}
} while (!error && ++i < num_parts);

DBUG_RETURN(error);
}

/*
Create the handler file (.par-file)
Expand Down
1 change: 1 addition & 0 deletions sql/ha_partition.h
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,7 @@ class ha_partition :public handler
*/
virtual int delete_table(const char *from);
virtual int rename_table(const char *from, const char *to);
virtual int defragment_table(const char* name, const char* index_name, bool async, Alter_info* alter_info);
virtual int create(const char *name, TABLE *form,
HA_CREATE_INFO *create_info);
virtual int create_handler_files(const char *name,
Expand Down
4 changes: 2 additions & 2 deletions sql/handler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4674,12 +4674,12 @@ handler::ha_drop_table(const char *name)
*/

int
handler::ha_defragment_table(const char *name, const char *index, bool async)
handler::ha_defragment_table(const char *name, const char *index, bool async, Alter_info* alter_info)
{
DBUG_ASSERT(m_lock_type == F_UNLCK);
mark_trx_read_write();

return defragment_table(name, index, async);
return defragment_table(name, index, async, alter_info);
}


Expand Down
Loading