1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

PARTITION BY SYSTEM_TIME INTERVAL ...

Lots of changes:
* calculate the current history partition in ::external_lock(),
  not in ::write_row() or ::update_row()
* remove dynamically collected per-partition row_end stats
* no full table scan in open_table_from_share to calculate these
  stats, no manual MDL/thr_locks in open_table_from_share
* no shared stats in TABLE_SHARE = no mutexes or condition waits when
  calculating current history partition
* always compare timestamps, don't convert them to MYSQL_TIME
  (avoid DST ambiguity, and it's faster too)
* correct interval handling, 1 month = 1 month, not 30 * 24 * 3600 seconds
* save/restore first partition start time, and count intervals from there
* only allow to drop first partitions if INTERVAL
* when adding new history partitions, split the data in the last history
  parition, if it was overflowed
* show partition boundaries in INFORMATION_SCHEMA.PARTITIONS
This commit is contained in:
Sergei Golubchik
2018-02-21 15:16:19 +01:00
parent 7961bc4b89
commit e36c5ec0a5
16 changed files with 463 additions and 974 deletions

View File

@ -90,61 +90,6 @@ typedef struct p_elem_val
struct st_ddl_log_memory_entry;
/* Used for collecting MIN/MAX stats on row_end for doing pruning
in SYSTEM_TIME partitiong. */
class Vers_min_max_stats : public Sql_alloc
{
static const uint buf_size= 4 + (TIME_SECOND_PART_DIGITS + 1) / 2;
uchar min_buf[buf_size];
uchar max_buf[buf_size];
Field_timestampf min_value;
Field_timestampf max_value;
mysql_rwlock_t lock;
public:
Vers_min_max_stats(const LEX_CSTRING *field_name, TABLE_SHARE *share) :
min_value(min_buf, NULL, 0, Field::NONE, field_name, share, 6),
max_value(max_buf, NULL, 0, Field::NONE, field_name, share, 6)
{
min_value.set_max();
memset(max_buf, 0, buf_size);
mysql_rwlock_init(key_rwlock_LOCK_vers_stats, &lock);
}
~Vers_min_max_stats()
{
mysql_rwlock_destroy(&lock);
}
bool update_unguarded(Field *from)
{
return
from->update_min(&min_value, false) +
from->update_max(&max_value, false);
}
bool update(Field *from)
{
mysql_rwlock_wrlock(&lock);
bool res= update_unguarded(from);
mysql_rwlock_unlock(&lock);
return res;
}
my_time_t min_time()
{
mysql_rwlock_rdlock(&lock);
ulong sec_part;
my_time_t res= min_value.get_timestamp(&sec_part);
mysql_rwlock_unlock(&lock);
return res;
}
my_time_t max_time()
{
mysql_rwlock_rdlock(&lock);
ulong sec_part;
my_time_t res= max_value.get_timestamp(&sec_part);
mysql_rwlock_unlock(&lock);
return res;
}
};
enum stat_trx_field
{
STAT_TRX_END= 0