1.MySQL 有哪些存儲引擎?都有什麼區別?
MySQL 5.7 支持的存儲引擎有InnoDB、MyISAM、Memory、Merge、Archive、CSV、BLACKHOLE 等。
可以使用SHOW ENGINES;語句查看系統所支持的引擎類型
ARCHIVE 用於資料存檔的引擎,資料被插入後就不能在修改了,且不支持索引。
CSV 在存儲資料時,會以逗號作為資料項之間的分隔符。
BLACKHOLE 會丟棄寫操作,該操作會返回空內容。
FEDERATED 將資料存儲在遠程資料庫中,用來訪問遠程表的存儲引擎。
InnoDB 具備外鍵支持功能的事務處理引擎
MEMORY 置於記憶体的表
MRG_MyISAM 用來管理由多個MyISAM 表構成的表集合
MyISAM 主要的非事務處理存儲引擎
SEQUENCE 實現自增的序列
Aria 增強版的MylSAM,解決了MylSAM崩潰安全恢復問題
PERFORMANCE_SCHEMA 關注資料庫執行過程中的效能相關的資料
2.MySQL中float、double、decimal三個浮點型別的區別
float 浮點型別用於表示==單精度浮點==數值
double 浮點型別用於表示==雙精度浮點==數值
decimal 精度比float高,資料處理比float簡單,一般優先考慮,但float存儲的資料范圍大,所以範圍大的資料就只能用它了
decimal 類型可以精確地表示非常大或非常精確的小數.大至1028(正或負)以及有效位數多達28位的數字
可以作為decimal類型存儲而不失其精確性.該類型對於必須避免舍入錯誤的應用程序(如記賬)很有用
3.Datetime、Timestamp 儲存時間的區別
Timestamp只佔4個字節,而且是以utc的格式儲存,它會自動檢索當前時區並進行轉換。
Datetime以8個字節儲存,不會進行時區的檢索。
也就是說,對於Timestamp來說,如果儲存時的時區和檢索時的時區不一樣,那麼拿出來的資料也不一樣。對於Datetime來說,存什麼拿到的就是什麼。
還有一個區別就是如果存進去的是NULL,Timestamp會自動儲存當前時??,而 Datetime會?儲存NULL。
4.Char、Varchar、Varbinary 儲存字符的區別
binary與varbinary類型和char與varchar類型是相似的,只是他們存儲的是二進制資料,也就是說他們是包含字節流而不是字符流,他們有二進製字符的集合和順序,他們的對比,排序是基於字節的數值進行的
binary與varbinary的最大長度和char與varchar是一樣的,只不過他們是定義字節長度,而char和varchar對應的是字符長度。
char(m)定義的列的長度為固定的,m取值可以為0~255之間,當儲存char值時,在它們的右邊填充空格以達到指定的長度。當檢索到char值時,尾部的空格被刪除掉。在儲存或檢索過程中不進行大小寫轉換。
varchar(m)定義的列的長度為可變長字串,m取值可以為0~65535之間,(varchar的最大有效長度由最大行大小和使用的字符集確定。整體最大長度是65,532位元組)。varchar值儲存時只儲存需要的字元數,另加一個位元組來記錄長度(如果列宣告的長度超過255,則使用兩個位元組)。varchar值儲存時不進行填充。當值儲存和檢索時尾部的空格仍保留,符合標準sql。
5.什麼是索引
索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定信息。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助於更快地獲取信息。
唯一索引是不允許其中任何兩行具有相同索引值的索引。當現有資料中存在重複的鍵值時,大多數資料庫不允許將新創建的唯一索引與表一起保存。資料庫還可能防止添加將在表中創建重複鍵值的新資料。
聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引。如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的資料訪問速度。
6.MySQL索引類型有?
普通索引。基本索引,沒有任何限制
唯一索引。索引列的值必須唯一,可以為空
主鍵索引。一個表只有一個主鍵,不能為空。是特殊的唯一索引 。
組合索引。多個字段創建的索引,只有在查詢條件中使用了創建索引時的第一個字段,索引才會被使用。使用組合索引時遵循最左前綴集合。
全文索引。用來查找文本中的關鍵字,而不是直接與索引中的值相比較。
7.比較一下B+樹索引和Hash索引
B+樹是一個平衡的多叉樹,從根節點到每個葉子節點的高度差值不超過1,而且同層級的節點間有指針相互鏈接。
在B+樹上的常規檢索,從根節點到葉子節點的搜索效率基本相當,不會出現大幅波動,而且基於索引的順序掃描時,也可以利用雙向指針快速左右移動,效率非常高。
Hash索引就是采用一定的Hash算法,把鍵值換算成新的Hash值,檢索時不需要類似B+樹那樣從根節點到葉子節點逐級查找,只需一次Hash算法即可立刻定位到相應的位置,速度非常快。
如果是等值查詢,那麽哈希索引明顯有絕對優勢,因為只需要經過一次算法即可找到相應的鍵值;當然了,這個前提是,鍵值都是唯一的。如果鍵值不是唯一的,就需要先找到該鍵所在位置,然後再根據鏈表往後掃描,直到找到相應的資料;
如果是範圍查詢檢索,這時候哈希索引就毫無用武之地了,因為原先是有序的鍵值,經過哈希算法後,有可能變成不連續的了,就沒辦法再利用索引完成範圍查詢檢索;
B+樹索引的關鍵字檢索效率比較平均,不像B樹那樣波動幅度大,在有大量重復鍵值情況下,哈希索引的效率也是極低的,因為存在所謂的哈希碰撞問題。
8.Mysql中Explain的各個參數解釋
select_type
simple :即簡單select 查詢,不包含union及子查詢;
primary :最外層的select 查詢;
union :表示此查詢是union 的第二或隨後的查詢;
dependent union:union 中的第二個或後面的查詢語句, 取決於外面的查詢;
union result :union的結果;
subquery :子查詢中的第一個select;
dependent subquery:子查詢中的第一個select,取決於外面的查詢,即子查詢依賴於外層查詢的結果。
type
性能從好到壞依次如下:
system:表中只有一條資料,這是一個特殊的const 類型;
const:針對主鍵或唯一索引的等值查詢掃描,最多只返回一行資料,const 查詢速度非常快,因為它僅僅讀取一次即可;
eq_ref:此類型通常出現在多表的join 查詢,表示對於前表的每一個結果,都只能匹配到後表的一行結果,並且查詢的比較操作通常是=, 查詢效率較高;
ref:此類型通常出現在多表的join 查詢, 針對於非唯一或非主鍵索引, 或者是使用了最左前綴規則索引的查詢;
fulltext:全文索引檢索,要注意,全文索引的優先級很高,若全文索引和普通索引同時存在時,mysql不管代價,優先選擇使用全文索引;
ref_or_null:與ref方法類似,只是增加了null值的比較。實際用的不多;
unique_subquery:用於where中的in形式子查詢,子查詢返回不重複值唯一值;
index_subquery:用於in形式子查詢使用到了輔助索引或者in常數列表,子查詢可能返回重複值,可以使用索引將子查詢去重;
index_merge:表示查詢使用了兩個以上的索引,最後取交集或者並集,常見and,or的條件使用了不同的索引,官方排序這個在ref_or_null之後,但是實際上由於要讀取所個索引,性能可能大部分時間都不如range;
range:表示使用索引範圍查詢,通過索引字段範圍獲取表中部分資料記錄。這個類型通常出現在=, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN操作中,此時輸出的ref 字段為NULL並且key_len字段是此次查詢中使用到的索引的最長的那個;
index:全表掃描,只是掃描表的時候按照索引次序進行而不是行。主要優點就是避免了排序,但是開銷仍然非常大,這種情況時, Extra 字段會顯示Using index;
all:性能最差的情況,使用了全表掃描,系統必須避免出現這種情況。
possible_keys
可能用到的索引。
key
真正用到的索引。
key_len
使用了索引字節的長度。
ref
之前用到的key索引的哪一列或常量
rows
掃描了多少行數,也是性能評估的重要依據
extra
Distinct:一旦找到了與行相聯合匹配的行就不再搜索了;
Using filesort:使用了文件排序,性能非常慢,需要優化。
Using index:查詢使用到了索引,列資料是從僅僅使用了索引中的信息而沒有讀取實際的行動的表返回的,這發生在對錶的全部的請求列都是同一個索引的部分的時候。
Using temporary:使用了臨時表排序,性能非常慢,需要優化。
Using where:表示使用了where進行查詢,不是很重要。
ALL:這個連接類型對於前面的每一個記錄聯合進行完全掃描,這一般比較糟糕,需要優化。
9.索引利弊是什麼及索引分類
第一,通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。
第二,可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。
第三,可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。
第四,在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。
第五,通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能。
雖然,索引有許多優點,但是,為表中的每一個列都增加索引,是非常不明智的。這是因為,增加索引也有許多不利的一個方面。
第一,建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。
第二,索引需要佔物理空間,除了資料表佔資料空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。
第三,當對錶中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。
10.什麼是聚簇索引和非聚簇索引?
從物理儲存角度來分,索引可以分為聚簇索引和非聚簇索引,區別主要看葉子節點存了什麼資料。
在InnoDB裡,索引B+Tree的葉子節點儲存了整行資料的是主鍵索引,也被稱之為聚簇索引。聚簇索引是對磁碟上實際資料重新組織以按指定的一個或多個列的值排序的演算法。特點是儲存資料的順序和索引順序一致。一般情況下主鍵會預設建立聚簇索引,且一張表只允許存在一個聚簇索引,因為資料一旦儲存,順序只能有一種。找到了索引就找到了需要的資料,那麼這個索引就是聚簇索引,所以主鍵就是聚簇索引,修改聚簇索引其實就是修改主鍵。
索引B+Tree的葉子節點只儲存了主鍵的值和索引列的是非主鍵索引,也被稱之為非聚簇索引。一個表可以有多個非聚簇索引。非聚簇索引的儲存和資料的儲存是分離的,也就是說可能找到了索引但沒找到資料,需要根據索引上的值(主鍵)再次回表查詢,非聚簇索引也叫做輔助索引。
11.資料庫事務特點及潛在問題?
原子性(Atomic):事務包含的所有操作,要么全做,要么全不做回滾;
一致性(Consistency):從一個一致狀態到另一個一致狀態;eg:A、B之間轉賬,兩者的金額總和轉賬前後必須相同。
隔離性(Isolation):多個事務並發執行時,不會相互影響。
持久性(Durability):一個事務一旦修改,它對資料庫的修改應該永久存在資料庫中。
事務並發引起的問題以及如何避免
第一,更新丟失——mysql所有事務隔離級別在資料庫層面均可避免。
第二,臟讀——READ-COMMITTED事務隔離級別以上可以避免。(未提交的事務修改的資料也能讀取到而引起的錯誤資料,RC級別以上可避免)
第三,不可重複讀——REPETABLE-READ事務隔離級別以上可避免。(加鎖後讀取的資料會因為其他事務操作而變化,RR級別以上可避免)
第四,幻讀——SERIALIZABLE事務隔離級別可避免。
沒有留言:
張貼留言