【问题标题】:MySQL db optimization and performance: 2 tables or 3 tables?MySQL db 优化和性能:2 表还是 3 表?
【发布时间】: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


【解决方案1】:

InnoDB 是 MySQL 最先进的引擎和默认引擎。每次都使用它,除非你有充分的理由在特殊情况下不使用 InnoDB。

不要出于性能原因破坏您的表格布局。很可能还有其他方法可以解决性能问题 - 当你遇到一个时......

有一些原因我可以想到它在哪里有意义,即如果您需要在某些列上使用 FULLTEXT-Index,而该列仅适用于 MyISAM 引擎。在这里,拆分表以使用所需的 FULLTEXT-Index 分隔列是有意义的。

【讨论】:

  • memberid VARCHAR( 20 ) NOT NULL (a primary key) ,- 你的意思是说全文索引吗?这是否意味着 MyISAM 是两个表的选择?谢谢你。其余的在我的桌子上看起来都很好吗?谢谢。
  • 不,你应该同时使用 InnoDB。对于全文索引,我将添加一个链接。
猜你喜欢
  • 2018-01-18
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多