1. 程式人生 > >mysql 知識

mysql 知識

1.  資料庫事務的四個特性及含義

資料庫事務transanction正確執行的四個基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔離性(Isolation)、永續性(Durability)。
原子性:整個事務中的所有操作,要麼全部完成,要麼全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性:在事務開始之前和事務結束以後,資料庫的完整性約束沒有被破壞。
隔離性:隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作。如果有兩個事務,執行在相同的時間內,執行 相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為序列化,為了防止事務操作間的混淆,必須序列化或序列化請 求,使得在同一時間僅有一個請求用於同一資料。
永續性

:在事務完成以後,該事務所對資料庫所作的更改便持久的儲存在資料庫之中,並不會被回滾。

2.檢視的作用,檢視可以更改麼?

檢視是虛擬的表,與包含資料的表不一樣,檢視只包含使用時動態檢索資料的查詢;不包含任何列或資料。使用檢視可以簡化複雜的sql操作,隱藏具體的細節,保護資料;檢視建立後,可以使用與表相同的方式利用它們。
檢視不能被索引,也不能有關聯的觸發器或預設值,如果檢視本身內有order by 則對檢視再次order by將被覆蓋。
建立檢視:create view XXX as XXXXXXXXXXXXXX;
對於某些檢視比如未使用聯結子查詢分組聚集函式Distinct Union等,是可以對其更新的,對檢視的更新將對基表進行更新;但是檢視主要用於簡化檢索,保護資料,並不用於更新,而且大部分檢視都不可以更新。

3.drop,delete與truncate的區別

drop直接刪掉表 truncate刪除表中資料,再插入時自增長id又從1開始 delete刪除表中資料,可以加where字句。

(1) DELETE語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中儲存以便進行進行回滾操作。TRUNCATE TABLE 則一次性地從表中刪除所有的資料並不把單獨的刪除操作記錄記入日誌儲存,刪除行是不能恢復的。並且在刪除的過程中不會啟用與表有關的刪除觸發器。執行速度快。

(2) 表和索引所佔空間。當表被TRUNCATE 後,這個表和索引所佔用的空間會恢復到初始大小,而DELETE操作不會減少表或索引所佔用的空間。drop語句將表所佔用的空間全釋放掉。

(3) 一般而言,drop > truncate > delete

(4) 應用範圍。TRUNCATE 只能對TABLE;DELETE可以是table和view

(5) TRUNCATE 和DELETE只刪除資料,而DROP則刪除整個表(結構和資料)。

(6) truncate與不帶where的delete :只刪除資料,而不刪除表的結構(定義)drop語句將刪除表的結構被依賴的約束(constrain),觸發器(trigger)索引(index);依賴於該表的儲存過程/函式將被保留,但其狀態會變為:invalid。

(7) delete語句為DML(data maintain Language),這個操作會被放到 rollback segment中,事務提交後才生效。如果有相應的 tigger,執行的時候將被觸發。

(8) truncate、drop是DLL(data define language),操作立即生效,原資料不放到 rollback segment中,不能回滾

(9) 在沒有備份情況下,謹慎使用 drop 與 truncate。要刪除部分資料行採用delete且注意結合where來約束影響範圍。回滾段要足夠大。要刪除表用drop;若想保留表而將表中資料刪除,如果於事務無關,用truncate即可實現。如果和事務有關,或老師想觸發trigger,還是用delete。

(10) Truncate table 表名 速度快,而且效率高,因為:
truncate table 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。DELETE 語句每次刪除一行,並在事務日誌中為所刪除的每行記錄一項。TRUNCATE TABLE 通過釋放儲存表資料所用的資料頁來刪除資料,並且只在事務日誌中記錄頁的釋放。

(11) TRUNCATE TABLE 刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置為該列的種子。如果想保留標識計數值,請改用 DELETE。如果要刪除表定義及其資料,請使用 DROP TABLE 語句。

(12) 對於由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 WHERE 子句的 DELETE 語句。由於 TRUNCATE TABLE 不記錄在日誌中,所以它不能啟用觸發器。

 

4淺談 DML、DDL、DCL的區別

   

  • DML(data manipulation language)資料操縱語言:

    就是我們最經常用到的 SELECT、UPDATE、INSERT、DELETE。 主要用來對資料庫的資料進行一些操作。

     

  • DDL(data definition language)資料庫定義語言:

    其實就是我們在建立表的時候用到的一些sql,比如說:CREATE、ALTER、DROP等。DDL主要是用在定義或改變表的結構,資料型別,表之間的連結和約束等初始化工作上

      

  • DCL(Data Control Language)資料庫控制語言:

    是用來設定或更改資料庫使用者或角色許可權的語句,包括(grant,deny,revoke等)語句。這個比較少用到。

5 索引

資料庫索引,是資料庫管理系統中一個排序的資料結構,以協助快速查詢、更新資料庫表中資料。索引的實現通常使用B樹及其變種B+樹

第一,通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。

第二,可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。

第三,可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。

第四,在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。

第五,通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能。

也許會有人要問:增加索引有如此多的優點,為什麼不對錶中的每一個列建立一個索引呢?因為,增加索引也有許多不利的方面。

第一,建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。

第二,索引需要佔物理空間,除了資料表佔資料空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。

第三,當對錶中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。

 

索引型別:

  普通索引 是最基本的索引,它沒有任何限制。它有以下幾種建立方式:

(1)直接建立索引

CREATE INDEX index_name ON table(column(length))

(2)修改表結構的方式新增索引

ALTER TABLE table_name ADD INDEX index_name ON (column(length))

  唯一索引

   

與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種建立方式:
(1)建立唯一索引

CREATE UNIQUE INDEX indexName ON table(column(length))

(2)修改表結構

ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))

  主鍵索引 : 是一種特殊的唯一索引,一個表只能有一個主鍵,不允許有空值。一般是在建表的時候同時建立主鍵索引    

  組合索引  

  指多個欄位上建立的索引,只有在查詢條件中使用了建立索引時的第一個欄位,索引才會被使用。使用組合索引時遵循最左字首集合

  ALTER TABLE `table` ADD INDEX name_city_age (name,city,age); 

  全文索引

   主要用來查詢文字中的關鍵字,而不是直接與索引中的值相比較。fulltext索引跟其它索引大不相同,它更像是一個搜尋引擎,而不是簡單的where語句的引數匹配。fulltext索引配合match against操作使用,而不是一般的where語句加like。它可以在create table,alter table ,create index使用,不過目前只有char、varchar,text 列上可以建立全文索引。值得一提的是,在資料量較大時候,現將資料放入一個沒有全域性索引的表中,然後再用CREATE index建立fulltext索引,要比先為一張表建立fulltext然後再將資料寫入的速度快很多。  

ALTER TABLE article ADD FULLTEXT index_content(content)

6 連表查詢
1.內連線 : 等值連線 左右表中匹配的資料
2.左連線 : left join 左表的全部資料加上右表中與左表匹配的資料

7 mysql 資料庫引擎
引擎型別:
1.InnoDB :B+tree 儲存的是資料的地址 ,
是一個事務型的儲存引擎,有行級鎖定和外來鍵約束,事物是行級鎖,由於鎖的粒度更小,寫操作不會鎖定全表,所以在併發較高時,使用Innodb引擎會提升效率。但是使用行級鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的範圍,InnoDB表同樣會鎖全表。
 

    適用場景:
    1)經常更新的表,適合處理多重併發的更新請求。
    2)支援事務。
    3)可以從災難中恢復(通過bin-log日誌等)。
    4)外來鍵約束。只有他支援外來鍵。
    5)支援自動增加列屬性auto_increment。


2.MyIsam
(預設引擎):
B+tree 儲存的是資料的本身
MyIASM是MySQL預設的引擎,但是它沒有提供對資料庫事務的支援,也不支援行級鎖和外來鍵,因此當INSERT(插入)或UPDATE(更新)資料時即寫操作需要鎖定整個表,效率便會低一些。
  

    適用場景:
    1)不支援事務的設計,但是並不代表著有事務操作的專案不能用MyIsam儲存引擎,可以在service層進行根據自己的業務需求進行相應的控制。
    2)不支援外來鍵的表設計。
    3)查詢速度很快,如果資料庫insert和update的操作比較多的話比較適用。
    4)整天 對錶進行加鎖的場景。
    5)MyISAM極度強調快速讀取操作。
    6)MyIASM中儲存了表的行數,於是SELECT COUNT(*) FROM TABLE時只需要直接讀取已經儲存好的值而不需要進行全表掃描。如果表的讀操作遠遠多於寫操作且不需要資料庫事務的支援,那麼MyIASM也是很好的選擇。
    缺點:
    就是不能在表損壞後恢復資料。(是不能主動恢復)

  3.Memory : Memory(也叫HEAP)堆記憶體嘛,使用存在記憶體中的內容來建立表。每個MEMORY表只實際對應一個磁碟檔案。MEMORY型別的表訪問非常得快,因為它的資料是放在記憶體中的,並且預設使用HASH索引。

    適用場景:
    1)那些內容變化不頻繁的程式碼表,或者作為統計操作的中間結果表,便於高效地堆中間結果進行分析並得到最終的統計結果。
    2)目標資料比較小,而且非常頻繁的進行訪問,在記憶體中存放資料,如果太大的資料會造成記憶體溢位。可以通過引數max_heap_table_size控制Memory表的大小,限制Memory表的最大的大小。
    3)資料是臨時的,而且必須立即可用得到,那麼就可以放在記憶體中。
    4)儲存在Memory表中的資料如果突然間丟失的話也沒有太大的關係。
    注意: Memory同時支援雜湊索引和B樹索引,B樹索引可以使用部分查詢和通配查詢,也可以使用<,>和>=等操作符方便資料探勘,雜湊索引相等的比較快但是對於範圍的比較慢很多。
    特性要求:
    1)要求儲存的資料是資料長度不變的格式,比如,Blob和Text型別的資料不可用(長度不固定的)。
    2)要記住,在用完表格之後就刪除表格。


 4.
Merge_Myisam :

    是一個相同的可以被當作一個來用的MyISAM表的集合。“相同”意味著所有表同樣的列和索引資訊。
    也就是說,他將MyIsam引擎的多個表聚合起來,但是他的內部沒有資料,真正的資料依然是MyIsam引擎的表中,但是可以直接進行查詢、刪除更新等操作。
    比如:我們可能會遇到這樣的問題,同一種類的資料會根據資料的時間分為多個表,如果這時候進行查詢的話,就會比較麻煩,Merge可以直接將多個表聚合成一個表統一查詢,然後再刪除Merge表(刪除的是定義),原來的資料不會影響。

 
  5.Blackhole

  任何寫入到此引擎的資料均會被丟棄掉, 不做實際儲存;Select語句的內容永遠是空。
  他會丟棄所有的插入的資料,伺服器會記錄下Blackhole表的日誌,所以可以用於複製資料到備份資料庫。
  使用場景:
  1)驗證dump file語法的正確性
  2)以使用blackhole引擎來檢測binlog功能所需要的額外負載
  3)充當日誌伺服器

 

(3)使用建議:
以下兩點必須使用 InnoDB:
1)可靠性高或者要求事務處理,則使用InnoDB。這個是必須的。
2)表更新和查詢都相當的頻繁,並且表鎖定的機會比較大的情況指定InnoDB資料引擎的建立。
對比之下,MyISAM的使用場景:
1)做很多count的計算的。如一些日誌,調查的業務表。
2)插入修改不頻繁,查詢非常頻繁的。



修改引擎型別

  一 修改配置檔案my.ini

  將mysql.ini另存為my.ini,在[mysqld]後面新增default-storage-engine=InnoDB,重啟服務,資料庫預設的引擎修改為InnoDB

   二   在建表的時候指定

create table mytbl(   
    id int primary key, name varchar(50) )type=MyISAM;

alter table table_name type = InnoDB;
檢視資料庫引擎
show table status from table_name;