1.ACID 是什麼?
答: mysql的ACID是指事務的 原子性,一緻性,隔離性,持久性。 其中原子性是基于 Redo/undo log機制來實作的, Redo log 記錄的是事務更新後的記錄值,undo log 記錄的是事務更新後的記錄,更新失敗後,就可以根據undo log來進行復原。
原子性: 一個事務必須視為一個不可分割的最小工作單元,整個事務裡的操作要麼全部執行成功,要麼全部失敗。
一緻性: 事務總是總一個一緻性狀态轉換到另一個一緻性狀态。
隔離性: 一個事務所做的修改,在最終送出之前,其他事務是不可見的。
持久性: 事務裡的所有操作最終會寫入到資料庫裡。
2. mysql的索引類型包含哪幾種?
1) fulltext 索引
适用于大檔案text類型以及大小超過text類型的字段。
2) NORMAL普通索引
使用經常使用的字段或者當關聯表的一些字段。
3) UNIQUE 唯一性索引
當有多個字段一起表示唯一時,可以使用唯一性索引進行限制,比如使用者表裡的, 使用者名和賬号需要唯一并且不為空,那麼就将 這2個字段設定一個唯一性的索引。
3. mysql的explain關鍵字用法?
一般用于在查詢前添加explain,用于解釋查詢出來的語句包含的資訊。
4. mysql的binLog是什麼?
binlog是mysql用于資料收集和資料恢複的日志管理工具。
5. 你知道mysql的最左索引比對規則嘛?
答: 當有多個字段共同做為 索引時,如(a,b,c),如果說隻用到了b,c那麼最左索引比對就會認為該索引無效,如果用到了a,c或者a,b,那麼索引就會生效。
6. mysql的鎖有哪幾種?
答: 根據加鎖的範圍,可分為全局鎖(全庫邏輯備份)、表級鎖(表鎖(表記錄)、中繼資料鎖MDL(修改表結構))、行鎖。
全局鎖: 給整個資料庫加一個全局的讀鎖,表示隻有目前線程能夠讀取到該資料庫,其他線程不能進行讀取和修改。
格式: Full tables with read lock
表級鎖:
表鎖和中繼資料鎖(MDL)
格式: lock tables 表名 read;
設定表鎖後,不能對該表進行修改操作。
行鎖:
兩段鎖、 一緻性非鎖定讀(MVCC多版本并發控制, innodb會用快照的形式儲存曆史資訊)、一緻性鎖定讀(可以解決幻讀問題)。
一緻性鎖定讀:
select .. for update
select ... lock in share mode
可以通過加一緻性鎖定讀,當2次查詢期間有insert語句過來的時候,會進入到阻塞狀态,直至讀取完畢後,再insert。
- Record Lock:單個行記錄上的鎖
- Gap Lock:間隙鎖,鎖定一個範圍,但不包含記錄本身
- Next-Key Lock:Gap Lock+Record Lock,鎖定一個範圍,并且鎖定記錄本身
7. mysql常用指令?
1) 檢視系統參數
使用指令 show variables like "%params%" ;
①檢測mysql檢測死鎖機制是否開啟5.7:
show variables like "%innodb_deadlock_detect%"
該指令表示如果開啟死鎖檢測機制,那麼出現死鎖,會随機自動釋放一個在死鎖的事務。
② 查詢binlog變量
show variables like "%binlog%";
2)查詢資料庫事務的隔離級别
select @@transaction_isolation mysql預設的事務隔離級别為: 可重複讀。
3) explain指令, 解釋sql
例如可以檢視查詢的語句是否用到索引
8. mysql的MYISAM存儲引擎和Innodb存儲引擎有什麼差別,哪個性能好?
答: 差別:
1) myisam存儲引擎不支援事務,對于不需要事務的操作時,myisam的查詢和插入的性能比innodb快的多。
2) myisam 不支援外鍵,innodb支援外鍵。
3) myisam 隻支援表級鎖,Innodb支援表級鎖(表鎖和中繼資料鎖)和行鎖(兩階段鎖、一緻性非鎖定讀(MVCC)、一緻性鎖定讀(select … for update,select … lock in share mode))。
9.mysql為什麼用B+樹做索引?
答:
1) B+樹是一種排序好的資料結構。
2)與普通的二叉樹相比,B+樹隻在葉子節點做存儲,在同樣的記憶體下,B+樹葉子能夠存儲更多的節點數量,周遊起來更快速友善。
3) B+樹是一一種平衡的多叉樹,能夠做更少的磁盤I/O, 另外葉子節點也可以連接配接起來,加快周遊。
10.mysql的 sql執行順序是怎麼樣的?
答: 如: select * from A left join B on A.c=B.d where A.e="1" order by A.g;
第一步先将A表和B表做笛卡爾乘積。
第二步再通過on将上面的笛卡爾乘積的結果集進行第一次篩選。
第三步 将A表多餘的行,即沒有比對到B表的行接入到上面篩選的On結果集後,空的用null填充。
第四步用where對結果集進行篩選。
第五步再通過order by 對結果集作排序。
11.資料庫的事務隔離級别有哪幾種方式?分别有什麼優缺點?
1. 讀未送出,一個事務能夠讀取到另一個事務未送出的記錄。
2. 讀已送出,事務隻能讀取到已經送出的記錄, 會出現不可重複讀的問題,即同一個事務多次讀取到的結果是不相同的。
3. 可重複讀,即同一個事務,多次查詢讀取的記錄是 相同的,但是會出現幻讀的問題,即在讀取結果的一瞬間,另外一個事務突然向資料庫裡插入了一條記錄,那麼前面的事務好像多讀取了一條記錄的問題。可用mvcc解決幻讀的問題,多版本控制。
4.可串行化,是資料庫的隔離的最進階别,不會出現髒讀、不可重複讀、幻讀的問題,但性能比較差。
12. mysql 的check用法?
答: 給字段添加一個限制, 在建表的時候通過check(字段>1) 給字段的值限制範圍,即限制字段能為什麼值。
13. mysql的binlog日志預設存放在哪兒?
1) 檢視日志檔案路徑
show master status
2)在my.ini檔案中 檢視bin_log檔案
we
14. mysql 自增主鍵出現不連續的原因?
答: mysql自增主鍵不連續的情況原因有三個:
1) 唯一鍵沖突
2) 事務復原
3) insert...select的時候會出現主鍵id每次雙倍配置設定導緻主鍵id跳過的問題
參考部落格
insert into ..select ..
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`c` int(11) DEFAULT NULL,
`d` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `c` (`c`)
) ENGINE=InnoDB;
insert into t1 values(null, 1,1);
insert into t1 values(null, 2,2);
insert into t1 values(null, 3,3);
insert into t1 values(null, 4,4);
create table t2 like t1;
insert into t2(c,d) select c,d from t1;
insert into t2 values(null, 5,5);
select * from t2;
查詢結果為:
15. mysql的慢查詢預設時間為多長?
答: 10 S
16. 聚簇索引和非聚簇索引的差別是什麼? mysql 為什麼用自增的id适合作為主鍵?
答: 聚簇索引在Mysql裡是唯一的,索引和資料存儲在一起,非聚簇索引指索引和資料沒有放一起,類如書本後的附錄目錄。
因為mysql 的自增id , 正好是mysql的聚簇索引的資料的實體存放順序和索引存放順序是一緻的。隻要索引是相鄰的,那麼在磁盤上的位置也是相鄰的,如果不是自增的情況,那麼會出現更多次的磁盤io情況。