有没有办法让一个表一分为二,或者像硬盘驱动器一样分区,这样我就可以调用
SELECT * FROM email validated或
SELECT * FROM email pending得到两种不同的结果。两个结果都不包含对方的行。
这是不是。我感觉我很久以前在某处读到过mysql分区,我想知道这是不是就是这样。如果不是,这是可能的。
发布于 2011-09-25 14:49:11
MySQL支持称为VIEW的虚拟表。视图实际上是一个存储的MySQL查询,可以像查询真实表一样对其进行查询。
使用您提供的示例,您将创建一个名为email的基表,如下所示:
CREATE TABLE `email` (
`email` VARCHAR(64) NOT NULL,
`validated` CHAR(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`email`))
ENGINE = MyISAM;然后是两个虚拟表(视图),如下所示:
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视图相同,不同之处在于物化视图是以某个频率或触发器更新的已实现表存在的。可以对真实表执行的任何操作都可以对物化表执行,包括更改索引甚至存储引擎。在使用内存存储引擎维护汇总汇总表物化视图的同时,使用Archive存储引擎拥有事务历史是完全合理的。尽管MySQL本身并不支持实例化视图,但是有一些tricks可以模拟实例化视图的行为。
发布于 2011-09-25 13:49:02
好吧,即使使用分区是可能的,它也是错误的,因为用户最终将验证电子邮件,而您将不得不将其移动到另一个分区,这是昂贵的操作。
您必须在表中添加列,以存储值。然后,您可以在该列上进行分区,因此物理记录将位于不同的位置,如果您设置了多个服务器,甚至在不同的服务器上,但这是没有意义的。
https://stackoverflow.com/questions/7543722
复制相似问题