MySQL数据库优化和性能: 2 tables or 3 tables?

标签 mysql performance foreign-keys innodb split

这里有两个表:

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 以及有关订单的更多信息,这些信息可能位于第三个单独的表中。拆分表 order 是否有意义,以便表 #2 包含 orderid 和 memberid,第三个表包含 orderid、Time、info1 和 info2?

在大多数情况下,当查询按 orderid 选择信息时,它还会通过检查“WHERE memberid='abcde'”来双重检查信息是否适用于正确的用户。因此,只有 1 位用户可以看到他的订单中的信息,其他人则看不到。因此,我希望在同一个表 orders 中保留几个附加列 Time、info1、info2 (以及更多有关订单的列)是可以的(否则我必须无论如何,在查询中使用 JOIN 来双重检查 memberid ,尽管表被拆分,但查询变得更加复杂)。什么对性能最好:拆分表与使用更简单的查询?

顺便说一句,我是否根据性能角色和常识正确创建了这两个表(我问的是主键和外键)? 你推荐使用 INNODB 而不是 MYISAM 吗?如果是,我应该对数据库中的所有表使用 ENGINE = INNODB 而不是 ENGINE = MYISAM 吗?

谢谢。

最佳答案

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

请勿出于性能原因破坏表格布局。很可能还有其他方法来解决性能问题 - 当您遇到一种方法时......

出于某些原因,我可以想到它的意义所在,即如果您需要 FULLTEXT-Index某些列仅适用于 MyISAM 引擎。在这里,拆分表以分隔具有所需全文索引的列是有意义的。

关于MySQL数据库优化和性能: 2 tables or 3 tables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8128267/

相关文章:

Mysql 外键错误 150

mysql - 基于父子关系的 MySQL 的 Talend Open Studio 数据迁移

MySQL 查询中的 PHP 变量

MySQL STR_TO_DATE 以 "0"(零)结尾

mysql - 如何使用一个查询根据相对值更新表列

MySql 查询 3 个不同的表

c++ - 痛苦缓慢的函数调用

django - 如何检索带有外键自身的对象

c# - 在 task.Factory.FromAsync 中包装 WCF 异步调用不返回任何结果

android - Android 提供了哪些自动消除 overdraw 的能力?