首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mySql索引的设计与效率的主键控

mySql索引的设计与效率的主键控
EN

Stack Overflow用户
提问于 2009-11-27 12:49:07
回答 2查看 210关注 0票数 0

我有一个中型的记录集--大约2000万份--我需要加载到mySQL中,用于数据分析。这些恰好是人们参观地方的记录。它们由三个数据项唯一标识:

  • place -一个独特的INT
  • person -一个字符串,有时是数字,有时是字母数字,例如AB12345678
  • 访问-similar to person

我没有任何控制的人和访问现场的内容,因为这些是由不同的地方提供,每个地方都有自己的事情。

我可以通过匹配地点和人来找到一个人的所有记录,通过匹配这三个人找到一个单独的记录。

通过创建这样一个表,我可以在mySql中很好地完成这个任务:

代码语言:javascript
运行
复制
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索引,我要承受多少打击?是否值得尝试将它们限制在一个固定长度的字段中?

收集到的智慧还有什么其他的建议吗?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-27 15:36:50

你的索引是正确的。你不会有比这更好的了。

这是一个使用分区的完美的、不明显的机会。我觉得你所有的分析都是基于地点的。如果是这样,那么根据place列创建一个散列分区,如下所示:

代码语言:javascript
运行
复制
ALTER TABLE encounter PARTITION BY KEY(place) PARTITIONS 12;

这将使查询速度更快,因为mysql知道,在对一个地方进行分析时,它可以跳过查看1/12行。

票数 0
EN

Stack Overflow用户

发布于 2009-11-27 17:56:06

我可以通过匹配地点和人来找到一个人的所有记录,通过匹配这三个人找到一个单独的记录。

如果要搜索所有访问过的人的位置,您需要在(person, place)上做一个额外的索引。

,对于varchar索引,我要承受多少打击?是否值得尝试将它们限制在一个固定长度的字段中?

对于INTVARCHAR记录,键击需要相同的时间。

对于VARCHAR字段来说,关键遗漏的代价更高。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1808592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档