前天去面試,被問到了一個和mysql相關的問題,c/c++調用mysql的時候,是同步的還是非同步的?如果結果集很大,如何處理。我想問的是MYSQL有非阻塞的API嗎?
因為我以前用過mysql c++ connector ,我回答的是,c++與mysql的交互是同步的,在沒有獲取結果集之前,我們的程序沒法處理結果集。所以他問了一個如果結果集很大,查詢需要的時間很長,那你的程序不是阻塞在那裡了嗎?你有什麼辦法來解決這個問題。我說這個東西,就不是C/C++的問題了,我們可以在寫sql的時候對結果集做限制,如果應用用到的結果集就是一個巨大的結果集,那我不知道有什麼方法。我的意思是,如果我們沒有獲取結果集,那麼我們的後續的對結果集的處理也就無從做起了。結果面試的很不好,回來之後我在想,也許他想要的答案可能是使用非阻塞的方式調用mysql,然後通過傳入回調函數來處理。於是我google了一下,但是沒有找到mysql非阻塞模式調用的文章。請問,mysql有非阻塞調用的API嗎?
沒有聽說過訪問資料庫不採用堵塞的模式,否則就可能導致執行順序亂了~~~
」c/c++調用mysql的時候,是同步的還是非同步的「--這個應該是可以非同步方式調用,然後去做其他事情,所以一般是盡量讓事務小,或者說非事務相關的不會放一塊執行~但是創建資料庫的連接線程肯定是阻塞的,否則就可能亂來~~
2008 年這裡有一篇文章在 C Level 實現 MySQL Client 的非同步 API,~jk - Async MySQL Queries with C-API
但事實上,MySQL 的非同步意義是不大的,上層結構(HTTP / Net I/O)非同步,可以提高並發,而 MySQL 作為 DB 來講,是最後一層防線,它阻塞就應該阻塞了,不需要非同步。如果同步請求時候出現 Server IO 阻塞,那麼非同步時候 Server 一樣會阻塞,大家都在等待,並發量看上去提高了,但是 wait 時間提高了很多。
瓶頸如果存在,不是單單靠非同步可以解決的。在svr和db之間增加一層proxy,svr和proxy的通信是非同步的,就不會阻塞svr的運行。
挖墳~在mysql上面自己再封一層io server。可以保證對外類似於非同步的效果。使用非同步的好處在於對外而言服務比較好設計。比如如果一個線程需要服務多個用戶,總不能因為單個用戶查詢結果很大就阻塞其他用戶的操作。對於單個用戶而言速度不一定提升,但整體服務的吞吐會上去。當然如果是一個線程服務一個用戶那就沒必要了。
MySQL driver有就有,沒有的話那你說就寫個多線程去訪問不就非同步了,有時候面試官就亂問問題
把資料庫當作一個大磁碟
客戶端處理結果集的方式有兩種。一種方式是,通過調用mysql_store_result(),一次性地檢索整個結果集。該函數能從伺服器獲得查詢返回的所有行,並將它們保存在客戶端。第二種方式是針對客戶端的,通過調用mysql_use_result(),對「按行」結果集檢索進行初始化處理。該函數能初始化檢索結果,但不能從伺服器獲得任何實際行。
多線程加鎖
推薦閱讀:
※MySQL刪除大量數據的一些建議
※這句sql語句怎麼理解?
※國內做分散式資料庫開發的現狀如何,有怎樣的發展前景?
※GitHub 的 MySQL 基礎架構自動化測試