我们有一个庞大的(并且不断增长的)鸟类记录的 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 每个表只有一个聚集索引,并且这始终是主键。我很想
尝试PRIMARY KEY (date, id)
使用 RECORDS 来利用聚集索引来更快地对日期列进行范围扫描和对表进行分区。id 仅包含在键中,因为同一日期可能有许多记录。从理论上讲,主键通常在 id 上有点“浪费”,其中非聚集 UNIQUE 索引足以进行查找。
现在我的问题:
你们中有人对这种方法有实际经验吗?有什么我可能忽略的缺点吗?