首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

FreeBSD + MySQL 高效能資料庫開發實戰:從選型到 C API 開發

     編輯:MySQL 資料庫相關知識

專案背景與選型動機

股市行情系統需求:1000+ 支股票、每分鐘更新、大量並發查詢。初期採用 Windows NT + SQL Server 6.5 + ODBC + VC++,經大量調優仍難達標。後改用 SQL Server DB-Library 繞過 ODBC,達到 30 次/秒更新、20-30 並發,但成本高、擴展受限。

參考網易 FreeBSD + MySQL 架構,評估 MySQL 具備:

  • 開源免費、符合 SQL92 Entry Level、ODBC Level 0-2
  • POSIX 相容、高效關聯引擎
  • Benchmark 數據顯著優於同級商業資料庫(見下表)

MySQL Benchmark 參考(同機 NT 4.0 環境)

操作MySQLMySQL_ODBCDB2_ODBCInformix_ODBCMS-SQL_ODBCOracle_ODBC
索引讀取 200 萬行367s464s1206s121126s1634s20800s
插入 35 萬行381s619s3460s2692s4012s11291s

※ 測試環境與數據集可能針對 MySQL 優化,但足證其高效潛力。

Windows NT 上 MySQL 安裝與基礎配置

  1. 下載 MySQL-shareware-3.22.32-win.zip,執行 Setup 安裝
  2. 複製 my-example.cnf 為 c:\my.cnf,按需調整
  3. 啟動服務:c:\mysql\bin\mysqld-shareware --standalone
  4. 客戶端連線:c:\mysql\bin\mysql
  5. 安全初始化:
    
    DELETE FROM user WHERE Host='localhost' AND User='';
    mysqladmin reload
    mysqladmin -u root password 'your_password'
    
  6. 設定預設登入(my.cnf [client] 區段加 user=root、password=...)

C API 開發實戰(Visual C++ 6.0)

專案設定

  • 包含目錄:c:\mysql\include(專案選項 /I"c:\mysql\include")
  • 連結庫:c:\mysql\lib\opt\libmysql.lib
  • 執行期:libmysql.dll 複製至 c:\winnt\system32

核心流程代碼範例


#include 
#include 
#include 

int main() {
    MYSQL *conn = mysql_init(NULL);
    if (!conn) { fprintf(stderr, "mysql_init failed\n"); return 1; }

    // 連線
    if (!mysql_real_connect(conn, "localhost", "root", "password", "testdb", 3306, NULL, 0)) {
        fprintf(stderr, "Connect failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    // 建表
    if (mysql_query(conn, "CREATE TABLE mytable (dt DATETIME, s1 CHAR(6), s2 CHAR(11), i1 INT, i2 INT)")) {
        fprintf(stderr, "Create table failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    // 插入
    if (mysql_query(conn, "INSERT INTO mytable VALUES ('2000-03-10 21:01:30', 'Test', 'MySQLTest', 2000, 3)")) {
        fprintf(stderr, "Insert failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    // 查詢
    if (mysql_query(conn, "SELECT * FROM mytable")) {
        fprintf(stderr, "Select failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    MYSQL_RES *res = mysql_store_result(conn);
    int rows = mysql_num_rows(res);
    printf("Query returned %d rows\n", rows);

    MYSQL_FIELD *field;
    char *col_names[25];
    int i = 0;
    while ((field = mysql_fetch_field(res))) {
        col_names[i++] = field->name;
    }

    MYSQL_ROW row;
    while ((row = mysql_fetch_row(res))) {
        for (int k = 0; k < i; k++) {
            printf("%s: %s  ", col_names[k], row[k] ? row[k] : "NULL");
        }
        printf("\n");
    }

    mysql_free_result(res);
    mysql_close(conn);
    return 0;
}

關鍵 API 說明

函式用途
mysql_init()初始化 MYSQL 結構體,傳 NULL 自動分配
mysql_real_connect()建立 TCP 連線,參數:host、user、passwd、db、port、unix_socket、client_flag
mysql_query()執行 SQL(以 \0 結尾),成功返回 0
mysql_store_result()取得完整結果集(SELECT/SHOW/DESCRIBE/EXPLAIN),需配合 mysql_free_result()
mysql_fetch_row()逐行取得記錄,返回字串陣列,NULL 表示結束
mysql_close()關閉連線並釋放資源

實戰成果與總結

  • 達成 每秒 70-100 條行情寫入、50 並發查詢,遠超 SQL Server 方案
  • 開發成本大幅降低(免授權費、VC++ 開發效率高)
  • 穩定性獲 Yahoo、網易、263 等大型站點驗證

遷移至 FreeBSD/Linux 的額外收益

  • 原生 POSIX 環境,MySQL 效能更強(無 Windows 模擬層開銷)
  • 系統穩定性、記憶體管理、網路協議棧優於 Windows NT
  • 免費作業系統 + 免費資料庫 = 極致性價比
  • 易於腳本化運維、自動化部署、容器化遷移

給後人的建議

  1. 選型先跑 Benchmark,結合業務讀寫比例、資料量、並發模型
  2. 繞過 ODBC/JDBC 等中間層,直接用 Native API(C/C++/Go/Rust)榨乾效能
  3. 關鍵路徑:my.cnf 調優(key_buffer、innodb_buffer_pool、query_cache)、索引設計、分表分庫
  4. 監控體系:SHOW STATUS、SHOW PROCESSLIST、慢查詢日誌、Percona Monitoring
  5. 備份策略:mysqldump --single-transaction --master-data=2 + Binlog 增量 + 定期驗證還原
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved