Mysql 主键中的日期是否会在范围扫描中获得性能?
我们有大量(且不断增长)的鸟类记录MySQL数据库。目前,我们有三个主要表格,简化如下:Mysql 主键中的日期是否会在范围扫描中获得性能?,mysql,sql,clustered-index,non-clustered-index,Mysql,Sql,Clustered Index,Non Clustered Index,我们有大量(且不断增长)的鸟类记录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均为整数,日期为
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均为整数,日期为日期类型
为了获得性能,我决定通过将date和locid复制到记录中来进行一些非规范化:
RECORDS (id, birdid, tripid, gender, age, locid, date) PRIMARY KEY id
通过这种方式,许多查询将避免昂贵的连接到birdtrip和位置
MySQL每个表只有一个聚集索引,这始终是主键。我被诱惑了尝试对记录执行主键(日期,id),利用聚集索引对日期列进行更快的范围扫描并对表进行分区。id仅包含在密钥中,因为同一日期可能有许多记录。 从理论上讲,主键通常在id上有点“浪费”,在id上,非聚集唯一索引就足以进行查找 现在我的问题是:
你们中有谁有这种方法的实践经验吗?有什么我可能忽略的缺点吗?我会回答我自己的问题,以防有人偶然发现。我发现了这篇非常好的博客文章,其中对这种方法的性能进行了测试: blogpost中进行的实验结论如下: 优点:
主键(date,id)
,可以将日期范围查询速度提高大约九倍