【Java 開發面試】Mysql 面試考點/考題彙總

言技發表於2019-01-24

  為了能夠在面試回答中優雅而不失體面回答面試考點,該文章借鑑了不同平臺對知識點的描述。

  • 如有侵權請聯絡我
  • 文章的不足和錯誤請指正,好的建議也不要吝嗇,我都會採納並更正
  • 您的點贊是我持續更新的動力

藍字為補充

考點內容參考自:《Mysql 技術內幕》、《深入淺出Mysql》

考題內容來源於百度,有一些是很久摘下來的,找不到出處了。

目錄

儲存引擎的區別

【考點一】InnoDB 和MYISAM 儲存引擎的區別?

答:回到目錄

聯機事務處理OLTP(on-line transaction processing):傳統的關係型資料庫的主要應用,主要是基本的、日常的事務處理,例如銀行交易。

聯機分析處理OLAP(On-Line Analytical Processing):是資料倉儲系統的主要應用,支援複雜的分析操作,側重決策支援,並且提供直觀易懂的查詢結果

InnoDB:

  • InnoDB 儲存引擎支援事務、支援外來鍵、支援非鎖定讀、行鎖設計其設計主要面向OLTP 應用。
  • InnoDB 儲存引擎表採用聚集的方式儲存,因此每張表的儲存順序都按主鍵的順序存放,如果沒有指定主鍵,InnoDB 儲存引擎會為每一行生成一個6位元組的ROWID並以此作為主鍵。
  • InnoDB 儲存引擎通過MVCC 獲的高併發性,並提供了插入緩衝、二次寫、自適應雜湊索引和預讀等高效能高可用功能
  • InnoDB 儲存引擎預設隔離級別為REPEATABLE_READ(重複讀)並採用next-key locking(間隙鎖)來避免幻讀

MySIAM:

  • MYISAM 儲存引擎不支援事務、表鎖設計、支援全文索引其設計主要面向OLAP 應用
  • MYISAM 儲存引擎表由frm、MYD 和MYI 組成,frm 檔案存放表格定義,MYD 用來存放資料檔案,MYI 存放索引檔案。MYISAM 儲存引擎與眾不同的地方在於它的緩衝池只快取索引檔案而不快取資料檔案,資料檔案的快取依賴於作業系統。

操作區別:

  • MYISAM 儲存表的具體行數,不帶where 是可直接返回。InnoDB 要掃描全表。
  • DELETE 表時,InnoDB 是一行一行的刪除,MYISAM 是先drop表,然後重建表
  • InnoDB 跨平臺可直接拷貝使用,MYISAM 不行
  • InnoDB 表格很難被壓縮,MYISAM 可以

選擇:

MyISAM相對簡單所以在效率上要優於InnoDB。如果系統讀多,寫少。對原子性要求低。那麼MyISAM最好的選擇。且MyISAM恢復速度快。可直接用備份覆蓋恢復。 InnoDB 更適合系統讀少,寫多的時候,尤其是高併發場景。

以下是一個具體的選擇場景來自:www.cnblogs.com/kuangdaoyiz…

【Java 開發面試】Mysql 面試考點/考題彙總

索引

【考點二】什麼是索引?你知道Mysql 有哪些索引?分別介紹一下

答:回到目錄

在關聯式資料庫中,索引是一種單獨的、物理的對資料庫表中一列或多列的值進行排序的一種儲存結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的資料頁的邏輯指標清單。——百度百科

索引是對資料庫表中一或多個列的值進行排序的結構,是幫助MySQL高效獲取資料的資料結構

(資料庫是磁碟檔案,磁碟IO 的代價較高,所以採用索引減少IO 次數)

Mysql 中常用的索引有B+ 樹索引(包括普通索引、唯一索引、主鍵索引),雜湊索引,全文索引,R-TREE 索引(空間索引,主要用於地理空間資料型別,很少使用)。

Mysql 傳統意義上的索引為B+ 樹索引,B+ 樹索引的本質就是B+ 樹在資料庫中的實現,由於B+ 樹的高扇出性,資料庫中的B+ 樹的高一般為2-4層,因此查詢某一鍵值的行記錄只需2-4次IO,大概0.02~0.04秒。

(扇出性:是指該模組直接呼叫的下級模組的個數。扇出大表示模組的複雜度高,需要控制和協調過多的下級模組)

B+ 樹索引主要分為聚集索引和輔助索引。

聚集索引是根據每張表的主鍵建造的一棵B+ 樹,葉子節點中存放的是整張表的行記錄。一張表只能有一個聚集索引。因為聚集索引在邏輯上是連續的,所以它對於主鍵的排序查詢和範圍查詢速度非常快。

輔助索引與聚集索引不同的地方在於,輔助索引不是唯一的,它的葉子節點只包含行記錄的部分資料以及對應聚集索引的節點位置。通過輔助索引來查詢資料時,先遍歷輔助索引找到對應主鍵索引,再通過主鍵索引查詢對應記錄。

在MYISAM 中主鍵索引和輔助索引都相當上述輔助索引,索引頁中存放的是主鍵和指向資料頁的偏移量,資料頁中存放的是主鍵和該主鍵所屬行記錄的地址空間。唯一的區別是MYISAM 中主鍵索引不能重複,輔助索引可以。

B+ 樹索引從使用上來說還有聯合索引和覆蓋索引。

聯合索引是指對錶上的多個列進行索引。它對對應多個列的指定獲取比較快。另外一個好處是聯合索引對第二個鍵已經排好序了,所以對兩個列的排序獲取可以避免多做一次排序操作。

覆蓋索引其實更算一種思想,能夠從輔助索引中獲取資訊,就不需要查詢聚集索引中的資料。使用輔助索引的好處在於輔助索引包含的資訊少,所以大小遠小於聚集索引,因此可以大大減少IO 操作。

雜湊索引是一種自適應的索引,資料庫會根據表的使用情況自動生成雜湊索引,我們人為是沒辦法干預的。

InnoDB 儲存引擎採用的雜湊函式為除法雜湊方式,採用的衝突處理方法為鏈地址法。它指定查詢的速度很快,但是範圍查詢就無能為力了。

全文索引用於實現關鍵詞搜尋。但它只能根據空格分詞,因此不支援中文。


【考點三 】 索引的優缺點?那些情況適合建索引那些情況不適合建索引?

答:回到目錄

以下內容摘自部落格:blog.csdn.net/u013310119/…

索引的優點:

  1. 通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。
  2. 可以大大加快 資料的檢索速度,這也是建立索引的最主要的原因。
  3. 可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。
  4. 在使用分組和排序 子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。
  5. 通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能。

索引的缺點

  1. 建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。
  2. 索引需要佔物理空間,除了資料表佔資料空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。
  3. 當對錶中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。

哪些情況需要加索引?

  1. 在經常需要搜尋的列上,可以加快搜尋的速度;
  2. 在作為主鍵的列上,強制該列的唯一性和組織表中資料的排列結構;
  3. 在經常用在連線的列上,這些列主要是一些外來鍵,可以加快連線的速度;
  4. 在經常需要根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的;
  5. 在經常需要排序的列上建立索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;
  6. 在經常使用在WHERE子句中的列上面建立索引,加快條件的判斷速度。

哪些情況不需要加索引?

  1. 對於那些在查詢中很少使用或者參考的列不應該建立索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。
  2. 對於那些只有很少資料值的列也不應該增加索引。這是因為,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的資料行佔了表中資料行的很大比例,即需要在表中搜尋的資料行的比例很大。增加索引,並不能明顯加快檢索速度。
  3. 對於那些定義為text, image和bit資料型別的列不應該增加索引。這是因為,這些列的資料量要麼相當大,要麼取值很少。
  4. 當修改效能遠遠大於檢索效能時,不應該建立索引。這是因為,修改效能和檢索效能是互相矛盾的。當增加索引時,會提高檢索效能,但是會降低修改效能。當減少索引時,會提高修改效能,降低檢索效能。因此,當修改效能遠遠大於檢索效能時,不應該建立索引。

事務

【考點四】什麼是事務,它有哪些特性?說一說事務的隔離級別,分別解決了什麼問題?

答:回到目錄

什麼是事務,它有哪些特性?

事務就是一組原子性的操作,這些操作要麼全部發生,要麼全部不發生。事務把資料庫從一種一致性狀態轉換成另一種一致性狀態。

事務具有ACID 四種特性,即原子性(atomicity),一致性(consistency),隔離性(isolation),永續性(durability):

  • 原子性,指的是事務是一個不可分割的操作,要麼全都正確執行,要麼全都不執行。
  • 一致性,指的是事務把資料庫從一種一致性狀態轉換成另一種一致性狀態,事務開始前和事務結束後,資料庫的完整性約束沒有被破壞。
  • 隔離性要求每個讀寫事務相互之間是分開的,在事務提交前對其他事務是不可見的
  • 永續性,指的是事務一旦提交,其結果就是永久性的,即使當機也能恢復。

說一說事務的隔離級別,分別解決了什麼問題?

事務有4 個隔離級別,分別是:

  • 讀未提交(read uncommit)
  • 讀已提交(read commit)
  • 可重複讀(repeatable read)
  • 和序列化(serializable)。

隔離級別依次提高,分別解決了髒讀、不可重讀和幻讀。

【擴充】

1、髒讀:事務A讀取了事務B更新的資料,然後B回滾操作,那麼A讀取到的資料是髒資料

2、不可重複讀:事務 A 多次讀取同一資料,事務 B 在事務A多次讀取的過程中,對資料作了更新並提交,導致事務A多次讀取同一資料時,結果 不一致。

3、幻讀:系統管理員A將資料庫中所有學生的成績從具體分數改為ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。

不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表

【Java 開發面試】Mysql 面試考點/考題彙總

  1. InnoDB 預設隔離級別為repeatable read,但是通過next-key lock 解決了幻讀,保證了ACID。

【考點五】事務的實現原理?事務的分類?使用事務應該注意的問題?

答:回到目錄

事務的實現原理?

事務是基於重做日誌檔案(redo log)和回滾日誌(undo log)實現的。

每提交一個事務必須先將該事務的所有日誌寫入到重做日誌檔案進行持久化,資料庫就可以通過重做日誌來保證事務的原子性和永續性。

每當有修改事務時,還會產生undo log,如果需要回滾,則根據undo log 的反向語句進行邏輯操作,比如insert 一條記錄就delete 一條記錄。undo log 主要實現資料庫的一致性,還可以用來實現MVCC

事務的分類?

事務主要分為:

  • 扁平事務
  • 帶有儲存點的扁平事務
  • 鏈事務
  • 巢狀事務
  • 分散式事務

使用事務應該注意的問題?

  • 不要再迴圈中使用事務(迴圈提交會導致大量的redo log)
  • 不要使用自動提交
  • 不要使用自動回滾
  • 長事務切分處理

SQL 優化

【考點六】SQL 優化的一般步驟

答:回到目錄

1. 通過show status 命令瞭解各SQL 的執行頻率

show [session|global] status like "Com_%";

  • session:當前連線執行的統計結果
  • global:上一次資料庫啟動至今的統計結果

常見的執行引數:

  • Com_select:執行查詢的次數
  • Com_insert:執行插入的次數
  • Com_update:執行更新的次數
  • Com_delete:執行刪除的次數
  • Com_rows_read:執行查詢的返回行數(舉一反三:inserted、updated、deleted)
  • Connection:試圖連線Mysql 伺服器的次數
  • Uptime:伺服器工作時間
  • Slow_queries:慢查詢次數
mysql> show global status like "
Slow_queries";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries  | 0     |
+---------------+-------+
1 row in set
複製程式碼

2. 定位執行效率最低的SQL 語句

可以通過兩個辦法定位效率較低的SQL 語句:

  • 通過慢查詢日誌定位執行效率低的SQL,但是隻能在查詢完過後
  • 使用show processlist 命令檢視當前Mysql 正在進行的執行緒,包括執行緒狀態、是否鎖表

【Java 開發面試】Mysql 面試考點/考題彙總

3. 通過EXPLAIN 分析低效SQL 的執行計劃

查詢到效率低的sql 語句後,可以通過EXPLAIN 分析低效SQL 的執行計劃。

mysql> explain select * from comment 
;
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table   | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | comment | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   92 |      100 | NULL  |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set

mysql> 
複製程式碼
  • select_type: 表示select 的型別,常見取值有SIMPLE(簡單表,即不使用表連線或者子查詢)、PRIMARY、UNION、SUBQUERY等。
  • table: 輸出結果集的表
  • type: 表示Mysql 的訪問方式(從上到下依次變快)
    • type=all,全表掃描,Mysql 遍歷全表來找到匹配的行
    • type=index,Mysql 遍歷整個索引來找到匹配的行
    • type=range,索引範圍掃面
    • type=ref,使用非唯一索引掃描或唯一索引的字首掃描
    • type=eq_ref,使用唯一索引
    • type-const/system,單表中最多隻有一個匹配行
    • type=NUll,MySQL 不用訪問表或者索引就能直接得到結果
  • possible_key: 表示查詢時可能用到的索引
  • key: 表示實際用到的索引
  • key_len: 使用到索引欄位的長度
  • rows: 掃描行的數量
  • Extra: 執行情況的說明和描述。

4. 通過show profile 分析SQL

//預設不開啟profile,使用時先開啟profile
mysql> set profiling=1;
Query OK, 0 rows affected

mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
|           1 |
+-------------+
1 row in set

//在InnoDB 下獲取錶行數
mysql> select count(*) from comment;
+----------+
| count(*) |
+----------+
|       92 |
+----------+
1 row in set

// 查開執行時間
mysql> show profiles;
+----------+------------+------------------------------+
| Query_ID | Duration   | Query                        |
+----------+------------+------------------------------+
|        1 |  0.0109785 | select @@profiling           |
|        2 | 0.05502275 | select count(*) from comment |
+----------+------------+------------------------------+
2 rows in set

//具體查開每一步執行時間
mysql> show profile for query 2
;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 9.2E-5   |
| checking permissions | 9E-6     |
| Opening tables       | 2E-5     |
| init                 | 1.8E-5   |
| System lock          | 9E-6     |
| optimizing           | 0.054635 |  //在優化處理耗時最多
| statistics           | 5.6E-5   |
| preparing            | 1.7E-5   |
| executing            | 5E-6     |
| Sending data         | 8E-5     |
| end                  | 5E-6     |
| query end            | 1.5E-5   |
| closing tables       | 9E-6     |
| freeing items        | 3.6E-5   |
| cleaning up          | 1.9E-5   |
+----------------------+----------+
15 rows in set

mysql> 
複製程式碼

5. 還可以通過trace 分析優化器如何選擇執行計劃的(有興趣可以看一下)


【考點七】常用的SQL 的優化

答:回到目錄

1. 對大批量插入資料

  • MYISAM 表

可以通過DISABLE KEY 和 ENABLE KEY 關閉和開啟MYISAM 表索引的更新來提高效率。

ALTER TABLE table_name DISABLE KEY //在匯入資料前關閉索引更新
loading the data
ALTER TABLE table_name ENABLE KEY //匯入完成後開啟
複製程式碼

一個書上的例子:

直接匯入資料(115.12 s) VS 優化匯入(18.59 s)

  • InnoDB 表
    • 按主鍵順序匯入
    • 關閉唯一性檢驗,匯入後再開啟
    • 關閉自動提交,匯入後再開啟

2. 優化INSERT 語句

  • 同一個客戶端,應使用多個值表的insert 語句,這種方式可以大大縮減客戶端與資料庫之間的連線、關閉等消耗。
insert into table_name values(1,2)(1,3)(1,4)...
複製程式碼
  • 從不同的客戶端插入的話,可以採用INSERT DELAYED 語句獲得更高的速度。它的意思是讓INSERT 語句馬上執行,因為資料都被放在記憶體的佇列中,並沒有真正寫入磁碟。
  • 從文字檔案裝載一個表時,使用LOAD DATA INFILE 通常比INSERT 快20 倍。
  • 將索引檔案和資料檔案分放在不同的磁碟上(利用建表中的選項)。
  • 如果是批量插入,MYISAM 可以通過改變bulk_insert_buffer_size (插入快取容量大小)變數值提高速度。

3. 優化order by 語句

在MySQL 資料庫中有兩種排序方式:

  • 通過有序索引掃描直接返回有序資料
  • 通過對返回資料進行排序(Filesort 排序)

其中Filesort 會多排一次序,所以在使用order by 語句的時候儘量用到索引。下面的規則是可以用到索引的情況:

  • where 和 order by 使用相同的索引
  • order by 的順序和索引的順序相同
  • order by 的欄位都是升序或都是降序

同理用不到索引的情況:

  • order by 的欄位混合ASC 和DESC
  • 用於查詢行的關鍵字與ORDER BY 中所使用的不同
  • 對不同的關鍵字使用order by

4. 優化group by 語句

預設情況下group by 語句對分組的資料進行排序操作,如果不需要排序操作可以通過order by null 禁止排序。

5. 優化巢狀語句

如果可以的話,特別是where 中包含索引的情況,用join 語法來代替巢狀語法(in)因為join 不需要在MySQL 的記憶體中建立臨時表。

6. 優化or語句

對於含有or 的查詢語句,如果要利用索引,則or 之間的每一個條件都必須用到索引,如果沒用索引,可以考慮增加索引。否則會全表掃面。

7. 優化分頁查詢

一般分頁查詢時,通過建立覆蓋索引能夠比較好的提高效能。一個常見又頭痛的場景是"limit 1000,20" 此時MySQL 排序出前1020 條資料後,只需要返回20條資料,查詢和排序的代價都很高。有兩種優化方案

  • 在索引上完成排序分頁的操作,最後根據主鍵關聯查詢需要的內容,讓MySQL 掃描儘可能少的頁面來提高分頁操作。
mysql> explain select comment_id,comment_content from comment order by comment_create_time limit 50,5;
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table   | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra          |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+----------------+
|  1 | SIMPLE      | comment | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   92 |      100 | Using filesort |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+----------------+
1 row in set

mysql> explain select a.comment_id,a.comment_content from comment a inner join(select comment_id from comment order by comment_create_time limit 50,5)b on a.comment_id=b.comment_id ;
+----+-------------+------------+------------+--------+---------------+---------+---------+--------------+------+----------+----------------+
| id | select_type | table      | partitions | type   | possible_keys | key     | key_len | ref          | rows | filtered | Extra          |
+----+-------------+------------+------------+--------+---------------+---------+---------+--------------+------+----------+----------------+
|  1 | PRIMARY     | <derived2> | NULL       | ALL    | NULL          | NULL    | NULL    | NULL         |   55 |      100 | NULL           |
|  1 | PRIMARY     | a          | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | b.comment_id |    1 |      100 | NULL           |
|  2 | DERIVED     | comment    | NULL       | ALL    | NULL          | NULL    | NULL    | NULL         |   92 |      100 | Using filesort |
+----+-------------+------------+------------+--------+---------------+---------+---------+--------------+------+----------+----------------+
3 rows in set
複製程式碼
  • 把limit 查詢轉換成某個位置的查詢,limit m,n -> limit n

8. 使用SQL 提示

SQL 提示是優化資料庫的一個重要手段,常用的SQL 提示:

  1. USE INDEX

推薦資料庫使用某個索引,可以讓Mysql 不再考慮其他可用索引

sql語句 use index(index_name);
複製程式碼
  1. IGNORE INDEX

忽視資料庫某個索引,可以讓Mysql 不再考慮這個索引

sql語句 ignore index(index_name);
複製程式碼
  1. FORCE INDEX

強迫資料庫使用某個索引,使用use index 資料庫還是可能不用這個索引,但是force index 資料庫必須使用這個索引

sql語句 force index(index_name);
複製程式碼

其他

【考題一】資料庫的三大正規化

答:回到目錄

第一正規化:

確保每列的原子性(強調的是列的原子性,即列不能夠再分成其他幾列).如果每列(或者每個屬性)都是不可再分的最小資料單元(也稱為最小的原子單元),則滿足第一正規化.

例如:顧客表(姓名、編號、地址、……)其中"地址"列還可以細分為國家、省、市、區等。

第二正規化:

在第一正規化的基礎上更進一層,目標是確保表中的每列都和主鍵相關(一是表必須有一個主鍵;二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的部分)如果一個關係滿足第一正規化,並且除了主鍵以外的其它列,都依賴於該主鍵,則滿足第二正規化.

例如:訂單表(訂單編號、產品編號、定購日期、價格、……),"訂單編號"為主鍵,"產品編號"和主鍵列沒有直接的關係,即"產品編號"列不依賴於主鍵列,應刪除該列。

第三正規化:

在第二正規化的基礎上更進一層,目標是確保每列都和主鍵列直接相關,而不是間接相關(另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴).如果一個關係滿足第二正規化,並且不依賴於除了主鍵以外的其它列,則滿足第三正規化.

為了理解第三正規化,需要根據Armstrong公里之一定義傳遞依賴。假設A、B和C是關係R的三個屬性,如果A-〉B且B-〉C,則從這些函式依賴中,可以得出A-〉C,如上所述, 依賴A-〉C是傳遞依賴。

例如:訂單表(訂單編號,定購日期,顧客編號,顧客姓名,……),初看該表沒有問題,滿足第二正規化,每列都和主鍵列"訂單編號"相關,再細看你會發現"顧客姓名"和"顧客 編號"相關,"顧客編號"和"訂單編號"又相關,最後經過傳遞依賴,"顧客姓名"也和"訂單編號"相關。為了滿足第三正規化,應去掉"顧客姓名"列,放入客戶表中。


【考題二】什麼是儲存過程?有哪些優缺點?

答:回到目錄

儲存過程是一些預編譯的SQL語句。

優點:

  • 儲存過程是一個預編譯的程式碼塊,執行效率比較高
  • 儲存過程在伺服器端執行,減少客戶端的壓力
  • 允許模組化程式設計,只需要建立一次過程,以後在程式中就可以呼叫該過程任意次,類似方法的複用
  • 一個儲存過程替代大量T_SQL語句 ,可以降低網路通訊量,提高通訊速率
  • 可以一定程度上確保資料安全,對於沒有許可權執行儲存過程的使用者,也可授權他們執行儲存過程。

缺點:

  • 可移植性不靈活(因為儲存過程依賴於具體的資料庫)
  • 不便於除錯。
  • 沒辦法應用快取。雖然有全域性臨時表之類的方法可以做快取,但同樣加重了資料庫的負擔。如果快取併發嚴重,經常要加鎖,那效率實在堪憂。
  • 無法適應資料庫的切割(水平或垂直切割)。資料庫切割之後,儲存過程並不清楚資料儲存在哪個資料庫中。

內容來源:


【考題三】說一說drop、delete與truncate的區別?

答:回到目錄

  • drop直接刪掉表有關的一切(資料/結構/約束...),不會記錄日誌,為DDL(Data Definition Language,資料庫定義語言)操作。
  • truncate 刪除表中所有資料(再插入時自增長id又從1開始),該操作也不會記錄日誌所以比較快,為DDL操作。只能刪table。
  • DELETE語句執行刪除的過程是每次從表中刪除一行,需要記錄日誌,比較慢,可以加where 語句,為DML(Data Manipulation Language, 資料操縱語言)。可以刪table 和view 。
  • 速度上drop > truncate > delete

內容來源:


【考題四】什麼是檢視?以及檢視的使用場景有哪些?

答:回到目錄

檢視是一種虛擬的表,具有和物理表相同的功能,沒有物理儲存。可以對檢視進行增,改,查,操作,試圖通常是有一個表或者多個表的行或列的子集。對檢視的修改不影響基本表。它使得我們獲取資料更容易,相比多表查詢。

使用場景:

  • 只希望使用者檢視特定資訊的列

  • 來源於多個表,可以建立檢視提取我們需要的資訊,簡化操作。


【考題五】超鍵、候選鍵、主鍵、外來鍵分別是什麼?

答:回到目錄

超鍵:在關係中能唯一標識元組的屬性集稱為關係模式的超鍵。一個屬性可以為作為一個超鍵,多個屬性組合在一起也可以作為一個超鍵。超鍵包含候選鍵和主鍵。

候選鍵:是最小超鍵,即沒有冗餘元素的超鍵。

主鍵:資料庫表中對儲存資料物件予以唯一和完整標識的資料列或屬性的組合。一個資料列只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。

外來鍵:在一個表中存在的另一個表的主鍵稱此表的外來鍵。

內容來源:


【考題六】Mysql 的幾種連線方式?

答:回到目錄

  1. 內連線:inner join on

組合兩個表中的記錄,返回關聯欄位相符的記錄,也就是返回兩個表的交集(陰影)部分。

【Java 開發面試】Mysql 面試考點/考題彙總

  1. 左連線:left join on / left outer join on

left join 是left outer join的簡寫,它的全稱是左外連線,是外連線中的一種。 左(外)連線,左表(a_table)的記錄將會全部表示出來,而右表(b_table)只會顯示符合搜尋條件的記錄。右表記錄不足的地方均為NULL。

【Java 開發面試】Mysql 面試考點/考題彙總
3. 右連線:right join on / right outer join on

right join是right outer join的簡寫,它的全稱是右外連線,是外連線中的一種。 與左(外)連線相反,右(外)連線,左表(a_table)只會顯示符合搜尋條件的記錄,而右表(b_table)的記錄將會全部表示出來。左表記錄不足的地方均為NULL。

【Java 開發面試】Mysql 面試考點/考題彙總

  1. 全連線

MySQL目前不支援此種方式,可以用其他方式替代解決。

內容來源:


【考題七】說一說什麼是Mysql 的完整性約束?

答:回到目錄

完整性約束是對欄位進行限制,從而符合該欄位達到我們期望的效果比如欄位含有預設值,不能是NULL等, 主要有唯一、自增、主鍵、外來鍵約束

PRIMARY KEY (PK)    標識該欄位為該表的主鍵,可以唯一的標識記錄
FOREIGN KEY (FK)    標識該欄位為該表的外來鍵
NOT NULL    標識該欄位不能為空
UNIQUE KEY (UK)    標識該欄位的值是唯一的
AUTO_INCREMENT    標識該欄位的值自動增長(整數型別,而且為主鍵)
DEFAULT    為該欄位設定預設值

UNSIGNED 無符號
ZEROFILL 使用0填充
複製程式碼

內容來源:

www.cnblogs.com/liuxiaowei/…

相關文章