java開發中的重中之重-------mysql(基礎篇)
- 介紹:
mysql是目前世界上最流行的關係型資料庫,在國內大的網際網路公司都在使用mysql資料庫,mysql經常被我們這樣概述,“mysql是輕量級關係型資料庫”,其實輕量級並不是說mysql是中小型資料庫,在專案開發中,儲存資料的量往往是一個架構問題,如果配合架構,mysql也是可以儲存海量資料的。並且海量資料並沒有一個明確的標準。說mysql是輕量級關係型資料庫,原因是mysql不擅長對海量資料的分析。在一般的網際網路公司海量資料並不常見,因此mysql是中小型公司的最佳選擇。
- mysql的查詢執行過程:在開發中經常用到mysql進行資料查詢,那麼mysql的查詢執行過程是什麼樣的呢?
- 首先連線mysql釋出查詢
- 先去查詢快取中是否有結果集,如果有則直接返回結果集
- 如果沒有結果集,那麼mysql解析查詢將通過優化器生產執行計劃,然後執行執行計劃通過API從儲存引擎獲取資料,並返回給客戶端
- 儲存引擎:下面主要介紹下常用引擎的特性(一共有20多個引擎)
- InnoDB引擎:在mysql5.5版本以後的版本中,InnoDB是mysql的預設引擎,在近幾年的版本更新中,InnoDB一直在持續改進,處理能力不斷提高,下面看一下InnoDB的優勢
- 災難恢復性好
- 支援全部級別的事物(一共四種事物),其中預設事物隔離級別是可重複讀
- 使用行級鎖
- 支援外來鍵
- 支援熱備份
- MyISAM引擎:
- 無事物支援
- 使用的是表級鎖,併發性差
- 主機宕機後,MyISAM表易損壞,災難恢復性不佳
- 只快取索引
以上兩種索引的注意區別:InnoDB讀取資料的速度遠遠小於MyISAM,但是MyISAM的寫入資料遠小於InnoDB
- mysql函式:
- 算數操作符:+ 、-、*、/、DIV(整除)
- 數學函式:
-
- ABS(X):X的絕對值
- CEIL(X):返回不小於X的最小整數值
- FLOOR:返回不大於X的最大整數值
3.字元型別處理函式
-
- CHAR_LENGTH(str):返回值為字串str的長度,長度單位為字元
- LENGTH(str):返回值為字串str的長度,單位為位元組
- CONCAT(str1,str2):返回結果是str1和str2拼接產生的字串
- LEFT(str,len):返回從左邊開始len個字元,相反RIGHT(str,len)
- SUBSTRING(str,pos)、SUBSTRING(str,pos,len):pos是起始字串
- LOWER(str):返回字串str轉化為小寫字母的字元,相反UPPER(str)
4.日期格式
-
- NOW():返回當前日期和時間的值,格式是‘YYYY-MM-DD HH:MM:SS’
- CURTIME():將當前時間以‘HH:MM:SS’的格式返回
- CURDATE():將當前時間以‘YYYY-MM-DD’格式返回
- DATEDIFF(expr1,expr2)返回兩個如期之間相隔的天數
- STR_TO_DATE(str,format):String轉日期型別
- mysql語法(簡單的就不講了,主要講一下常用的表連線)
- 等值連線(inner join):也叫內連線,把所有表裡出現的資料全部連線起來
- 左連線(left join):左連線就是左表中的所有資料按欄位匹配右表中的資料,新表包括左表中的所有欄位,如果匹配不到右表中的資料用空表示
- 右連線(right join):右連線與左連線類似,就是右表中的資料按欄位匹配左表中的欄位,新表包括右表中的所有欄位,如果匹配不到左表中的資料用空表示
- 索引(做開發這麼長時間,我認為索引在mysql中是比較重要的存在,特別是面試的時候容易被問到)
mysql主要支援的幾種索引:B樹索引(B-tree)、雜湊索引(hash)、空間索引(R-tree)、全文索引(full-text)。這裡主要講一下B樹索引(B-tree)。下面講一下索引的場景及注意事項:
- 何種查詢可以應用索引
(1)、mysql目前僅支援前導列
篩選記錄的條件應能組成複合索引最左邊的部分,即按照最左字首的原則進行篩選,例如:idx_a_b_c,那麼只有where時條件必須按照a=? and b=? and c=? 複合索引才有效
(2)、索引列上的範圍查詢(where ... between ... and ...或者>、<等範圍操作時,那麼可能用到索引的範圍查詢。在一般的的操作中,應避免大範圍索引範圍查詢,如果索引範圍查詢的成本太高,那麼資料庫可能會選擇全表掃描)
(3)、join列:在聯合查詢a表和b表時,若a為驅動表,那麼資料庫可能會全表掃描a表,然後用a表的每個id探測b表的索引查詢匹配的記錄
(4)、where子句:
舉例子就一目瞭然:複合索引idx_a_b_c_d
where a=? and b=? and c>10000; 這種情況可以用到a_b_c複合索引
where a=? and b=? and c>10000 and d<10000; 這種情況d的索引是用不到的
where a>10000 and b=? and c=? and d=?; 這種情況只有a的範圍查詢,其他bcd的索引是用不到的
(5)、mysql優化器
mysql優化器會做一些特殊優化,比如對於索引查詢MAX(索引列),那麼可以進行直接定位。