Mysql 并行运行多个数据库查询
下面的脚本用于测试以更快的速度克隆数据库的选项 它使用节点js并行运行多个db查询。到目前为止,结果是一样的。似乎一次打开了与服务器的多个连接,但查询仍按顺序执行Mysql 并行运行多个数据库查询,mysql,node.js,Mysql,Node.js,下面的脚本用于测试以更快的速度克隆数据库的选项 它使用节点js并行运行多个db查询。到目前为止,结果是一样的。似乎一次打开了与服务器的多个连接,但查询仍按顺序执行 var mysql = require('mysql') async = require('async'); // get list of tables // var uuid = 'def'; var default_db = 'abc'; var makeConnection = function () { retur
var mysql = require('mysql')
async = require('async');
// get list of tables
//
var uuid = 'def';
var default_db = 'abc';
var makeConnection = function () {
return mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
multipleStatements: true
});
}
makeConnection().query('SHOW TABLES from ' + uuid, function(err, rows, fields) {
if (err) throw err;
var parallel = 5;
var parallels = [], tables = [];
var tables_count_from_zero = rows.length - 1;
var tables_per_parallel = Math.ceil(rows.length / parallel);
var makeQuery = function makeQuery (tables) { // factory function to create the queries
return function doQuery (callback) {
console.log('start');
makeConnection().query('SET foreign_key_checks = 0;' + tables.join(''), function(err, rows, fields) {
if (err) throw err;
console.log('done');
callback(err, null);
});
};
};
var counter = 0;
for (row in rows) {
counter++;
var table_name = rows[row]['Tables_in_nilead'];
tables.push('CREATE TABLE IF NOT EXISTS ' + uuid + '.' + table_name + ' LIKE ' + default_db + '.' + table_name + ';');
tables.push('INSERT ' + uuid + '.' + table_name + ' SELECT * FROM ' + default_db + '.' + table_name + ';');
if (counter >= tables_per_parallel || row >= tables_count_from_zero) {
counter = 0;
parallels.push(makeQuery(tables));
tables = [];
console.log('pushed ok');
}
}
var initTimer = Date.now();
async.parallel(parallels,
// optional callback
function(err, results) {
console.log('Done ' + results + ' at: ' + (Date.now() - initTimer));
// the results array will equal ['one','two'] even though
// the second function had a shorter timeout.
}
);
});
//编辑:更多测试:
将-trx提交时的innodb刷新日志设置为0或2,将其速度提高至少3倍
//编辑以根据请求添加控制台日志结果
如果不存在def.acl_类,则创建表,如
mydb.acl_类;插入def.acl_类从中选择*
mydb.acl_类;如果不存在def.acl_条目,则创建表,如
mydb.acl_条目;插入def.acl_条目从中选择*
mydb.acl_条目;创建表(如果不存在)def.acl_object_标识
比如mydb.acl\u object\u标识;插入def.acl_对象_标识
从mydb.acl\u object\u标识中选择*;如果不存在,则创建表
def.acl_对象_标识_祖先喜欢
mydb.acl\u对象\u标识\u祖先;插入
def.acl\u对象\u标识\u祖先选择*自
mydb.acl\u对象\u标识\u祖先;如果不存在,则创建表
def.acl_security_标识,如mydb.acl_security_标识;插入
def.acl_security_identies从中选择*
mydb.acl_安全性_身份;如果不存在,则创建表
def.association,比如mydb.association;插入def.association选择*
来自mydb.association;如果不存在定义关联类型,则创建表
如mydb.association_类型;插入def.association_type从中选择*
mydb.association_类型;如果不存在def.cart LIKE,则创建表
mydb.cart;从mydb.cart插入def.cart SELECT*;如果不是,则创建表
存在类似mydb.cart\u项目的def.cart\u项目;插入def.cart_项目选择*
来自mydb.cart\u项目;如果不存在,则创建表def.configuration LIKE
mydb.configuration;插入def.configuration从中选择*
mydb.configuration;如果不存在,则创建表格。联系
如mydb.contact_机制;插入def.contact_机构选择*自
mydb.contact_机制;如果不存在,则创建表
def.contact_mechanism_link,如mydb.contact_mechanism_link;插入
def.contact_mechanism_link选择*自
mydb.contact\u机制\u链接;如果不存在,则创建表
def.触点\机构\用途\类型如
mydb.contact\u mechanism\u purpose\u type;插入
def.contact_mechanism_purpose_type从中选择*
mydb.contact\u mechanism\u purpose\u type;如果不存在,则创建表
def.contact_mechanism_类型,如mydb.contact_mechanism_类型;插入
def.contact_mechanism_type从中选择*
mydb.contact\u mechanism\u类型;如果def.container不存在,则创建表
比如mydb.container;插入def.container从中选择*
mydb.container;如果不存在def.container_类型,则创建表,如
mydb.container_类型;插入def.container_类型从中选择*
mydb.container_类型;创建表(如果不存在),如def.credit_卡
mydb.信用卡;插入def.credit_卡从中选择*
mydb.信用卡;创建表(如果不存在),如def.currency
mydb.currency;从mydb.currency插入def.currency SELECT*
开始
创建表(如果不存在)定义折扣\价格\组件
mydb.折扣价格组件;插入定义折扣价格组件
从mydb.discount\u price\u组件中选择*;如果不存在,则创建表
def.domain类似于mydb.domain;插入def.domain选择*自
mydb.domain;如果不存在,则创建表def.facility LIKE
mydb.facility;从mydb.facility插入def.facility SELECT*;创造
表(如果不存在)定义.geo_边界,如mydb.geo_边界;插入
def.geo_边界从mydb.geo_边界中选择*;如果不是,则创建表
存在def.geo_boundary_关联,如
mydb.geo_边界协会;插入def.geo_boundary_关联
从mydb.geo_boundary_关联中选择*;如果不存在,则创建表
像mydb.group这样的def.group;插入def.group从中选择*
mydb.group;如果不存在像mydb.guide这样的def.guide,则创建表;插入
def.guide从mydb.guide中选择*;如果不存在,则创建表
def.guide_项,如mydb.guide_项;插入def.guide_项目选择*
来自mydb.guide_项目;如果不存在def.image LIKE,则创建表
mydb.image;插入def.image从mydb.image中选择*;如果需要,请创建表
不存在与mydb.inventory\u项目类似的def.inventory\u项目;插入
def.inventory_item从mydb.inventory_item中选择*;如果需要,请创建表
不存在定义库存项目调整,如
mydb.库存\项目\调整;插入定义库存项目调整
从mydb.inventory\u item\u adjustment中选择*;如果不是,则创建表
存在定义库存\项目\差异,如
mydb.存货\项目\差异;插入定义库存项目差异选择
*来自mydb.库存\项目\差异;如果不存在,则创建表定义库存\项目\差异\原因,如
mydb.库存\项目\差异\原因;插入
定义库存\项目\差异\原因选择*自
mydb.库存\项目\差异\原因;如果不存在,则创建表
定义发票,如mydb.invoice;插入def.invoice选择*自
mydb.invoice;
创建表(如果不存在)定义发票地址,如
mydb.invoice\u地址;插入定义发票地址选择*自
mydb.invoice\u地址;创建表格(如果不存在)定义发票项目,如
mydb.invoice_项目;插入def.invoice_项目从中选择*
mydb.invoice_项目;如果不存在,则创建表。类似于def.language
mydb.language;从mydb.language插入def.language SELECT*;创造
表(如果不存在)定义消息,如mydb.message;插入def.message
从mydb.message中选择*
开始
如果不存在,则创建表
def.message_模板,如mydb.message_模板;插入
def.message_模板从mydb.message_模板中选择*;创建表
如果不存在像mydb.navigation这样的def.navigation;插入
def.navigation从mydb.navigation中选择*;如果不是,则创建表
存在类似mydb.option的def.option;插入def.option从中选择*
mydb.option;创建表(如果不存在)定义选项_值,如
mydb.option_值;插入def.option_值选择*自
mydb.option_值;创建表(如果不存在)定义订单
mydb.order;从mydb.order插入def.order SELECT*;如果需要,请创建表
不存在像mydb.order\u地址那样的def.order\u地址;插入
def.order_address从mydb.order_address中选择*;如果不是,则创建表
存在定义订单调整,如mydb订单调整;插入
def.order_adjustment从mydb.order_adjustment中选择*;创建表
如果不存在类似mydb.order_项目的def.order_项目;插入
def.order_项目从mydb.order_项目中选择*;如果不是,则创建表
存在与mydb.order\u item\u地址类似的def.order\u item\u地址;插入
def.order_item_address从mydb.order_item_address中选择*;创造
表(如果不存在)定义订单项目角色
mydb.order\u item\u角色;插入def.order\u item\u角色选择*自
mydb.order\u item\u角色;如果不存在,则创建表def.order_角色,如
mydb.order_角色;插入def.order_角色选择*自
mydb.order_角色;如果不存在,则创建表def.page LIKE
mydb.page;插入def.page从mydb.page中选择*;如果不是,则创建表
存在定义方,如mydb.party;插入def.party选择*自
mydb.party;创建表格(如果不存在)定义方\联系\机制,如
mydb.第三方联系机制;插入def.party\u contact\u机制选择
*来自mydb.party\u contact\u机制;创建表格(如果不存在)定义方\联系\机制\目的类似
mydb.第三方\联系\机制\目的;插入
定义方\联系方式\机构\目的选择*自
mydb.第三方\联系\机制\目的;如果不存在,则创建表
定义与mydb类似的政党关系;插入
def.party_relationship从mydb.party_relationship中选择*;创造
表如果不存在定义方角色(如mydb.party_角色);插入
def.party_角色从mydb.party_角色中选择*;如果不是,则创建表
存在定义方角色类型,如mydb.party角色类型;插入
def.party_role_type从mydb.party_role_type中选择*
开始
如果不存在类似mydb.payment的def.payment,则创建表;插入def.payment
从mydb.payment中选择*;如果不存在,则创建表def.payment_log
比如mydb.payment_log;插入def.payment_log选择*自
mydb.payment_log;如果不存在,则创建表def.payment_方法,如
mydb.付款方式;插入def.payment_方法选择*自
mydb.付款方式;如果不存在def.post LIKE,则创建表
mydb.post;从mydb.post插入def.post选择*;如果不是,则创建表
存在定义产品,如mydb.product;插入def.product SELECT*自
mydb.product;如果不存在def.product_图像,则创建表
mydb.product_图像;插入def.product_图像从中选择*
mydb.product_图像;如果不存在,则创建表def.product_选项,如
mydb.product_选项;插入def.product_选项从中选择*
mydb.product_选项;如果不存在def.product_属性,则创建表
如mydb.product_属性;插入def.product_属性选择*自
mydb.product_财产;如果不存在定义产品分类单元,则创建表
如mydb.product_分类单元;插入def.product_分类单元选择*自
mydb.product_分类单元;创建表(如果不存在),如def.property
mydb.property;从mydb.property插入def.property SELECT*;创造
如果不存在类似mydb.seo的def.seo表;插入def.seo从中选择*
mydb.seo;如果不存在,则创建表def.shipping LIKE
mydb.装运;从mydb.Shipping插入def.Shipping选择*;创造
表(如果不存在)定义装运地址,如
mydb.u地址;插入定义装运地址选择*自
mydb.u地址;创建表格(如果不存在)定义装运项目
如mydb.Shipping_项目;插入def.shipping_项目选择*自
mydb.Shipping_项目;如果不存在,则创建表
定义装运物品库存物品
mydb.Shipping_item_inventory_item;插入
def.shipping_item_inventory_item从中选择*
mydb.Shipping_item_inventory_item;如果不存在,则创建表
定义装运类别,如mydb装运类别;插入
def.shipping_category从mydb.shipping_category中选择*;创造
表(如果不存在)def.shipping_方法,如
mydb.shipping_方法;插入def.shipping_方法选择*自
mydb.shipping_方法;如果不存在,则创建表
def.shipping_method_规则,如mydb.shipping_method_规则;插入
def.shipping_method_rule从mydb.shipping_method_rule中选择*
开始
创建表格(如果不存在)定义装运方法类别,如
mydb.shipping_方法_类别;插入
def.shipping_methods_categories从中选择*
mydb.shipping_方法_类别;如果不存在,则创建表
定义装运方法区域,如mydb装运方法区域;插入
def.shipping_methods_zones从中选择*
mydb.shipping_方法_区域;如果不存在,则创建表
def.store_设置,如mydb.store_设置;插入def.store_设置
从mydb.store_设置中选择*;如果不存在,则创建表
def.tax_类别,如mydb.tax_类别;插入def.tax_类别选择
*来自mydb.tax_类别;如果不存在定义税率(如mydb.tax_rate)的表格,则创建该表格;插入定义税率从mydb.tax税率中选择*;创造
表(如果不存在)定义分类单元,如mydb分类单元;插入def.taxon选择
*来自mydb分类单元;如果不存在像mydb.theme这样的def.theme,则创建表;插入def.theme从mydb.theme中选择*;如果需要,请创建表
不存在def.unit of_度量值,如
mydb.计量单位;插入def.unit of_measurement选择*自
mydb.计量单位;如果不存在,则创建表
def.计量单位换算
mydb.测量单位单位换算;插入
def.unit of_measurement_conversion从中选择*
mydb.测量单位单位换算;如果不存在,则创建表
def.user,比如mydb.user;从mydb.user插入def.user SELECT*;创造
表(如果不存在)定义用户组(如mydb.user组);插入
def.user_组从mydb.user_组中选择*;如果不是,则创建表
存在定义变量,如mydb.variant;插入def.variant SELECT*FROM
mydb.variant;创建表格(如果不存在)def.variant_图像
mydb.variant_图像;插入def.variant_图像从中选择*
mydb.variant_图像;创建表格(如果不存在)定义变量选项值
如mydb.variant_option_值;插入定义变量选项值选择
*从mydb.variant_option_值;如果不存在定义变量价格组件(如mydb.variant价格组件),则创建表;插入
def.variant_price_组件选择*自
mydb.variant_价格_组件
你能在console.log'start'之后添加console.logtables.join并粘贴console输出吗?@LucioM.Tato当然,我为你编辑了添加。看起来像是创建表。。。。花费的时间最长,所有这些表花费了我50多秒。如果您使用var parallel=1;,它还需要50多秒?@LucioM.Tato是的,Lucio也需要同样的时间