1. 程式人生 > >java開發中的重中之重-------mysql(基礎篇)

java開發中的重中之重-------mysql(基礎篇)

  • 介紹:

  mysql是目前世界上最流行的關係型資料庫,在國內大的網際網路公司都在使用mysql資料庫,mysql經常被我們這樣概述,“mysql是輕量級關係型資料庫”,其實輕量級並不是說mysql是中小型資料庫,在專案開發中,儲存資料的量往往是一個架構問題,如果配合架構,mysql也是可以儲存海量資料的。並且海量資料並沒有一個明確的標準。說mysql是輕量級關係型資料庫,原因是mysql不擅長對海量資料的分析。在一般的網際網路公司海量資料並不常見,因此mysql是中小型公司的最佳選擇。

  • mysql的查詢執行過程:在開發中經常用到mysql進行資料查詢,那麼mysql的查詢執行過程是什麼樣的呢?
  1. 首先連線mysql釋出查詢
  2. 先去查詢快取中是否有結果集,如果有則直接返回結果集
  3. 如果沒有結果集,那麼mysql解析查詢將通過優化器生產執行計劃,然後執行執行計劃通過API從儲存引擎獲取資料,並返回給客戶端
  • 儲存引擎:下面主要介紹下常用引擎的特性(一共有20多個引擎)
  1. InnoDB引擎:在mysql5.5版本以後的版本中,InnoDB是mysql的預設引擎,在近幾年的版本更新中,InnoDB一直在持續改進,處理能力不斷提高,下面看一下InnoDB的優勢
    1. 災難恢復性好
    2. 支援全部級別的事物(一共四種事物),其中預設事物隔離級別是可重複讀
    3. 使用行級鎖
    4. 支援外來鍵
    5. 支援熱備份
  2. MyISAM引擎:
    1. 無事物支援
    2. 使用的是表級鎖,併發性差
    3. 主機宕機後,MyISAM表易損壞,災難恢復性不佳
    4. 只快取索引

  以上兩種索引的注意區別:InnoDB讀取資料的速度遠遠小於MyISAM,但是MyISAM的寫入資料遠小於InnoDB

  • mysql函式:
  1. 算數操作符:+ 、-、*、/、DIV(整除)
  2. 數學函式:
    • 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語法(簡單的就不講了,主要講一下常用的表連線)
  1. 等值連線(inner  join):也叫內連線,把所有表裡出現的資料全部連線起來
  2. 左連線(left join):左連線就是左表中的所有資料按欄位匹配右表中的資料,新表包括左表中的所有欄位,如果匹配不到右表中的資料用空表示
  3. 右連線(right join):右連線與左連線類似,就是右表中的資料按欄位匹配左表中的欄位,新表包括右表中的所有欄位,如果匹配不到左表中的資料用空表示
  • 索引(做開發這麼長時間,我認為索引在mysql中是比較重要的存在,特別是面試的時候容易被問到)

mysql主要支援的幾種索引:B樹索引(B-tree)、雜湊索引(hash)、空間索引(R-tree)、全文索引(full-text)。這裡主要講一下B樹索引(B-tree)。下面講一下索引的場景及注意事項:

  1. 何種查詢可以應用索引

    (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(索引列),那麼可以進行直接定位。