partition tables

Jun 17, 2016 18:50

У меня появился повод поразбираться с этой фичей. На слабой машине нужна работа с большой таблицей 120кк строк, 14G байт . Записи - объекты с географическими координатами, выборка обычно делается по очень компактной области координат и иногда по идентификатору объекта. Таблица используется только на чтение. Мускуль 5.5

То есть просто напрашивается на разделение на N таблиц по диапазону одной из координат.
create table qwe
(
ident int not null comment 'уникальный код объекта'
lat decimal (10,8) not null comment 'широта',
lng decimal (11,8) unsigned not null comment 'долгота',
...
unique (ident),
index (lat),
index (lng)
)
partition by range (lat)
...

CREATE TABLE `total` (
`ra` decimal(11,8) unsigned NOT NULL COMMENT 'deg; right ascension at epoch J2000.0 (ICRS)',
`de` decimal(10,8) NOT NULL COMMENT 'deg; declination epoch J2000.0 (ICRS)',
`ra_mas` int(10) unsigned NOT NULL COMMENT 'mas; right ascension at epoch J2000.0 (ICRS)',
`de_mas` int(11) NOT NULL COMMENT 'mas; south pole distance epoch J2000.0 (ICRS)',
`magm` smallint(5) unsigned DEFAULT NULL COMMENT '(2) millimag ; UCAC fit model magnitude',
`maga` smallint(5) unsigned DEFAULT NULL COMMENT '(2) millimag ; UCAC aperture magnitude',
`sigmag` tinyint(3) unsigned DEFAULT NULL COMMENT '(3) 1/100 mag; error of UCAC magnitude',
`objt` tinyint(3) unsigned NOT NULL COMMENT '(4) object type',
`cdf` tinyint(3) unsigned NOT NULL COMMENT '(5) combined double star flag',
`sigra` tinyint(3) unsigned DEFAULT NULL COMMENT '(6) mas ; s.e. at central epoch in RA (*cos Dec)',
`sigdc` tinyint(3) unsigned DEFAULT NULL COMMENT '(6) mas ; s.e. at central epoch in Dec',
`na1` tinyint(3) unsigned NOT NULL COMMENT 'total # of CCD images of this star',
`nu1` tinyint(3) unsigned NOT NULL COMMENT '(7) # of CCD images used for this star',
`cu1` tinyint(3) unsigned NOT NULL COMMENT '# catalogs (epochs) used for proper motions',
`cepra` smallint(5) unsigned NOT NULL COMMENT '0.01 yr ; central epoch for mean RA, minus 1900',
`cepdc` smallint(5) unsigned NOT NULL COMMENT '0.01 yr ; central epoch for mean Dec,minus 1900',
`pmrac` smallint(6) DEFAULT NULL COMMENT '(8) 0.1 mas/yr; proper motion in RA*cos(Dec)',
`pmdc` smallint(6) DEFAULT NULL COMMENT '0.1 mas/yr; proper motion in Dec',
`sigpmr` tinyint(3) unsigned DEFAULT NULL COMMENT '(9) 0.1 mas/yr; s.e. of pmRA * cos Dec',
`sigpmd` tinyint(3) unsigned DEFAULT NULL COMMENT '(9) 0.1 mas/yr; s.e. of pmDec',
`pts_key` int(10) unsigned DEFAULT NULL COMMENT '(10) 2MASS unique star identifier',
`j_m` smallint(6) DEFAULT NULL COMMENT 'millimag ; 2MASS J magnitude',
`h_m` smallint(6) DEFAULT NULL COMMENT 'millimag ; 2MASS H magnitude',
`k_m` smallint(6) DEFAULT NULL COMMENT 'millimag ; 2MASS K_s magnitude',
`icqflg_j` tinyint(3) unsigned DEFAULT NULL COMMENT '(11) 2MASS cc_flg*10 + ph_qual flag for J',
`icqflg_h` tinyint(3) unsigned DEFAULT NULL COMMENT '(11) 2MASS cc_flg*10 + ph_qual flag for H',
`icqflg_k` tinyint(3) unsigned DEFAULT NULL COMMENT '(11) 2MASS cc_flg*10 + ph_qual flag for K_s',
`e2mpho_j` tinyint(3) unsigned DEFAULT NULL COMMENT '(12) 1/100 mag; error 2MASS J magnitude',
`e2mpho_h` tinyint(3) unsigned DEFAULT NULL COMMENT '(12) 1/100 mag; error 2MASS H magnitude',
`e2mpho_k` tinyint(3) unsigned DEFAULT NULL COMMENT '(12) 1/100 mag; error 2MASS K_s magnitude',
`apasm_b` smallint(6) DEFAULT NULL COMMENT '(13) millimag ; B magnitude from APASS',
`apasm_v` smallint(6) DEFAULT NULL COMMENT '(13) millimag ; V magnitude from APASS',
`apasm_g` smallint(6) DEFAULT NULL COMMENT '(13) millimag ; g magnitude from APASS',
`apasm_r` smallint(6) DEFAULT NULL COMMENT '(13) millimag ; r magnitude from APASS',
`apasm_i` smallint(6) DEFAULT NULL COMMENT '(13) millimag ; i magnitude from APASS',
`apase_b` tinyint(4) DEFAULT NULL COMMENT '(14) 1/100 mag ; error of B magnitude from APASS',
`apase_v` tinyint(4) DEFAULT NULL COMMENT '(14) 1/100 mag ; error of V magnitude from APASS',
`apase_g` tinyint(4) DEFAULT NULL COMMENT '(14) 1/100 mag ; error of g magnitude from APASS',
`apase_r` tinyint(4) DEFAULT NULL COMMENT '(14) 1/100 mag ; error of r magnitude from APASS',
`apase_i` tinyint(4) DEFAULT NULL COMMENT '(14) 1/100 mag ; error of i magnitude from APASS',
`gcflg` tinyint(3) unsigned DEFAULT NULL COMMENT '(15) Yale SPM g-flag*10 c-flag',
`icf` tinyint(3) unsigned DEFAULT NULL COMMENT '(16) FK6-Hipparcos-Tycho source flag',
`icf_ac2` tinyint(3) unsigned DEFAULT NULL COMMENT '(17) AC2000 catalog match flag',
`icf_agk2` tinyint(3) unsigned DEFAULT NULL COMMENT '(17) AGK2 Bonn catalog match flag',
`icf_akg2` tinyint(3) unsigned DEFAULT NULL COMMENT '(17) AKG2 Hamburg catalog match flag',
`icf_zone` tinyint(3) unsigned DEFAULT NULL COMMENT '(17) Zone Astrog. catalog match flag',
`icf_bb` tinyint(3) unsigned DEFAULT NULL COMMENT '(17) Black Birch catalog match flag',
`icf_lick` tinyint(3) unsigned DEFAULT NULL COMMENT '(17) Lick Astrog. catalog match flag',
`icf_npm` tinyint(3) unsigned DEFAULT NULL COMMENT '(17) NPM Lick catalog match flag',
`icf_spm` tinyint(3) unsigned DEFAULT NULL COMMENT '(17) SPM YSJ1 catalog match flag',
`leda` tinyint(3) unsigned DEFAULT NULL COMMENT '(18) LEDA galaxy match flag',
`x2m` tinyint(3) unsigned DEFAULT NULL COMMENT '(19) 2MASS extend.source flag',
`rnm` int(10) unsigned NOT NULL COMMENT '(20) unique star identification number',
`zn2` smallint(5) unsigned DEFAULT NULL COMMENT '(21) zone number of UCAC2 (0 = no match)',
`rn2` int(10) unsigned DEFAULT NULL COMMENT '(21) running record number along UCAC2 zone',
KEY `ra` (`ra`),
KEY `de` (`de`),
KEY `rnm` (`rnm`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251
/*!50100 PARTITION BY KEY (ra)
PARTITIONS 100 */

На практике я, разумеется, столкнулся с непонятным поведением.
К примеру, мускуль не желает делать дробную таблицу, покуда есть unique индекс по идентификатору. Просто index - приемлет. Не, ну в данном случае мне никто не мешает заменить тип индекса. Это мелочи, хотя и странные.

Что гораздо хуже - многократно выросли требования к оперативке при добавлении записей из старой таблицы (обычной) в новую (сегментированную). То есть до такой степени, что данные добавить невозможно. 2 гига опертивки на компе, всё отдано для mysqld - ему мало. Думаю, что при выборке будет та же проблема.

Видимо я не понимаю как мускуль управляется с такими таблицами и в частности с индексами, НЕ использованными для сегментирования.

http://dev.mysql.com/doc/refman/5.5/en/partitioning.html перечитал, ответов либо не нашел либо не понял.

проектирование, оптимизация

Previous post Next post
Up