一个网络游戏的数据库,用的是mysql
有2张表 accounttable 和 roletable
accounttable 字段包括:账号编号(主键),账号名称(唯一约束),其他账号信息字段。
roletable 字段包括:账号编号,角色编号(账号编号,角色编号联合起来做为主键),角色名称(唯一约束),其它角色信息字段。
角色表的‘账号编号’在程序逻辑中做为 账号表的‘账号编号’的外键使用,数据库中不建立外键关联。现在由于roletable的数据量达到百万行,总数据量超过30G,为了提高查找和更新的效率,想对roletable拆表,假定按照账号编号拆成10张,账号编号%10==n的记录放在roletable_n中。现在想请问下 对于未拆分之前的roletable,有一个唯一约束的字段‘角色名称’,当拆表后,如何对这10张表的‘角色名称’字段一起建立一个唯一约束?还是说只能通过程序逻辑,在程序中对10张表进行逐个查找来进行判断?
有2张表 accounttable 和 roletable
accounttable 字段包括:账号编号(主键),账号名称(唯一约束),其他账号信息字段。
roletable 字段包括:账号编号,角色编号(账号编号,角色编号联合起来做为主键),角色名称(唯一约束),其它角色信息字段。
角色表的‘账号编号’在程序逻辑中做为 账号表的‘账号编号’的外键使用,数据库中不建立外键关联。现在由于roletable的数据量达到百万行,总数据量超过30G,为了提高查找和更新的效率,想对roletable拆表,假定按照账号编号拆成10张,账号编号%10==n的记录放在roletable_n中。现在想请问下 对于未拆分之前的roletable,有一个唯一约束的字段‘角色名称’,当拆表后,如何对这10张表的‘角色名称’字段一起建立一个唯一约束?还是说只能通过程序逻辑,在程序中对10张表进行逐个查找来进行判断?
用分区表不行吗?
MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
我建了一个测试表:
CREATE TABLE `mytable` (
`nId` int(1) NOT NULL default '0',
`strName` char(10) NOT NULL default '',
PRIMARY KEY (`nId`),
UNIQUE KEY `strName` (`strName`)
) ENGINE=MyISAM
PARTITION BY RANGE (nId%5) (
PARTITION p0 VALUES LESS THAN (1),
PARTITION p1 VALUES LESS THAN (2),
PARTITION p2 VALUES LESS THAN (3),
PARTITION p3 VALUES LESS THAN (4),
PARTITION p4 VALUES LESS THAN (5)
)
报告的错误是:
ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function我想对上表的strName列建立唯一索引 请问应该怎么做?
UNIQUE KEY `strName` (`strName`)
应该是其它列的问题
关于Partitioning Keys, Primary Keys, and Unique Keys的限制在5.1中分区表对唯一约束有明确的规定,每一个唯一约束必须包含在分区表的分区键(也包括主键约束)。
既然如此,那么问题就出来了:
对于下面表,用主键做了分区键,同时其他列即有唯一约束,又不可以包含到分区键的时候,该怎么做呢 :
CREATE TABLE `mytable` (
`nId` int(1) NOT NULL default '0',
`strName` char(10) NOT NULL default '',
PRIMARY KEY (`nId`),
UNIQUE KEY `strName` (`strName`)
)
PS:
我的客户中, 表记录数我一般会在10条记录才拆分的。 除非你的业务中把一些大内容的东西保存在数据里面。那就另当别论了! 还有其他问题,加我QQ群讨论! 群号码博客上有!
再加一张表 会不会反而降低查找和更新的速度呢?
我的表中确实存在10几个BLOB字段
一个表有10几个BLOB的话,我猜测你这些BLOB并不是全部都是一开始就有值的那就是把经常查的,字段“内容”少的放到一个表
把字段内容大的,例如blob这种,分到其他表,甚至多个表中
纵向拆分不太现实
我描述问题的时候没有表达全面说一下:
这些字段的使用频率是一样的。
更新的时候除了主键不更新,其余字段需要一起更新。
查找的时候同样是对某条记录的所有字段一起读取。这是一个C/S架构的项目,S端包括若干 逻辑Server 和 DBServer,逻辑Server需要定时更新数据,比如每隔1分钟,将逻辑Server上的所有数据向MySql保存一次。保存的时候是将逻辑Server上的数据发到DBServer,由DBServer保存。逻辑Server逐条发送,DBServer逐条做Update操作。读取的时候同样是逻辑Server将主键信息数据发到DBServer,DBServer负责查找后发回给逻辑Server。
现在对逻辑Server做大量修改是不太现实的,主要是对DBServer做优化,以及对数据库表结构做优化。所以如果做纵向拆分,可能反而会降低查找的效率,因为需要做连接查询,或者多次查询才能将原先的一条记录读取出来。
那么如果我的DBServer可以达到每分钟更新1W条,即意味着数据库支持逻辑Server同时进行1W条的数据量的运算。所以我希望能够使查询和更新的速度尽可能的快。目前的数据库:
数据库中主要有2张比较大的表(其中一张100W条记录6G,另一张更大100W条记录13G),其它还有5、6张小表(每张100W条记录的数据不超过100MB),这两张大表中均存在十几个blob字段。