我正在构建一个数据库,它要求每行大约60,000字节(非常接近mysql最大行大小,基本上有很多varchar(500)语句[必要])。现在,就我所知,这在神话中是可以的。
但是,由于其行锁定行为,我正在考虑innodb(我对我的表进行了大量更新)。我刚刚遇到一些令人不安的信息,关于innodb不喜欢大行(大约8000字节或者其他东西)。
所以,鉴于我的表每行有大约60,000(!)个字节,这对于innodb来说是个问题吗?这是一个大问题吗?交易破产?你会建议什么?
表: ID(int,autoinc,主键),varchar(500),varchar(500)... repeat ... varchar(500)直到到达表的末尾
答案 0 :(得分:0)
不确定为什么你选择使用120 varchar(500)列,但我认为你最好不要插入行 - 就像这样:
drop table if exists users;
create table users
(
user_id int unsigned not null auto_increment primary key,
username varbinary(32) unique not null,
next_note_id smallint unsigned not null default 0
)
engine=innodb;
drop table if exists user_notes;
create table user_notes
(
user_id int unsigned not null,
note_id smallint unsigned not null,
note varchar(512) not null,
primary key (user_id, note_id) -- clustered composite PK
)
engine=innodb;
delimiter #
create trigger user_notes_before_ins_trig before insert on user_notes
for each row
begin
declare v_id int unsigned default 0;
select next_note_id + 1 into v_id from users where user_id = new.user_id;
set new.note_id = v_id;
update users set next_note_id = v_id where user_id = new.user_id;
end#
delimiter ;
insert into users (username) values ('f00'),('bar');
insert into user_notes (user_id, note) values
(1,'user 1 note 1'), (1,'user 1 note 2'), (1,'user 1 note 3'),
(2,'user 2 note 1');
select * from users;
user_id username next_note_id
======= ======== ============
1 f00 3
2 bar 1
select * from user_notes;
user_id note_id note
======= ======= ====
1 1 user 1 note 1
1 2 user 1 note 2
1 3 user 1 note 3
2 1 user 2 note 1
希望它有所帮助:)
答案 1 :(得分:0)
InnoDB对行大小的限制为64K。它还将行大小限制为页面大小的一半,但不包括varbinary,varchar,blob或text列。默认情况下,InnoDB的页面大小为16K,因此您最终会获得8K的限制。但是你的转换应该没问题,因为你的列是varchar。
但是,如果您不使用InnoDB插件,则使用的行存储格式(“compact”)可能效率低,因为超过768字节的varchar内容存储在补充的16K页面中,而这4个额外的您的案例中的页面(ceil(60/16))可以存储在InnoDB池中的任何位置(如果您的数据集适合InnoDB缓冲池,则不会出现问题)。我会使用InnoDB Plugin的Dynamic row格式。
请注意,大型表的转换需要很长时间。尝试首先在开发计算机上转换备份。