[每日一答] [20151017] MySQL 使用 MRG_MyISAM 存储引擎来实现分表



MRG_MyISAM存储引擎为MySQL的其中一个存储引擎,使用下面语句察看MYSQL数据库是否支持该存储引擎。


MERGE存储引擎,也被认识为MRG_MyISAM引擎,是一个相同的可以被当作一个来用的MyISAM表的集合。“相同”意味着所有表同样的列和索引信息。你不能合并列被以不同顺序列于其中的表,没有恰好同样列的表,或有不同顺序索引的表。而且,任何或者所有的表可以用myisampack来压缩的.

当你创建一个MERGE表之时,MySQL在磁盘上创建两个文件。文件名以表的名字开始,并且有一个扩展名来指明文件类型。一个.frm文件存储表定义,一个.MRG文件包含被当作一个来用的表的名字。这些表作为MERGE表自身,不必要在同一个数据库中。

你可以对表的集合用SELECT, DELETE, UPDATE和INSERT。你必须对你映射到一个MERGE表的这些表有SELECT, UPDATE和DELETE 的权限。

如果你DROP MERGE表,你仅在移除MERGE规格。底层表没有受影响。

当你创建一个MERGE表之时,你必须指定一个UNION=(list-of-tables)子句,它说明你要把哪些表当作一个来用。如果你想要对 MERGE表的插入发生在UNION列表中的第一个或最后一个表上,你可以选择地指定一个INSERT_METHOD选项。使用FIRST或LAST值使得插入被相应地做在第一或最后一个表上。如果你没有指定INSERT_METHOD选项,或你用一个NO值指定该选项。往MERGE表插入记录的试图导致错误。


使用案例:

CREATE TABLE IF NOT EXISTS `table1` (  
`id` int(11) NOT NULL AUTO_INCREMENT,  
`name` varchar(50) DEFAULT NULL,  
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
  
CREATE TABLE IF NOT EXISTS `table2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
  
INSERT INTO `table1` (`name`) VALUES('name1');
  
INSERT INTO `table2` (`name`) VALUES('name2');

CREATE TABLE IF NOT EXISTS `uTable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
INDEX(id)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 UNION=(table1,table2) INSERT_METHOD=LAST AUTO_INCREMENT=1;

select id,name from uTable;
+----+--------+
| id | name   |
+----+--------+
|  1 | name1  |
|  1 | name2  |
+----+--------+
2 rows in set (0.00 sec)

mysql> INSERT INTO `uTable` (`name`) VALUES('name3');
  
mysql> select id, name from table2  
 -> ;  
+----+-------+
| id | name  |
+----+-------+
|  1 | name2 |
|  2 | name3 |
+----+-------+
2 rows in set (0.00 sec)


MRG_MyISAM存储引擎为MySQL的其中一个存储引擎,使用下面语句察看MYSQL数据库是否支持该存储引擎。


MERGE存储引擎,也被认识为MRG_MyISAM引擎,是一个相同的可以被当作一个来用的MyISAM表的集合。“相同”意味着所有表同样的列和索引信息。你不能合并列被以不同顺序列于其中的表,没有恰好同样列的表,或有不同顺序索引的表。而且,任何或者所有的表可以用myisampack来压缩的.

当你创建一个MERGE表之时,MySQL在磁盘上创建两个文件。文件名以表的名字开始,并且有一个扩展名来指明文件类型。一个.frm文件存储表定义,一个.MRG文件包含被当作一个来用的表的名字。这些表作为MERGE表自身,不必要在同一个数据库中。

你可以对表的集合用SELECT, DELETE, UPDATE和INSERT。你必须对你映射到一个MERGE表的这些表有SELECT, UPDATE和DELETE 的权限。

如果你DROP MERGE表,你仅在移除MERGE规格。底层表没有受影响。

当你创建一个MERGE表之时,你必须指定一个UNION=(list-of-tables)子句,它说明你要把哪些表当作一个来用。如果你想要对 MERGE表的插入发生在UNION列表中的第一个或最后一个表上,你可以选择地指定一个INSERT_METHOD选项。使用FIRST或LAST值使得插入被相应地做在第一或最后一个表上。如果你没有指定INSERT_METHOD选项,或你用一个NO值指定该选项。往MERGE表插入记录的试图导致错误。


使用案例:

CREATE TABLE IF NOT EXISTS `table1` (  
`id` int(11) NOT NULL AUTO_INCREMENT,  
`name` varchar(50) DEFAULT NULL,  
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
  
CREATE TABLE IF NOT EXISTS `table2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
  
INSERT INTO `table1` (`name`) VALUES('name1');
  
INSERT INTO `table2` (`name`) VALUES('name2');

CREATE TABLE IF NOT EXISTS `uTable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
INDEX(id)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 UNION=(table1,table2) INSERT_METHOD=LAST AUTO_INCREMENT=1;

select id,name from uTable;
+----+--------+
| id | name   |
+----+--------+
|  1 | name1  |
|  1 | name2  |
+----+--------+
2 rows in set (0.00 sec)

mysql> INSERT INTO `uTable` (`name`) VALUES('name3');
  
mysql> select id, name from table2  
 -> ;  
+----+-------+
| id | name  |
+----+-------+
|  1 | name2 |
|  2 | name3 |
+----+-------+
2 rows in set (0.00 sec)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自适应 Dropout 方法可以根据网络的不同层次和输入数据的特征,动态调整 Dropout 概率值,从而提高模型的泛化能力。在 Theano 框架中,可以通过以下代码实现使用自适应 Dropout 方法来动态调整 VGG 网络的 Dropout 概率值: ```python import theano import theano.tensor as T from theano.sandbox.rng_mrg import MRG_RandomStreams def dropout(input, p, rng): srng = MRG_RandomStreams(rng.randint(999999)) mask = srng.binomial(n=1, p=1-p, size=input.shape, dtype=theano.config.floatX) output = input * mask return output def adaptive_dropout(input, p, rng): p = 0.5 * p if input.ndim == 4: input_shape = input.shape input = T.flatten(input, 2) mean = T.mean(input, axis=1, keepdims=True) var = T.var(input, axis=1, keepdims=True) alpha = theano.shared(np.ones((input_shape[1], 1), dtype=theano.config.floatX)) rho = theano.shared(np.ones((input_shape[1], 1), dtype=theano.config.floatX)) alpha_new = T.nnet.sigmoid(T.dot(alpha, T.log(1+T.exp(rho*(var-mean**2)/mean**2)))) p_new = 1 - alpha_new output = dropout(input, p_new, rng) output_shape = (input_shape[0], input_shape[1], input_shape[2], input_shape[3]) output = T.reshape(output, output_shape) return output else: return dropout(input, p, rng) ``` 其中,`dropout` 函数实现了标准的 Dropout 方法;`adaptive_dropout` 函数实现了自适应 Dropout 方法。在自适应 Dropout 方法中,首先将 Dropout 概率值减半,然后计算输入数据在每个通道上的均值和方差,并通过一个神经网络计算每个通道的 `alpha` 值。最后,根据 `alpha` 值计算新的 Dropout 概率值,然后应用 Dropout。 在 VGG 网络中使用自适应 Dropout 方法,可以在每个卷积层和全连接层后添加一个自适应 Dropout 层,如下所示: ```python import numpy as np import lasagne def build_vgg(input_var=None): network = lasagne.layers.InputLayer(shape=(None, 3, 224, 224), input_var=input_var) network = lasagne.layers.Conv2DLayer(network, num_filters=64, filter_size=(3, 3), pad=1, flip_filters=False) network = adaptive_dropout(network, p=0.3, rng=np.random.RandomState(1234)) network = lasagne.layers.Conv2DLayer(network, num_filters=64, filter_size=(3, 3), pad=1, flip_filters=False) network = adaptive_dropout(network, p=0.3, rng=np.random.RandomState(1234)) network = lasagne.layers.Pool2DLayer(network, pool_size=(2, 2), mode='max') network = lasagne.layers.Conv2DLayer(network, num_filters=128, filter_size=(3, 3), pad=1, flip_filters=False) network = adaptive_dropout(network, p=0.4, rng=np.random.RandomState(1234)) network = lasagne.layers.Conv2DLayer(network, num_filters=128, filter_size=(3, 3), pad=1, flip_filters=False) network = adaptive_dropout(network, p=0.4, rng=np.random.RandomState(1234)) network = lasagne.layers.Pool2DLayer(network, pool_size=(2, 2), mode='max') network = lasagne.layers.Conv2DLayer(network, num_filters=256, filter_size=(3, 3), pad=1, flip_filters=False) network = adaptive_dropout(network, p=0.4, rng=np.random.RandomState(1234)) network = lasagne.layers.Conv2DLayer(network, num_filters=256, filter_size=(3, 3), pad=1, flip_filters=False) network = adaptive_dropout(network, p=0.4, rng=np.random.RandomState(1234)) network = lasagne.layers.Conv2DLayer(network, num_filters=256, filter_size=(3, 3), pad=1, flip_filters=False) network = adaptive_dropout(network, p=0.4, rng=np.random.RandomState(1234)) network = lasagne.layers.Pool2DLayer(network, pool_size=(2, 2), mode='max') network = lasagne.layers.Conv2DLayer(network, num_filters=512, filter_size=(3, 3), pad=1, flip_filters=False) network = adaptive_dropout(network, p=0.4, rng=np.random.RandomState(1234)) network = lasagne.layers.Conv2DLayer(network, num_filters=512, filter_size=(3, 3), pad=1, flip_filters=False) network = adaptive_dropout(network, p=0.4, rng=np.random.RandomState(1234)) network = lasagne.layers.Conv2DLayer(network, num_filters=512, filter_size=(3, 3), pad=1, flip_filters=False) network = adaptive_dropout(network, p=0.4, rng=np.random.RandomState(1234)) network = lasagne.layers.Pool2DLayer(network, pool_size=(2, 2), mode='max') network = lasagne.layers.Conv2DLayer(network, num_filters=512, filter_size=(3, 3), pad=1, flip_filters=False) network = adaptive_dropout(network, p=0.4, rng=np.random.RandomState(1234)) network = lasagne.layers.Conv2DLayer(network, num_filters=512, filter_size=(3, 3), pad=1, flip_filters=False) network = adaptive_dropout(network, p=0.4, rng=np.random.RandomState(1234)) network = lasagne.layers.Conv2DLayer(network, num_filters=512, filter_size=(3, 3), pad=1, flip_filters=False) network = adaptive_dropout(network, p=0.4, rng=np.random.RandomState(1234)) network = lasagne.layers.Pool2DLayer(network, pool_size=(2, 2), mode='max') network = lasagne.layers.DenseLayer(network, num_units=4096) network = adaptive_dropout(network, p=0.5, rng=np.random.RandomState(1234)) network = lasagne.layers.DenseLayer(network, num_units=4096) network = adaptive_dropout(network, p=0.5, rng=np.random.RandomState(1234)) network = lasagne.layers.DenseLayer(network, num_units=1000, nonlinearity=lasagne.nonlinearities.softmax) return network ``` 其中,`adaptive_dropout` 函数的参数 `p` 表示初始的 Dropout 概率值,`rng` 表示随机数生成器。在 VGG 网络中,每个卷积层和全连接层后添加一个自适应 Dropout 层,并根据不同层次的特征动态调整 Dropout 概率值。这样可以提高模型的泛化能力,防止过拟合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值