我有一个中型的记录集--大约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事务完整性;它用于统计报告,所以如果它过时了一两行,那就没问题了。
该表经常会被更新所击中,这些更新只需更改其中一个字段,如DEPARTURE_TIME。这些更新很可能是新行插入频率的两倍。不需要更新位置、人员或访问标识符。
以下是一些问题:
在性能方面,我会更好地使用一个索引和键列来连接位置/人/访问信息吗?
对于varchar索引,我要承受多少打击?是否值得尝试将它们限制在一个固定长度的字段中?
收集到的智慧还有什么其他的建议吗?
谢谢。
发布于 2009-11-27 15:36:50
你的索引是正确的。你不会有比这更好的了。
这是一个使用分区的完美的、不明显的机会。我觉得你所有的分析都是基于地点的。如果是这样,那么根据place列创建一个散列分区,如下所示:
ALTER TABLE encounter PARTITION BY KEY(place) PARTITIONS 12;这将使查询速度更快,因为mysql知道,在对一个地方进行分析时,它可以跳过查看1/12行。
发布于 2009-11-27 17:56:06
我可以通过匹配地点和人来找到一个人的所有记录,通过匹配这三个人找到一个单独的记录。
如果要搜索所有访问过的人的位置,您需要在(person, place)上做一个额外的索引。
,对于varchar索引,我要承受多少打击?是否值得尝试将它们限制在一个固定长度的字段中?
对于INT和VARCHAR记录,键击需要相同的时间。
对于VARCHAR字段来说,关键遗漏的代价更高。
https://stackoverflow.com/questions/1808592
复制相似问题