设计mySql索引和主要键控以提高效率

时间:2009-11-27 12:49:07

标签: mysql database-design query-optimization

我有一个中等大小的记录集合 - 大约2000万 - 我需要加载到mySQL中用于数据分析。这些恰好是访问地点的人的记录。它们由三个数据项唯一标识:

  • 地方 - 一个独特的INT
  • person - 字符串,有时是数字,有时也是字母数字,例如AB12345678
  • 访问 - 与人类似

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

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

我可以通过创建这样的表来使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索引采取了多少命中?是否值得尝试将它们限制在固定长度的字段中?

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

感谢。

2 个答案:

答案 0 :(得分:0)

你的索引是正确的。你不可能做得更好。

这是使用分区的完美,非显而易见的机会。我觉得你所有的分析都是基于地方的。如果是这样,那么基于place列创建一个哈希分区,如下所示:

ALTER TABLE encounter PARTITION BY KEY(place) PARTITIONS 12;

这将使你的查询更快,因为mysql知道它可以在对一个地方进行分析时跳过查看行的十二分之一。

答案 1 :(得分:0)

  

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

如果您要搜索所访问过的所有地点,则需要在(person, place)上添加其他索引。

  

我对varchar索引采取了多少命中?是否值得尝试将它们限制在固定长度的字段中?

INTVARCHAR记录的关键点击时间相同。

VARCHAR字段的密钥丢失更为昂贵。