想進大廠,mysql不會那可不行,來接受mysql面試挑戰吧,看看你能堅持到**?
能說下myisam 和 innodb的區別嗎?myisam引擎是5.1版本之前的預設引擎,支援全文檢索、壓縮、空間函式等,但是不支援事務和行級鎖,所以一般用於有大量查詢少量插入的場景來使用,而且myisam不支援外來鍵,並且索引和資料是分開儲存的。
innodb是基於聚簇索引建立的,和myisam相反它支援事務、外來鍵,並且通過mvcc來支援高併發,索引和資料儲存在一起。
說下mysql的索引有哪些吧,聚簇和非聚簇索引又是什麼?索引按照資料結構來說主要包含b+樹和hash索引。
假設我們有張表,結構如下:
create table user( id int(11) not null, age int(11) not null, primary key(id), key(age) ); b+樹是左小右大的順序儲存結構,節點只包含id索引列,而葉子節點包含索引列和資料,這種資料和索引在一起儲存的索引方式叫做聚簇索引,一張表只能有乙個聚簇索引。假設沒有定義主鍵,innodb會選擇乙個唯一的非空索引代替,如果沒有的話則會隱式定義乙個主鍵作為聚簇索引。
這是主鍵聚簇索引儲存的結構,那麼非聚簇索引的結構是什麼樣子呢?非聚簇索引(二級索引)儲存的是主鍵id值,這一點和myisam儲存的是資料位址是不同的。
最終,我們一張圖看看innodb和myisam聚簇和非聚簇索引的區別
上面談的其實就是索引最基本的東西,n叉樹,跳表、lsm我都沒講,同時要建立出好的索引要顧及到很多的方面:
最左字首匹配原則。這是非常重要、非常重要、非常重要(重要的事情說三遍)的原則,mysql會一直向右匹配直到遇到範圍查詢 (>,盡量選擇區分度高的列作為索引,區分度的公式是 count(distinct col)/count(*)。表示欄位不重複的比率,比率越大我們掃瞄的記錄數就越少。
索引列不能參與計算,盡量保持列「乾淨」。比如, from_unixtime(create_time)='2016-06-06' 就不能使用索引,原因很簡單,b+樹中儲存的都是資料表中的字段值,但是進行檢索時,需要把所有元素都應用函式才能比較,顯然這樣的代價太大。所以語句要寫成 :create_time=unix_timestamp('2016-06-06')。
盡可能的擴充套件索引,不要新建立索引。比如表中已經有了a的索引,現在要加(a,b)的索引,那麼只需要修改原來的索引即可。
單個多列組合索引和多個單列索引的檢索查詢效果不同,因為在執行sql時,mysql只能使用乙個索引,會從多個單列索引中選擇乙個限制最為嚴格的索引(經指正,在mysql5.0以後的版本中,有「合併索引」的策略,翻看了《高效能mysql 第三版》,書作者認為:還是應該建立起比較好的索引,而不應該依賴於「合併索引」這麼乙個策略)。
「合併索引」策略簡單來講,就是使用多個單列索引,然後將這些結果用「union或者and」來合併起來
鎖的型別有哪些呢 mysql鎖分為共享鎖和排他鎖,也叫做讀鎖和寫鎖。
讀鎖是共享的,可以通過lock in share mode實現,這時候只能讀不能寫。
寫鎖是排他的,它會阻塞其他的寫鎖和讀鎖。從顆粒度來區分,可以分為表鎖和行鎖兩種。
表鎖會鎖定整張表並且阻塞其他使用者對該錶的所有讀寫操作,比如alter修改表結構的時候會鎖表。
行鎖又可以分為樂觀鎖和悲觀鎖,悲觀鎖可以通過for update實現,樂觀鎖則通過版本號實現。
你能說下事務的基本特性和隔離級別嗎?事務基本特性acid分別是:
原子性指的是乙個事務中的操作要麼全部成功,要麼全部失敗。
一致性指的是資料庫總是從乙個一致性的狀態轉換到另外乙個一致性的狀態。比如a轉賬給b100塊錢,假設中間sql執行過程中系統崩潰a也不會損失100塊,因為事務沒有提交,修改也就不會儲存到資料庫。
隔離性指的是乙個事務的修改在最終提交前,對其他事務是不可見的。
永續性指的是一旦事務提交,所做的修改就會永久儲存到資料庫中。
而隔離性有4個隔離級別,分別是:
read uncommit 讀未提交,可能會讀到其他事務未提交的資料,也叫做髒讀。
read commit 讀已提交,兩次讀取結果不一致,叫做不可重複讀。
repeatable read 可重複復讀,這是mysql的預設級別,就是每次讀取結果都一樣,但是有可能產生幻讀。
serializable 序列化,一般是不會使用的,他會給每一行讀取的資料加鎖,會導致大量超時和鎖競爭的問題。
那acid靠什麼保證的呢?
a原子性由undo log日誌保證,它記錄了需要回滾的日誌資訊,事務回滾時撤銷已經執行成功的sql
c一致性一般由**層面來保證
i隔離性由mvcc來保證
d永續性由記憶體+redo log來保證,mysql修改資料同時在記憶體和redo log記錄這次操作,事務提交的時候通過redo log刷盤,宕機的時候可以從redo log恢復
這篇只是mysql的入門,簡單了解了一下mysql的以及基礎,之後我還會更新mysql的高階知識點,比如分庫分表,比如主從同步,比如雙寫一致性等等。。。太多了,不行,再吹牛皮該破了,我先去學習學習了!!!!
mysql 列轉行,合併字段
列轉行 利用max case when then max 聚合函式 取最大值 casecoursewhen 語文 thenscoreelse0end 判斷 as 語文 別名作為列名 select name max case when course 語文 then score end as語文,max...
mysql列轉行,合併字段
列轉行 利用max case when then max 聚合函式 取最大值 casecoursewhen 語文 thenscoreelse0end 判斷 as 語文 別名作為列名 select name max case when course 語文 then score end as 語文,ma...
mysql 列轉行,合併字段
列轉行 利用max case when then max 聚合函式 取最大值 casecoursewhen 語文 thenscoreelse0end 判斷 as 語文 別名作為列名 select name max case when course 語文 then score end as 語文,ma...