【发布时间】:2014-09-26 16:53:48
【问题描述】:
我们有一个庞大的(并且不断增长的)鸟类记录的 MySQL 数据库。目前我们主要有三个表,简化如下:
RECORDS (id, birdid, tripid, gender, age) PRIMARY KEY id
BIRDTRIPS (id, locid, date, starttime, endtime, notes) PRIMARY KEY id
LOCATIONS (id, description, centerlat, centerlng) PRIMARY KEY id
所有 id 都是 INT,日期是 DATE 类型。
为了获得性能,我决定通过将 date 和 locid 复制到 RECORDS 中来进行一些非规范化:
RECORDS (id, birdid, tripid, gender, age, locid, date) PRIMARY KEY id
这样,许多查询将避免昂贵的 BIRDTRIPS 和 LOCATIONS 连接。
MySQL 每个表只有一个聚集索引,并且始终是主键。我被诱惑了
在 RECORDS 上尝试PRIMARY KEY (date, id) 以利用聚集索引对日期列和表分区进行更快的范围扫描。 id 仅包含在键中,因为同一日期可能有许多记录。
从理论上讲,主键通常在 id 上有点“浪费”,其中非聚集的 UNIQUE 索引就足以进行查找。
现在我的问题是:
你们中有人有这种方法的实践经验吗?有没有我可能忽略的缺点?
【问题讨论】:
标签: mysql sql clustered-index non-clustered-index