mysql-partitioner 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +75 -8
- data/lib/mysql/partitioner/operation/range.rb +1 -1
- data/lib/mysql/partitioner/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dba04134b4d190b8c7f19da8e026d3fbd5f2e591
|
4
|
+
data.tar.gz: 815d422aae033d0bc0fe56a5326a231d9eae99ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bee2b105025933273c7a42d2b0d2079f9728afbccca26918b35717f118a17856a01703d184515d57dc80786a2af0ceba07aa7d5ad033909a8eee49b3b16a61ec
|
7
|
+
data.tar.gz: 5cc8f61e685880df9fd0a758c3f81cfaaf8bb3b2423f032f9643cb03892b425b016de6839eb3e9a8b04a517290a28442359ec11721e4556a66090d6db8ce0f4c
|
data/README.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1
|
-
# Mysql::
|
1
|
+
# Mysql::Partitioner
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
3
|
+
Mysql partition management tools
|
6
4
|
|
7
5
|
## Installation
|
8
6
|
|
@@ -22,25 +20,94 @@ Or install it yourself as:
|
|
22
20
|
|
23
21
|
## Usage
|
24
22
|
|
25
|
-
|
23
|
+
```
|
26
24
|
Usage: mysql-partitioner [options]
|
27
25
|
-c, --config CONFIG_NAME
|
28
26
|
--cmd check or migrate
|
29
27
|
--dry-run
|
30
28
|
-d, --debug
|
31
|
-
|
29
|
+
```
|
30
|
+
|
31
|
+
sample config
|
32
|
+
|
33
|
+
* https://github.com/maedama/mysql-partitioner/blob/master/sample/config.yaml
|
34
|
+
|
35
|
+
## Features
|
36
|
+
|
37
|
+
|
38
|
+
### Supported partition type
|
39
|
+
|
40
|
+
Currently it supports, Range partition without sub partition
|
41
|
+
|
42
|
+
### Supported Partition Strategy
|
43
|
+
|
44
|
+
##### PartitionByPkDropByRange
|
45
|
+
|
46
|
+
This Strategy allows us to partition table with Primary Key, and at the same time manage partition by timestamp
|
47
|
+
|
48
|
+
| Parameter | Description |
|
49
|
+
|-----------|-------------|
|
50
|
+
| Key | Partition Key |
|
51
|
+
| time_key | Time key |
|
52
|
+
| min_empty_partitions | If empty partitions is less than this number, check command would fail |
|
53
|
+
| desirable_empty_partitions | When migration happens, mysql-partitioner will prepare this number of partitions for future |
|
54
|
+
| range | Range of each partitions |
|
55
|
+
| ttl | when migration happens tool will drop partitions with all items in partition is older than this ttl |
|
56
|
+
|
57
|
+
|
58
|
+
Typical example of partitioning with timestamp is like bellow.
|
59
|
+
|
60
|
+
```
|
61
|
+
CREATE TABLE test(
|
62
|
+
id big int unsigned NOT NULL,
|
63
|
+
content varchar(255) NOT NULL,
|
64
|
+
created_at DATETIME NOT NULL,
|
65
|
+
PRIMARY KEY(id, created_at)
|
66
|
+
) Engine=InnoDB;
|
67
|
+
|
68
|
+
```
|
69
|
+
|
70
|
+
By including created_at in primary key, mysql can know which partition each data belongs to.
|
71
|
+
And each data will be unique if and only if it is unique in the partition they belong to.
|
72
|
+
|
73
|
+
But this approach has major fallback in terms of performance.
|
74
|
+
|
75
|
+
i.e Query like bellow would be very slow in such a partitions
|
76
|
+
|
77
|
+
```
|
78
|
+
SELECT * FROM test WHERE id in (1, 100, 10000,1000000,10000000000000)
|
79
|
+
```
|
80
|
+
|
81
|
+
Instead of such an partitioning, this strategy partions table like bellow,
|
82
|
+
|
83
|
+
```
|
84
|
+
CREATE TABLE test(
|
85
|
+
id big int unsigned NOT NULL,
|
86
|
+
content varchar(255) NOT NULL,
|
87
|
+
created_at DATETIME NOT NULL,
|
88
|
+
PRIMARY KEY(id, created_at)
|
89
|
+
) Engine=InnoDB;
|
90
|
+
|
91
|
+
```
|
92
|
+
|
93
|
+
When migration happens, toosl find all partitions with following condition and drops them.
|
94
|
+
|
95
|
+
* Is not most recent active partition
|
96
|
+
* All items in partitions is older that specified ttl
|
97
|
+
|
98
|
+
Additionally tool will also try to make new_partitions with specified parameter
|
32
99
|
|
33
100
|
|
34
101
|
## Example
|
35
102
|
|
36
|
-
|
103
|
+
```
|
37
104
|
CREATE TABLE `partition_test` (
|
38
105
|
`id` bigint(20) unsigned NOT NULL,
|
39
106
|
`created_at` datetime NOT NULL,
|
40
107
|
`updated_at` datetime NOT NULL,
|
41
108
|
PRIMARY KEY (`id`)
|
42
109
|
) Engine=InnoDB
|
43
|
-
|
110
|
+
```
|
44
111
|
|
45
112
|
Initialize first partition
|
46
113
|
|
@@ -18,7 +18,7 @@ module Mysql
|
|
18
18
|
def get_current_partitions
|
19
19
|
results = self.session.query(<<SQL)
|
20
20
|
SELECT PARTITION_EXPRESSION, PARTITION_DESCRIPTION, PARTITION_ORDINAL_POSITION, PARTITION_METHOD, SUBPARTITION_EXPRESSION
|
21
|
-
FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME="#{ self.table }" AND TABLE_SCHEMA="#{ self.database }"
|
21
|
+
FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME="#{ self.table }" AND TABLE_SCHEMA="#{ self.database } ORDER BY PARTITION_ORDINAL_POSITION ASC"
|
22
22
|
SQL
|
23
23
|
results.map {|item|
|
24
24
|
Mysql::Partitioner::Partition::Range.new(item["PARTITION_DESCRIPTION"])
|