在 P2P 應用中,節點數動輒上萬且頻繁變動,查詢與插入效能至關重要。以下是實測有效的三大優化技巧。
原理:預先構建查詢語法樹,執行時跳過解析優化階段,顯著提升高頻固定模式查詢效能。
適用場景:查詢條件固定、極高頻執行的插入/查詢操作。
MYSQL_STMT,調用 mysql_stmt_prepare() 預編譯 SQL,佔位符 ? 對應參數MYSQL_BIND 結構數組,指定類型、緩衝區、長度等mysql_stmt_execute() 執行// 1. 準備語句
MYSQL_STMT *stmt = mysql_stmt_init(conn);
char *sql = "INSERT INTO HostCache(SessionID, ChannelID, ISPType, ExternalIP, ExternalPort, InternalIP, InternalPort) VALUES (?,?,?,?,?,?,?)";
mysql_stmt_prepare(stmt, sql, strlen(sql));
// 2. 綁定參數
MYSQL_BIND bind[7];
memset(bind, 0, sizeof(bind));
// 依次設置 bind[0]~bind[6] 的 buffer_type, buffer, length, is_null
mysql_stmt_bind_param(stmt, bind);
// 3. 執行插入
strcpy(param.sessionid, sessionid);
// ... 填充其他字段
mysql_stmt_execute(stmt);
痛點:傳統 ORDER BY RAND() 需全表掃描排序,十萬條記錄查詢 140ms + 獲取結果集 500ms。
SELECT COUNT(*) FROM table WHERE ...LIMIT offset, count 直接定位抽取int total = get_total_count(); // 第一次查詢
int need = min(total, TARGET_COUNT);
int quotient = total / need;
int remainder = total % need;
int start = rand() % (remainder + 1);
for (int i = 0; i < need; i++) {
int pos = start + quotient * i;
mysql_data_seek(result, pos);
row = mysql_fetch_row(result);
// 處理行數據
}
效果:雖查詢兩次,但大數據量下反而更高效,避免了全量排序與結果集傳輸開銷。
配合 mysql_data_seek() 直接定位行偏移,避免逐行 mysql_fetch_row() 的順序掃描開銷,適合大結果集分頁場景。
| 方法 | 適用場景 | 核心優勢 |
|---|---|---|
| Prepared Statement | 高頻固定模式 SQL | 消除重複解析,防注入,參數化執行 |
| LIMIT 隨機抽樣 | 統計分析、大表抽樣 | 避免 ORDER BY RAND() 全表排序 |
| 游標定位分頁 | 大結果集分頁顯示 | O(1) 定位,避免深分頁性能退化 |