【发布时间】:2011-11-14 21:20:49
【问题描述】:
这里有两张表:
CREATE TABLE `mydatabase`.`members` (
`memberid` VARCHAR( 20 ) NOT NULL ,
`Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
PRIMARY KEY (memberid)
) ENGINE = MYISAM ;
CREATE TABLE `mydatabase`.`orders` (
`orderid` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`memberid` VARCHAR( 20 ),
`Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`info1` VARCHAR( 3200 ) NULL ,
`info2` DECIMAL (6,2) NULL ,
PRIMARY KEY (orderid) ,
FOREIGN KEY (memberid) REFERENCES members(memberid)
) ENGINE = MYISAM;
数据库中有更多表(因此专家对我的问题的回答可能会有所不同)。 我应该将表订单拆分为 2 个表以提高性能吗? 您会看到订单表包含 orderid、memberid 和一些关于订单的更多信息,这些信息可能位于第三个单独的表中。拆分表订单是否有意义,所以表 #2 包含 orderid 和 memberid,第三个表包含 orderid、Time、info1 和 info2?
在大多数情况下,当查询通过 orderid 选择信息时,它还会通过检查“WHERE memberid='abcde'”来仔细检查信息是否适合正确的用户。因此,只有 1 个用户可以从他的订单中看到信息,而其他人则看不到。因此,我希望在同一张表 orders 中保留几个额外的列 Time, info1, info2 (以及更多关于订单的列)是可以的(否则我必须无论如何,在查询中使用 JOIN 来仔细检查 memberid,尽管表被拆分,但查询变得更加复杂)。什么对性能最有利:拆分表 - 与使用更简单的查询?
顺便说一句,我是否根据性能和常识正确地创建了这两个表(我问的是主键和外键)? 你推荐使用 INNODB 代替 MISAM 吗?如果是,我应该在数据库中使用 ENGINE = INNODB 而不是 ENGINE = MISAM for ALL tables?
谢谢。
【问题讨论】:
-
不,您不应该将 member_id 放在单独的表中。
标签: mysql performance foreign-keys innodb split