我有一个中等大小的记录集合 - 大约2000万 - 我需要加载到mySQL中用于数据分析。这些恰好是访问地点的人的记录。它们由三个数据项唯一标识:
我对这个人和访问字段内容没有任何控制权,因为这些是由不同的地方提供的,每个地方都有自己的事情。
我可以通过匹配地点和人物来找到一个人的所有记录,并通过匹配这三个记录来找到个人记录。
我可以通过创建这样的表来使mySql正常工作:
CREATE TABLE ENCOUNTER (
PLACE int(11) NOT NULL,
PERSON varchar(255) NOT NULL,
VISIT varchar(255) NOT NULL,
ARRIVAL_TIME datetime DEFAULT NULL,
DEPARTURE_TIME datetime DEFAULT NULL,
EVENT varchar(255) NOT NULL,
PRIMARY KEY (PLACE,PERSON,VISIT)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
我选择了MyISAM,因为我不需要在此表上使用ACID事务完整性;它用于统计报告,所以如果它是一行或两行陈旧,那就没问题。
这个表经常会被UPDATE点击,只需更改其中一个字段,例如DEPARTURE_TIME。这些UPDATE很可能是新行INSERT的两倍。无需更新地点,人员或访问标识符。
以下是一些问题:
使用单个索引和键列连接地点/人物/访问信息,我会在性能方面做得更好吗?
我对varchar索引采取了多少命中?是否值得尝试将它们限制在固定长度的字段中?
收集的智慧还有其他建议吗?
感谢。
答案 0 :(得分:0)
你的索引是正确的。你不可能做得更好。
这是使用分区的完美,非显而易见的机会。我觉得你所有的分析都是基于地方的。如果是这样,那么基于place列创建一个哈希分区,如下所示:
ALTER TABLE encounter PARTITION BY KEY(place) PARTITIONS 12;
这将使你的查询更快,因为mysql知道它可以在对一个地方进行分析时跳过查看行的十二分之一。
答案 1 :(得分:0)
我可以通过匹配地点和人物来找到一个人的所有记录,并通过匹配这三个记录来找到个人记录。
如果您要搜索所访问过的所有地点,则需要在(person, place)
上添加其他索引。
我对varchar索引采取了多少命中?是否值得尝试将它们限制在固定长度的字段中?
INT
和VARCHAR
记录的关键点击时间相同。
VARCHAR
字段的密钥丢失更为昂贵。