Node. js
Warning
SingleStore 9.0 gives you the opportunity to preview, evaluate, and provide feedback on new and upcoming features prior to their general availability. In the interim, SingleStore 8.9 is recommended for production workloads, which can later be upgraded to SingleStore 9.0.
Dependencies
-
mysql npm package: run
npm install mysql
.
Code
const mysql = require('mysql'); // npm install mysqlconst util = require('util');/*** Tweak the following globals to fit your environment* ###################################################*/const HOST = '127.0.0.1';const PORT = 3306;const USER = 'root';const PASSWORD = '';// Specify which database and table to work with.// Note: this database will be dropped at the end of this scriptconst DATABASE = 'test';const TABLE = 'tbl';// The number of workers to runconst NUM_WORKERS = 20;// Run the workload for this many secondsconst WORKLOAD_TIME = 10;// Batch size to useconst BATCH_SIZE = 5000;/*** Internal code starts here* #########################*/let isDone = false;// await-able setTimeout()function timeout(ms) {return new Promise(resolve => setTimeout(resolve, ms));}// Pre-generate the insert queryconst _batch = new Array(BATCH_SIZE).fill().map(_ => '()').join(',');const insertQuery = `INSERT INTO ${TABLE} VALUES ${_batch}`;;function getConnection(dbName) {return new Promise(function(resolve, reject) {const conn = mysql.createConnection({host: HOST,port: PORT,user: USER,password: PASSWORD,database: dbName});conn.connect(err => {if (err) {reject(err);} else {conn.query = util.promisify(conn.query);resolve(conn);}});});};async function setupTestDb() {const conn = await getConnection('information_schema');await conn.query(`CREATE DATABASE IF NOT EXISTS ${DATABASE}`);await conn.query(`USE ${DATABASE}`);await conn.query(`CREATE TABLE IF NOT EXISTS ${TABLE} (id INT AUTO_INCREMENT PRIMARY KEY)`);}async function insertWorker() {const conn = await getConnection(DATABASE);while (true) {// await will process.nextTick()await conn.query(insertQuery);if (isDone) {break;}}}async function warmup() {console.log('Warming up workload');const conn = await getConnection(DATABASE)await conn.query(insertQuery); // FRAGILE: included in count, not included in time}async function doBenchmark() {console.log(`Launching ${NUM_WORKERS} workers for ${WORKLOAD_TIME} sec`);const workers = [];for (let i = 0; i < NUM_WORKERS; ++i) {workers.push(insertWorker());}console.log(`${workers.length} workers running...`);await timeout(WORKLOAD_TIME * 1000);console.log('Stopping workload');isDone = true;await Promise.all(workers);}async function printStats() {const conn = await getConnection(DATABASE);const rows = await conn.query(`SELECT COUNT(*) AS count FROM ${TABLE}`);const count = rows[0].count;console.log(`${count} rows inserted using ${NUM_WORKERS} workers`);console.log(`${count / WORKLOAD_TIME} rows per second`);}async function cleanupTestDb() {console.log('Cleaning up');const conn = await getConnection('information_schema');await conn.query(`DROP DATABASE ${DATABASE}`);}async function main() {try {await setupTestDb();await warmup();await doBenchmark();await printStats();await cleanupTestDb();} catch (err) {console.error('ERROR', err);try {await cleanupTestDb();} catch (err2) {console.error(err2);}process.exit(1);}process.exit(0); // releases all connections}main();
Last modified: May 5, 2023