Mysql的版本和存儲引擎較多,為了選擇最適合業務使用的系統,需要進行一定的驗證,本文描述mysql的驗證過程和思路。
主要涉及:
Mysql的版本
v Mariadb
v Tokudb
v Oracle
具體的存儲引擎
v Myisam
v Innodb
v TokuDB
v Maria
如下是具體的思路
log-bin=mysql-bin 關閉,不要寫日志
skip-networking 開啟
v mariadb5.5
v Oracle
v Tokudb
如上目錄下有對應的安裝,卸載腳本
具體步驟如下:
1.首先停止mysql服務
a) service mysql stop / service mysqld stop
b) killall -9 mysql | killal -9 mysqld
c) /etc/profile中不要有mysql的環境變量設置
2.安裝引擎
a) 以上的各個對應目錄有安裝的腳本
3.檢驗
a) 進入對應的安裝目錄下的bin目錄
b) ./mysql -uroot -p123456 檢查安裝的版本信息是否正確
c) show engines; show plugins; 可以查看引擎的安裝情況
4.運行單元測試驗證各個引擎的性能
包括
v 迭代次數
v 存儲包的大小:數據字段可設置大小
###是具體的業務表
static void insertOneSession(int count, int size, bool canTruncate = true){
### item = createItem(size);
cppdb::session session;
static const std::string sql =
"insert into `###`) \
VALUES ( ?, FROM_UNIXTIME(?), ?, ?, ?, ?, ?, \
INET_ATON(?), ?, ?, ?, ?, ?, \
?, ?, ?)";
{
try {
session = cppdb::session(::common::base::BaseData::dbConnectString);
cppdb::statement stmt;
if (canTruncate) {
const static string ready = "TRUNCATE table ***";
stmt = session.prepare(ready);
stmt.exec();
}
stmt = session.prepare(sql);
for (int i = 0; i < count; i++) {
stmt.reset();
stmt.bind(###);
...
stmt.exec();
}
} catch (std::exception const &e) {
LOG(ERROR)<< "saveDB:" << e.what();
}
// //關閉鏈接
if (session.is_open())
session.close();
}
{
//統計出表空間
session =
cppdb::session(
"mysql:user=root;password=123456;database=mysql;set_charset_name=utf8; @pool_size=1");
cppdb::statement stmt =
session.create_statement(
"select table_name,engine,ROUND(data_length/1024,2) size,table_rows from information_schema.tables where table_schema='###' and table_name='traffic'");
cppdb::result r = stmt.query();
while(r.next()){
string table_name, engine;
long size, table_rows;
r.fetch(table_name);
r.fetch(engine);
r.fetch(size);
r.fetch(table_rows);
LOG(INFO) <<"TableInfo::" << table_name << " " << engine <<" " << size << " "<<table_rows;
}
if (session.is_open())
session.close();
}
}
class benchMyisamTest: public testing::Test {
public:
static void SetUpTestCase() {
//建立對應的表結構
std::string mysql = "/usr/local/mysql/bin/mysql --default-character-set=utf8 -uroot -p123456 -D mysql -e \"source myisam.sql\"";
system(mysql.c_str());
}
static void TearDownTestCase() {
}
};
TEST_F(benchMyisamTest, 1w100) {
insertOneSession(10000, 100);
}
TEST_F(benchMyisamTest, 1w1000) {
insertOneSession(10000, 1000);
}
....
#include <mysql.h>
//多個工作線程的處理
int thread_Num, thread_Size;
void worker(){
insertOneSession(thread_Num, thread_Size);
}
void workerThread(int ts, int count, int size){
//多線程模式下必須使用,否則mysql client庫無法連接錯誤111
mysql_library_init(0, NULL, NULL);
thread_Num = count;
thread_Size = size;
boost::thread_group threads;
for (int i = 0; i < ts; ++i){
threads.create_thread(&worker);
}
threads.join_all();
LOG(INFO) << "done";
//這個錯誤好像是libmysqlclient的兼容問題 Error in my_thread_global_end(): 4 threads didn't exit
mysql_library_end();
}
TEST_F(benchMyisamTest, thread_1w100) {
workerThread(2, 10000, 100);
}
TEST_F(benchMyisamTest, thread_30w) {
workerThread(3, 100000, 1000);
}
..
和如何類似,你可以寫出你自己的測試引擎
如下只是我用的虛擬機平台的結果,不代表普適性
http://pan.baidu.com/s/1sj0cI8t 是具體的一些安裝和配置不同的數據庫腳本