Mysql 几乎所有SELECT操作都使用DATETIME col的表的主键

Mysql 几乎所有SELECT操作都使用DATETIME col的表的主键,mysql,datetime,primary-key,Mysql,Datetime,Primary Key,我想知道我应该为MySQL中的这个表选择什么样的PK。几乎所有的SELECT操作都会涉及DATETIME日期范围、特定日期等 是否有最佳做法?为了安全起见,请选择自动编号。您可以有两行或多行具有相同的日期时间。为了安全起见,请选择一个自动编号。您可以有两行或更多行具有相同的日期时间。我不建议将日期时间作为您的PK,但您肯定应该在该列上。我不建议将日期时间作为您的PK,但是您当然应该在该专栏上发表意见。使用日期作为复合主键的一部分是完全可以接受的,特别是当您使用innodb并希望利用聚集主键索引来

我想知道我应该为MySQL中的这个表选择什么样的PK。几乎所有的SELECT操作都会涉及DATETIME日期范围、特定日期等


是否有最佳做法?

为了安全起见,请选择自动编号。您可以有两行或多行具有相同的日期时间。

为了安全起见,请选择一个自动编号。您可以有两行或更多行具有相同的日期时间。

我不建议将日期时间作为您的PK,但您肯定应该在该列上。

我不建议将日期时间作为您的PK,但是您当然应该在该专栏上发表意见。

使用日期作为复合主键的一部分是完全可以接受的,特别是当您使用innodb并希望利用聚集主键索引来获得最大的读取性能时

请看以下内容:

MySQL脚本

注意事项:

innodb不支持自动递增复合主键,因此使用序列表

主键的自动递增部分有助于保证唯一性-键的外部部分是重要部分,即日期

完整的脚本在这里:或继续阅读

drop table if exists foo_seq;
create table foo_seq
(
next_val int unsigned not null default 0
)
engine = innodb;

insert into foo_seq values (0);

drop table if exists foo;
create table foo
(
foo_date datetime not null,
foo_id int unsigned not null, -- auto inc field which just guarantees uniqueness
primary key (foo_date, foo_id) -- clustered composite PK (innodb only)
)
engine=innodb;

delimiter #
create trigger foo_before_ins_trig before insert on foo
for each row
begin
declare v_id int unsigned default 0;
    select next_val+1 into v_id from foo_seq;
    set new.foo_id = v_id;
    update foo_seq set next_val = v_id;
end#

delimiter ;
统计数据:

考虑到有200万行,性能相当好


希望这有帮助:

使用日期作为复合主键的一部分是完全可以接受的,特别是当您使用innodb并希望利用聚集主键索引来获得最大的读取性能时

请看以下内容:

MySQL脚本

注意事项:

innodb不支持自动递增复合主键,因此使用序列表

主键的自动递增部分有助于保证唯一性-键的外部部分是重要部分,即日期

完整的脚本在这里:或继续阅读

drop table if exists foo_seq;
create table foo_seq
(
next_val int unsigned not null default 0
)
engine = innodb;

insert into foo_seq values (0);

drop table if exists foo;
create table foo
(
foo_date datetime not null,
foo_id int unsigned not null, -- auto inc field which just guarantees uniqueness
primary key (foo_date, foo_id) -- clustered composite PK (innodb only)
)
engine=innodb;

delimiter #
create trigger foo_before_ins_trig before insert on foo
for each row
begin
declare v_id int unsigned default 0;
    select next_val+1 into v_id from foo_seq;
    set new.foo_id = v_id;
    update foo_seq set next_val = v_id;
end#

delimiter ;
统计数据:

考虑到有200万行,性能相当好


希望这有帮助:

MyISAM还是InnoDB?主键和选择有什么关系?还是说聚集索引?表中哪些列是唯一的?明智的密钥选择需要基于对数据和业务规则的分析和理解。MyISAM还是InnoDB?主键和选择有什么关系?还是说聚集索引?表中哪些列是唯一的?明智的键选择需要基于对数据和业务规则的分析和理解。是的,我已经在该列上创建了索引。是的,我已经在该列上创建了索引。这是一个很好的解决方案,因为它管理了将聚集索引作为主键的限制。聚集索引非常适合范围查询。这是一个很好的解决方案,因为它可以管理将聚集索引作为主键的限制。聚集索引非常适合范围查询。