[英]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.