-, , :
`domain` varchar(50) DEFAULT NULL, -- normalize to MEDIUMINT UNSIGNED (3 bytes)
`guid` varchar(100) DEFAULT NULL, -- what is this for?
`sid` varchar(100) DEFAULT NULL, -- varchar?
`url` varchar(2500) DEFAULT NULL,
`ip` varchar(20) DEFAULT NULL, -- too big for IPv4, too small for IPv6; see below
`is_new` varchar(20) DEFAULT NULL, -- flag? Consider `TINYINT` or `ENUM`
`ref` varchar(2500) DEFAULT NULL,
`user_agent` varchar(255) DEFAULT NULL, -- normalize! (add new rows as new agents are created)
`stats_time` datetime DEFAULT NULL,
`country` varchar(50) DEFAULT NULL, -- use standard 2-letter code (see below)
`region` varchar(50) DEFAULT NULL, -- see below
`city` varchar(50) DEFAULT NULL, -- see below
`city_lat_long` varchar(50) DEFAULT NULL, -- unusable in current format; toss?
`email` varchar(100) DEFAULT NULL,
IP- inet6_aton(), BINARY(16).
country CHAR(2) CHARACTER SET ascii - 2 .
+ + + () latlng - "".
. → → - → .
...
sid,
KEY `domain_statstime` (`domain`,`stats_time`),
KEY dss (domain_id,`stats_time`, sid),
" ", 2713729 - - , 13 . (domain_id .)
DROP it: KEY domain_index (domain)
"" domain?
InnoDB PRIMARY KEY. 3 ; "" - 6- , . , "" , ? BIGINT UNSIGNED. (, 8 , PK.)
WHERE domain = '...', . ( .)
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
domain_id MEDIUMINT UNSIGNED NOT NULL, -- normalized to `Domains`
PRIMARY KEY(domain_id, id), -- clustering on customer gives you the speedup
INDEX(id) -- this keeps AUTO_INCREMENT happy
pt-online-schema-change . , PRIMARY KEY.
" "? . ; № . 100K.
Sharding
"Sharding" - .
sharding, -, domain, , , . Sharding . , , .
- domain ( domain_id), (1) , (2) ( 100 . ) (3) .
, , 1024 , 1024 , , . , , . , .
"" , . .
PARTITIONing - "".
, - . , . , , .
" ". ? , . (. .) :
A: PRIMARY KEY(domain_id, stats_time, id) . ( PK.)
B: stats_time , , . stats_time id. , . ( ).
C: , stats_time . , WHERE id BETWEEN ... AND stats_time .... ( , .)
? , , , . .
COUNT(DISTINCT sid) . , , . .