繁体   English   中英

1张桌子,但两张桌子。 类似于mysql表的磁盘分区

[英]1 table, but two tables. Something like disk partitioning for mysql tables

有没有一种方法可以将一个表分成两部分,或者像硬盘一样进行分区,以便我可以调用

SELECT * FROM email validated

要么

SELECT * FROM email pending

并得到两个不同的结果。 这两个结果均不包含对方的行。

这是什么吗 我感觉好像很早以前就读过某处的mysql分区,我想知道这是否是事实。 如果没有,这是可能的。

MySQL支持称为VIEW的虚拟表。 VIEW实际上是一个存储的MySQL查询,可以将其视为真实表来查询。

使用您提供的示例,您将创建一个称为email的基表,如下所示:

CREATE TABLE `email` (
            `email` VARCHAR(64) NOT NULL,
            `validated` CHAR(1) NOT NULL DEFAULT '0',
            PRIMARY KEY (`email`))
            ENGINE = MyISAM;

然后是两个虚拟表(VIEWS),如下所示:

CREATE VIEW `email_validated` AS SELECT * FROM `email` WHERE `validated`='1';
CREATE VIEW `email_pending` AS SELECT * FROM `email` WHERE `validated`='0';

然后,您可以查询两个视图,就好像它们是实际表一样。

但是,请认识到,使用视图会降低性能,因为只要引用该视图,就会查询整个视图(执行视图的整个select语句)。 在这样一个琐碎的示例中,只要在基表中对“ validated”字段进行索引就不会有什么大不了 但是,在更复杂的视图上,仅尝试检索几行时,将整个视图虚拟表加载到内存中可能没有任何意义。

其他数据库引擎具有称为Materialized View的结构,该结构与MySQL视图相同,不同之处在于,物化视图以在某个频率或触发器下更新的已实现表的形式存在。 可以对实际表执行的任何操作都可以对物化表执行,包括更改索引甚至存储引擎。 使用“存档”存储引擎拥有事务历史记录,同时使用“内存”存储引擎维护汇总汇总表的物化视图,这是完全合理的。 尽管MySQL本身不支持实体化视图,但仍有一些技巧可以模仿实体化视图的行为。

好吧,即使使用分区是可行的,这也是错误的,因为用户最终将验证电子邮件,并且您将不得不将其移动到另一个分区,这是昂贵的操作。

您必须在表中添加列以存储值。 然后,您可以在该列上进行分区,因此,如果您设置了多个服务器,则即使在不同的服务器上,也可以在不同位置进行物理记录,但这没有任何意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM