前言
作為乙個開發,避免不了和資料庫打交道,尤其是 mysql。往往只會用,但是沒有去**其 一條 sql 語句具體是怎麼樣去實現的,以及 mysql 的基礎架構,接下來將記錄在學習mysql 中的一些要點。
mysql 基礎架構
mysql 主要分為 server 層 和 儲存引擎層。
server 層主要聯結器、查詢快取、分析器、優化器、執行器等
儲存引擎
從 mysql 5.5.5版本 開始預設使用 innodb 引擎。
聯結器
mysql -h$ip -p$port -u$user -p
可以將密碼直接敲上去,但是在生產環境中還是不建議這樣,採用上邊互動的方式輸入密碼,比較安全。
可以使用 show processlist 來檢視資料庫的連線狀態。
其中 command 為 sleep 的表示其為空閒連線。
如果客戶端太長時間沒有動靜,聯結器就會自動將其斷開,這個時間由引數 **wait_timeout
** 來空值,預設是 8 小時。
在之前一次專案開發中,由於資料來源配置引數不對,導致與資料庫的連線一直空閒沒有釋放,但是mysql服務端因為預設8小時已經斷開此連線,當後端客戶端再次請求時,以為這個連線還沒斷開,再次請求就會發現沒有響應的情況。
在於資料庫互動的時候,我們通常都會使用資料來源,例如 c3p0,dbcp,druid 等,以及現在 springboot 2.x 預設的 hikaricp等,是因為與資料庫建立鏈結是乙個十分耗費資源的事情。但是每次查詢都要建立一次長鏈結,那麼mysql很快就會oom。
所以要使用資料來源連線池,其實現了:
查詢快取
建議不要使用此功能
如果非要使用,可以在 sql 語句中新增:
mysql> select sql_cache * from table_name;
分析器
分析器就負責分析你的語句是否有語法錯誤
優化器確定sql語句的優化方案,並確定使用哪個索引。
執行器開始執行語句,但是在執行之前會校驗你的許可權。
如果表 t 中沒有字段 k,而你執行了這個語句 select * from t where k=1, 那肯定是會報「不存在這個列」的錯誤: 「unknown column 『k』 in 『where clause』」。你覺得這個錯誤是在我們上面提到的哪個階段報出來的呢?
分析器,在分析階段,會判斷語法是否正確以及表是否存在,列是否存在。
mysql隨機查一條
mysql select rand rand 0.048264377795406 1 row in set 0.00 sec mysql select rand rand 0.557701361885016 1 row in set 0.00 sec mysql select rand rand 0...
mysql基礎 一條請求執行多條SQL語句
最近做乙個 資料庫初始化工具的時候發現了這個問題,就是在乙個statement中執行一條sql語句的時候可以正確執行,如果同時執行多條,就會報sql語法錯誤,傷透了腦筋。經過網上查詢,發現有兩種解決辦法 1 最簡單的辦法,在mysql的連線字串中設定allowmultiqueries引數置為true...
SQL查詢當前資料以及上一條和下一條三條記錄
想查詢某個表當前資料以及上一條和下一條的記錄,網上找了一下解決辦法都不如意,按網上的方法可以查詢出三條資料,但是當查詢的這條資料沒有上一條或下一條記錄時就不行了。現在我把解決問題的sql語句放上 理一下思路,明確的查詢三條語句 select from 表名 where id in 當前id的前乙個i...