mysql基礎知識

前言:本文主要總結一下mysql常見的基礎知識,內容比較基礎,對於更多深刻的內容,後面會寫專門系列。mysql

1.MySQL自己其實是一個SQL接口,它的內部包含了多種數據引擎,經常使用的包括: InnoDB:由Innobase Oy公司開發,支持事務; MyISAM:MySQL早期集成的默認數據庫引擎,不支持事務。sql

    MySQL接口和數據庫引擎的關係就比如瀏覽器和瀏覽器引擎的關係。切換瀏覽器引擎不影響瀏覽器界面,切換MySQL引擎不影響本身寫的應用程序使用MySQL的接口。數據庫

2.主鍵是關係表中記錄的惟一標識瀏覽器

    選取主鍵的一個基本原則是:不使用任何業務相關的字段做爲主鍵。主鍵不該該容許NULL,應該使用BIGINT自增或者GUID類型。容許經過多個字段惟一標識記錄,即兩個或更多的字段都設置爲主鍵,這種主鍵被稱爲聯合主鍵。對於聯合主鍵,容許一列有重複,只要不是全部主鍵列都重複便可.沒有必要的狀況下,儘可能不使用聯合主鍵,由於它給關係錶帶來了複雜度的上升。安全

3.外鍵並非經過列名實現的,而是經過定義外鍵約束實現的。數據結構

    經過定義外鍵約束,關係數據庫能夠保證沒法插入無效的數據。因爲外鍵約束會下降數據庫的性能,大部分互聯網應用程序爲了追求速度,並不設置外鍵約束,而是僅靠應用程序自身來保證邏輯的正確性。併發

4.索引是關係數據庫中對某一列或多個列的值進行預排序的數據結構函數

    經過使用索引,可讓數據庫系統沒必要掃描整個表,而是直接定位到符合條件的記錄,這樣就大大加快了查詢速度。索引的效率取決於索引列的值是否散列,即該列的值若是越互不相同,那麼索引效率越高。能夠對一張表建立多個索引。索引的優勢是提升了查詢效率,缺點是在插入、更新和刪除記錄時,須要同時修改索引。所以,索引越多,插入、更新和刪除記錄的速度就越慢。使用主鍵索引的效率是最高的,由於主鍵會保證絕對惟一。工具

5.SELECT語句能夠不帶FROM性能

    不帶FROM子句的SELECT語句有一個有用的用途,就是用來判斷當前到數據庫的鏈接是否有效。許多檢測工具會執行一條SELECT 1,來測試數據庫鏈接。

6.ORDER BY 後面跟多個條件

    例如:ORDER BY age DESC, gender 表示先按age列倒序,若是有相同的age,再按gender列排序。若是有WHERE子句,那麼ORDER BY子句要放到WHERE子句後面。

7.LIMIT ... OFFSET ...

    例如:LIMIT 6 OFFSET 0表示,對結果集從0號記錄開始,最多取6條。SQL記錄集的索引從0開始。OFFSET是可選的,若是隻寫LIMIT 6,那麼至關於LIMIT 6 OFFSET 0。在MySQL中,LIMIT 30 OFFSET 10 能夠簡寫成LIMIT 10, 30。使用LIMIT <M> OFFSET <N>分頁時,隨着N愈來愈大,查詢效率也會愈來愈低。

8.聚合查詢

    使用聚合函數進行查詢,就是聚合查詢,它能夠快速得到結果。 若是聚合查詢的WHERE條件沒有匹配到任何行,COUNT()會返回0,而SUM()、AVG()、MAX()和MIN()會返回NULL。

9.插入或替換

REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);

若id=1的記錄不存在,REPLACE語句將插入新記錄,不然,當前id=1的記錄將被刪除,而後再插入新記錄。

10.插入或更新

INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99) ON DUPLICATE KEY UPDATE name='小明', gender='F', score=99;

插入一條新記錄(INSERT),但若是記錄已經存在,就更新該記錄

11.插入或忽略

INSERT IGNORE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);

插入一條新記錄(INSERT),若是記錄已經存在,就直接忽略。

12.FORCE INDEX

    在查詢的時候,數據庫系統會自動分析查詢語句,並選擇一個最合適的索引。可是數據庫系統的查詢優化器並不必定老是能使用最優索引。 若是已經知道如何選擇索引,可使用FORCE INDEX強制查詢使用指定的索引,前提是索引必須存在。

13.數據庫事務

    把多條語句做爲一個總體進行操做的功能,被稱爲數據庫事務。數據庫事務能夠確保該事務範圍內的全部操做均可以所有成功或者所有失敗。若是事務失敗,那麼效果就和沒有執行這些SQL同樣,不會對數據庫數據有任何改動。數據庫事務具備ACID這4個特性: Atomic,原子性,將全部SQL做爲原子工做單元執行,要麼所有執行,要麼所有不執行; Consistent,一致性,事務完成後,全部數據的狀態都是一致的,即A帳戶只要減去100,B帳戶則一定加上了100; Isolation,隔離性,若是有多個事務併發執行,每一個事務做出的修改必須與其餘事務隔離; Duration,持久性,即事務完成後,對數據庫數據的修改被持久化存儲。

14.隱式事務、顯式事務

    對於單條SQL語句,數據庫系統自動將其做爲一個事務執行,這種事務被稱爲隱式事務。要手動把多條SQL語句做爲一個事務執行,使用BEGIN開啓一個事務,使用COMMIT提交一個事務,這種事務被稱爲顯式事務。

15.隔離級別

    對於兩個併發執行的事務,若是涉及到操做同一條記錄的時候,可能會發生問題。由於併發操做會帶來數據的不一致性,包括髒讀、不可重複讀、幻讀等。數據庫系統提供了隔離級別,針對性地選擇事務的隔離級別,避免數據不一致的問題。

Read Uncommitted是隔離級別最低的一種事務級別。在這種隔離級別下,一個事務會讀到另外一個事務更新後但未提交的數據,若是另外一個事務回滾,那麼當前事務讀到的數據就是髒數據,這就是髒讀。

在Read Committed隔離級別下,一個事務可能會遇到不可重複讀的問題。不可重複讀是指,在一個事務內,屢次讀同一數據,在這個事務尚未結束時,若是另外一個事務剛好修改了這個數據,那麼,在第一個事務中,兩次讀取的數據就可能不一致。在Read Committed隔離級別下,事務不可重複讀同一條記錄,由於極可能讀到的結果不一致。

在Repeatable Read隔離級別下,一個事務可能會遇到幻讀(Phantom Read)的問題。幻讀是指,在一個事務中,第一次查詢某條記錄,發現沒有,可是,當試圖更新這條不存在的記錄時,居然能成功,而且,再次讀取同一條記錄,它就神奇地出現了。幻讀就是沒有讀到的記錄,覺得不存在,但實際上是能夠更新成功的,而且,更新成功後,再次讀取,就出現了。

Serializable是最嚴格的隔離級別。在Serializable隔離級別下,全部事務按照次序依次執行,所以,髒讀、不可重複讀、幻讀都不會出現。雖然Serializable隔離級別下的事務具備最高的安全性,可是,因爲事務是串行執行,因此效率會大大降低,應用程序的性能會急劇下降。若是沒有特別重要的情景,通常都不會使用Serializable隔離級別。

默認隔離級別,若是沒有指定隔離級別,數據庫就會使用默認的隔離級別。在MySQL中,若是使用InnoDB,默認的隔離級別是Repeatable Read。

相關文章
相關標籤/搜索