1. 程式人生 > 實用技巧 >MySQL面試題全在這裡了(上)

MySQL面試題全在這裡了(上)

歡迎關注
CSDN:程式設計師小羊
微信公眾號:程式設計師小羊
部落格園:程式設計師小羊

目錄

1、資料庫儲存引擎

資料庫儲存引擎是資料庫底層軟體組織,資料庫管理系統(DBMS)使用資料引擎進行建立、查詢、更新和刪除資料。不同的儲存引擎提供 不同的儲存機制、索引技巧、鎖定水平等功能,使用不同的儲存引擎,還可以 獲得特定的功能。現在許多不同的資料庫管理系統都支援多種不同的資料引擎。儲存引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated 。

2、InnoDB(B+樹)

InnoDB 底層儲存結構為B+樹, B樹的每個節點對應innodb的一個page, page大小是固定的,一般設為 16k。其中非葉子節點只有鍵值, 葉子節點包含完成資料

適用場景:

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

2、TokuDB( Fractal Tree-節點帶資料)

TokuDB 底層儲存結構為 Fractal Tree,Fractal Tree 的結構與 B+樹有些類似, 在 Fractal Tree中, 每一個 child 指標除了需要指向一個 child
節點外,還會帶有一個 Message Buffer ,這個Message Buffer 是一個 FIFO 的佇列,用來快取更新操作。
例如,一次插入操作只需要落在某節點的 Message Buffer 就可以馬上返回了,並不需要搜尋到葉子節點。這些快取的更新會在查詢時或後臺非同步合併應用到對應的節點中。

TokuDB 線上新增索引,不影響讀寫操作, 非常快的寫入效能, Fractal-tree 在事務實現上有優勢。 他主要適用於訪問頻率不高的資料或歷史資料歸檔

3、MyIASM

MyIASM是 MySQL預設的引擎,但是它沒有提供對資料庫事務的支援,也不支援行級鎖和外來鍵,因此當 NSERT(插入)或 UPDATE(更新)資料時即寫操作需要鎖定整個表,效率便會低一些。
ISAM 執行讀取操作的速度很快,而且不佔用大量的記憶體和儲存資源。在設計之初就預想資料組織成有固定長度的記錄,按順序儲存的。 ---
ISAM 是一種靜態索引結構。
缺點是它不 支援事務處理。

4、Memory

Memory(也叫 HEAP)堆記憶體:使用存在記憶體中的內容來建立表。每個 MEMORY 表只實際對應一個磁碟檔案。 MEMORY 型別的表訪問非常得快,因為它的資料是放在記憶體中的,並且預設使用HASH 索引。但是一旦服務關閉,表中的資料就會丟失掉。 Memory 同時支援雜湊索引和 B 樹索引, B樹索引可以使用部分查詢和通配查詢,也可以使用<,>和>=等操作符方便資料探勘,雜湊索引相等的比較快但是對於範圍的比較慢很多

5、資料庫引擎有哪些

如何檢視mysql提供的所有儲存引擎

mysql> show engines;

mysql常用引擎包括:MYISAM、Innodb、Memory、MERGE

  1. MYISAM:全表鎖,擁有較高的執行速度,不支援事務,不支援外來鍵,併發效能差,佔用空間相對較小,對事務完整性沒有要求,以
    select、insert為主的應用基本上可以使用這引擎
  2. Innodb:行級鎖,提供了具有提交、回滾和崩潰回覆能力的事務安全,支援自動增長列,支援外來鍵約束,併發能力強,佔用空間是MYISAM的2.5倍,處理效率相對會差一些
  3. Memory:全表鎖,儲存在內容中,速度快,但會佔用和資料量成正比的記憶體空間且資料在mysql重啟時會丟失,預設使用HASH索引, 檢索效率非常高,但不適用於精確查詢,主要用於那些內容變化不頻繁的程式碼表
  4. MERGE:是一組MYISAM表的組合

6、InnoDB與MyISAM的區別

  1. InnoDB支援事務,MyISAM不支援,對於InnoDB每一條SQL語言都預設封裝成事務,自動提交,這樣會影響速度,所以最好把多條
    SQL語言放在begin和commit之間,組成一個事務;
  2. InnoDB支援外來鍵,而MyISAM不支援。對一個包含外來鍵的InnoDB錶轉為MYISAM會失敗;
  3. InnoDB是聚集索引,資料檔案是和索引綁在一起的,必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然後再通過主鍵查詢到資料。因此,主鍵不應該過大,因為主鍵太大,其他索引也都會很大。而MyISAM是非聚集索引,資料檔案是分離的,索引儲存的是資料檔案的指標。主鍵索引和輔助索引是獨立的。
  4. InnoDB不儲存表的具體行數,執行select count(*) from table時需要全表掃描。而MyISAM用一個變數儲存了整個表的行數,執行上述語句時只需要讀出該變數即可,速度很快;
  5. Innodb不支援全文索引,而MyISAM支援全文索引,查詢效率上MyISAM要高

7、索引

索引(Index)是幫助 MySQL 高效獲取資料的資料結構。 常見的查詢演算法,順序查詢,二分查詢,二叉排序樹查詢,雜湊雜湊法,分塊查詢,平衡多路搜尋樹 B 樹(B-tree) ,索引是對資料庫表中一個或多個列的值進行排序的結構,建立索引有助於快速獲取資訊。
你也可以這樣理解:索引就是加快檢索表中資料的方法。資料庫的索引類似於書籍的索引。在書籍中,索引允許使用者不必翻閱完整個書就能迅速地找到所需要的資訊。在資料庫中,索引也允許資料庫程式迅速地找到表中的資料,而不必掃描整個資料庫
mysql 有4種不同的索引:
主鍵索引(PRIMARY)
唯一索引(UNIQUE)
普通索引(INDEX)
全文索引(FULLTEXT)

索引並非是越多越好,建立索引也需要耗費資源,一是增加了資料庫的儲存空間,二是在插入和刪除時要花費較多的時間維護索引
索引加快資料庫的檢索速度
索引降低了插入、刪除、修改等維護任務的速度唯一索引可以確保每一行資料的唯一性
通過使用索引,可以在查詢的過程中使用優化隱藏器,提高系統的效能索引需要佔物理和資料空間

8、常見索引原則有

  1. 選擇唯一性索引,唯一性索引的值是唯一的,可以更快速的通過該索引來確定某條記錄。
  2. 為經常需要排序、分組和聯合操作的欄位建立索引。
  3. 為常用作為查詢條件的欄位建立索引。
  4. 限制索引的數目:
    越多的索引,會使更新表變得很浪費時間。儘量使用資料量少的索引
  5. 如果索引的值很長,那麼查詢的速度會受到影響。儘量使用字首來索引
  6. 如果索引欄位的值很長,最好使用值的字首來索引。
  7. 刪除不再使用或者很少使用的索引
  8. 最左字首匹配原則,非常重要的原則。
  9. 儘量選擇區分度高的列作為索引區分度的公式是表示欄位不重複的比例
  10. 索引列不能參與計算,保持列“乾淨”:帶函式的查詢不參與索引。
  11. 儘量的擴充套件索引,不要新建索引

9、資料庫的三正規化是什麼

第一正規化:列不可再分
第二正規化:行可以唯一區分,主鍵約束
第三正規化:表的非主屬性不能依賴與其他表的非主屬性 外來鍵約束
且三大正規化是一級一級依賴的,第二正規化建立在第一正規化上,第三正規化建立第一第二正規化上 。

10、第一正規化(1st NF - 列都是不可再分)

第一正規化的目標是確保每列的原子性:如果每列都是不可再分的最小資料單元(也稱為最小的原子單元),則滿足第一正規化(1NF)

11、第二正規化(2nd NF- 每個表只描述一件事情)

首先滿足第一正規化,並且表中非主鍵列不存在對主鍵的部分依賴。 第二正規化要求每個表只描述一件事情。

12、第三正規化(3rd NF- 不存在對非主鍵列的傳遞依賴)

第三正規化定義是,滿足第二正規化,並且表中的列不存在對非主鍵列的傳遞依賴。 除了主鍵訂單編號外,顧客姓名依賴於非主鍵顧客編號。

13、資料庫是事務

事務(TRANSACTION)是作為單個邏輯工作單元執行的一系列操作, 這些操作作為一個整體一起向系統提交,要麼都執行、要麼都不執行 。事務是一個不可分割的工作邏輯單元事務必須具備以下四個屬性,簡稱 ACID 屬性:
原子性(Atomicity)

  1. 事務是一個完整的操作。事務的各步操作是不可分的(原子的);要麼都執行,要麼都不執行。
    一致性(Consistency)
  2. 當事務完成時,資料必須處於一致狀態。
    隔離性(Isolation)
  3. 對資料進行修改的所有併發事務是彼此隔離的, 這表明事務必須是獨立的,它不應以任何方式依賴於或影響其他事務。
    永久性(Durability)
  4. 事務完成後,它對資料庫的修改被永久保持,事務日誌能夠保持事務的永久性

14、SQL優化

  1. 查詢語句中不要使用select *
  2. 儘量減少子查詢,使用關聯查詢(left join,right join,inner join)替代
  3. 減少使用IN或者NOT IN ,使用exists,not exists或者關聯查詢語句替代
  4. or 的查詢儘量用 union或者union all 代替(在確認沒有重複資料或者不用剔除重複資料時,union all會更好)
  5. 應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。
  6. 應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如: select id from t where num is null 可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢: select id from t where num=0

15、簡單說一說drop、delete與truncate的區別

SQL中的drop、delete、truncate都表示刪除,但是三者有一些差別
delete和truncate只刪除表的資料不刪除表的結構速度,一般來說: drop> truncate >delete
delete語句是dml,這個操作會放到rollback segement中,事務提交之後才生效;
如果有相應的trigger,執行的時候將被觸發. truncate,drop是ddl, 操作立即生效,原資料不放到rollbacksegment中,不能回滾. 操作不觸發
trigger

16、什麼是檢視

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

17、什麼是內聯接、左外聯接、右外聯接?

內聯接(Inner Join):匹配2張表中相關聯的記錄。
左外聯接(Left Outer Join):除了匹配2張表中相關聯的記錄外,還會匹配左表中剩餘的記錄,右表中未匹配到的欄位用NULL表示。
右外聯接(Right Outer Join):除了匹配2張表中相關聯的記錄外,還會匹配右表中剩餘的記錄,左表中未匹配到的欄位用NULL表示。在判定左表和右表時,要根據表名出現在Outer Join的左右位置關係

18、併發事務帶來哪些問題?

在典型的應用程式中,多個事務併發執行,經常會操作相同的資料來完成各自的任務(多個使用者對同一資料進行操作)。併發雖然是必須的,但可能會導致以下的問題。

髒讀(Dirty read): 當一個事務正在訪問資料並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時另外一個事務也訪問了這個資料,然後使用了這個資料。因為這個資料是還沒有提交的資料,那麼另外一個事務讀到的這個資料是“髒資料”,依據“髒資料”所做的操作可能是不正確的。

丟失修改(Lost to modify): 指在一個事務讀取一個數據時,另外一個事務也訪問了該資料,那麼在第一個事務中修改了這個資料後,第二個事務也修改了這個資料。這樣第一個事務內的修改結果就被丟失,因此稱為丟失修。 例如:事務1讀取某表中的資料A=20,事務2也讀取A=20,事務1修改A=A-1,事務2也修改A=A-1,最終結果A=19,事務1的修改被丟失。
不可重複讀(Unrepeatableread): 指在一個事務內多次讀同一資料。在這個事務還沒有結束時,另一個事務也訪問該資料。那麼,在第一個事務中的兩次讀資料之間,由於第二個事務的修改導致第一個事務兩次讀取的資料可能不太一樣。這就發生了在一個事務內兩次讀到的資料是不一樣的情況,因此稱為不可重複讀。
幻讀(Phantom read): 幻讀與不可重複讀類似。它發生在一個事務(T1)讀取了幾行資料,接著另一個併發事務(T2)插入了一些資料時。在隨後的查詢中,第一個事務(T1)就會發現多了一些原本不存在的記錄,就好像發生了幻覺一樣,所以稱為幻讀。
不可重複讀和幻讀區別:
不可重複讀的重點是修改比如多次讀取一條記錄發現其中某些列的值被修改,幻讀的重點在於新增或者刪除比如多次讀取一條記錄發現記錄增多或減少了

19、事務隔離級別有哪些?MySQL的預設隔離級別是?

SQL 標準定義了四個隔離級別:
READ-UNCOMMITTED(讀取未提交): 最低的隔離級別,允許讀取尚未提交的資料變更,可能會導致髒讀、幻讀或不可重複讀。
READ-COMMITTED(讀取已提交): 允許讀取併發事務已經提交的資料,可以阻止髒讀,但是幻讀或不可重複讀仍有可能發生。
REPEATABLE-READ(可重複讀): 對同一欄位的多次讀取結果都是一致的,除非資料是被本身事務自己所修改,可以阻止髒讀和不可重複讀,但幻讀仍有可能發生
SERIALIZABLE(可序列化): 最高的隔離級別,完全服從ACID的隔離級別。所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止髒讀、不可重複讀以及幻讀

MySQL InnoDB 儲存引擎的預設支援的隔離級別是 REPEATABLE-READ(可重讀)。我們可以通過SELECT @@tx_isolation; 命令來檢視


mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+

這裡需要注意的是:與 SQL 標準不同的地方在於 InnoDB 儲存引擎在 REPEATABLE-READ(可重讀)事務隔離級別下使用的是Next-Key
Lock 鎖演算法,因此可以避免幻讀的產生,這與其他資料庫系統(如SQL Server) 是不同的。所以說InnoDB 儲存引擎的預設支援的隔離級別是REPEATABLE-READ(可重讀) 已經可以完全保證事務的隔離性要求,即達到了 SQL標準的 SERIALIZABLE(可序列化) 隔離級別。因為隔離級別越低,事務請求的鎖越少,所以大部分資料庫系統的隔離級別都是 READCOMMITTED(讀取提交內容) ,但是你要知道的是InnoDB 儲存引擎預設使用 REPEAaTABLEREAD(可重讀) 並不會有任何效能損失

InnoDB 儲存引擎在 分散式事務 的情況下一般會用到 SERIALIZABLE(可序列化) 隔離級別。

20、大表如何優化?

當MySQL單表記錄數過大時,資料庫的CRUD效能會明顯下降,一些常見的優化措施如下:
限定資料的範圍
務必禁止不帶任何限制資料範圍條件的查詢語句。比如:我們當用戶在查詢訂單歷史的時候,我們可以控制在一個月的範圍內;
讀/寫分離
經典的資料庫拆分方案,主庫負責寫,從庫負責讀;
垂直分割槽
根據資料庫裡面資料表的相關性進行拆分。 例如,使用者表中既有使用者的登入資訊又有使用者的基本資訊,可以將使用者表拆分成兩個單獨的表,甚至放到單獨的庫做分庫。
簡單來說垂直拆分是指資料表列的拆分,把一張列比較多的表拆分為多張表。 如下圖所示,這樣來說大家應該就更容易理解了

垂直拆分的優點: 可以使得列資料變小,在查詢時減少讀取的Block數,減少I/O次數。此外,垂直分割槽可以簡化表的結構,易於維護。
垂直拆分的缺點: 主鍵會出現冗餘,需要管理冗餘列,並會引起Join操作,可以通過在應用層進行
Join來解決。此外,垂直分割槽會讓事務變得更加複雜;

21、水平分割槽

保持資料表結構不變,通過某種策略儲存資料分片。這樣每一片資料分散到不同的表或者庫中,達到了分散式的目的。 水平拆分可以支撐非常大的資料量。
水平拆分是指資料錶行的拆分,表的行數超過200萬行時,就會變慢,這時可以把一張的表的資料拆成多張表來存放。舉個例子:我們可以將使用者資訊表拆分成多個使用者資訊表,這樣就可以避免單一表資料量過大對效能造成影響。

水平拆分可以支援非常大的資料量。需要注意的一點是:分表僅僅是解決了單一表資料過大的問題,但由於表的資料還是在同一臺機器上, 其實對於提升MySQL併發能力沒有什麼意義,所以 水平拆分最好分庫 。
水平拆分能夠 支援非常大的資料量儲存,應用端改造也少,但 分片事務難以解決 ,跨節點Join效能較差,邏輯複雜。《Java工程師修煉之道》的作者推薦 儘量不要對資料進行分片,因為拆分會帶來邏輯、部署、運維的各種複雜度 ,一般的資料表在優化得當的情況下支撐千萬以下的資料量是沒有太大問題的。如果實在要分片,儘量選擇客戶端分片架構,這樣可以減少一次和中介軟體的網路I/O。
下面補充一下資料庫分片的兩種常見方案:

  1. 客戶端代理: 分片邏輯在應用端,封裝在jar包中,通過修改或者封裝JDBC層來實現。 噹噹網的Sharding-JDBC 、阿里的TDDL是兩種比較常用的實現。
  2. 中介軟體代理: 在應用和資料中間加了一個代理層。分片邏輯統一維護在中介軟體服務中。 我們現在談的 Mycat 、360的Atlas、網易的DDB等等都是這種架構的實現。

詳細內容可以參考: MySQL大表優化方案: https://segmentfault.com/a/1190000006158186

22、分庫分表之後,id 主鍵如何處理

因為要是分成多個表之後,每個表都是從 1 開始累加,這樣是不對的,我們需要一個全域性唯一的 id 來支援。
生成全域性 id 有下面這幾種方式:
UUID: 不適合作為主鍵,因為太長了,並且無序不可讀,查詢效率低。比較適合用於生成唯一的名字的標示比如檔案的名字。

資料庫自增 id : 兩臺資料庫分別設定不同步長,生成不重複ID的策略來實現高可用。這種方式生成的 id 有序,但是需要獨立部署資料庫例項,成本高,還會有效能瓶頸。
利用 redis 生成 id : 效能比較好,靈活方便,不依賴於資料庫。但是,引入了新的元件造成系統更加複雜,可用性降低,編碼更加複雜,增加了系統成本。

Twitter的snowflake演算法: Github 地址:https://github.com/twitter-archive/snowflake。
美團的Leaf分散式ID生成系統 :Leaf 是美團開源的分散式ID生成器,能保證全域性唯一性、趨勢遞增、單調遞增、資訊保安,裡面也提到了幾種分散式方案的對比,但也需要依賴關係資料庫、Zookeeper等中介軟體。感覺還不錯。美團技術團隊的一篇文章:https://tech.meituan. com/2017/04/21/mt-leaf.html

23、儲存過程(特定功能的 SQL 語句集)

一組為了完成特定功能的 SQL 語句集,儲存在資料庫中,經過第一次編譯後再次呼叫不需要再次編譯,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。儲存過程是資料庫中的一個重要物件。

24、儲存過程優化思路

  1. 儘量利用一些 sql 語句來替代一些小迴圈,例如聚合函式,求平均函式等。
  2. 中間結果存放於臨時表,加索引。
  3. 少使用遊標。 sql 是個集合語言,對於集合運算具有較高效能。而 cursors 是過程運算。比如對一個 100 萬行的資料進行查詢。遊標需要讀表 100 萬次,而不使用遊標則只需要少量幾次讀取。
  4. 事務越短越好。 sqlserver 支援併發操作。如果事務過多過長,或者隔離級別過高,都會造成併發操作的阻塞,死鎖。導致查詢極慢,cpu 佔用率極地。
  5. 使用 try-catch 處理錯誤異常。
  6. 查詢語句儘量不要放在迴圈內

25、觸發器(一段能自動執行的程式)

觸發器是一段能自動執行的程式,是一種特殊的儲存過程, 觸發器和普通的儲存過程的區別是:觸發器是當對某一個表進行操作時觸發。諸如: update、 insert、 delete 這些操作的時候,系統會自動呼叫執行該表上對應的觸發器。 SQL Server 2005 中觸發器可以分為兩類:
DML 觸發器和DDL 觸發器,其中 DDL 觸發器它們會影響多種資料定義語言語句而激發,這些語句有 create、alter、 drop 語句。

26、資料庫併發策略

併發控制一般採用三種方法,分別是樂觀鎖和悲觀鎖以及時間戳。

27、MySQL 中有哪幾種鎖?

  1. 表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低。
  2. 行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。
  3. 頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般

28、MySQL 中有哪些不同的表格?

共有 5 種類型的表格:

  1. MyISAM
  2. Heap
  3. Merge
  4. INNODB
  5. ISAM

29、簡述在 MySQL 資料庫中 MyISAM 和 InnoDB 的區別

MyISAM:
不支援事務,但是每次查詢都是原子的; 支援表級鎖,即每次操作是對整個表加鎖; 儲存表的總行數;
一個 MYISAM 表有三個檔案:索引檔案、表結構檔案、資料檔案;
採用菲聚集索引,索引檔案的資料域儲存指向資料檔案的指標。輔索引與主索引基本一致,但是輔索引不用保證唯一性。
InnoDb:
支援 ACID 的事務,支援事務的四種隔離級別; 支援行級鎖及外來鍵約束:因此可以支援寫併發;

不儲存總行數:
一個 InnoDb 引擎儲存在一個檔案空間(共享表空間,表大小不受作業系統控制,一個表可能分佈在多個檔案裡),也有可能為多個(設定為獨立表空,表大小受作業系統檔案大小限制,一般為 2G),受作業系統檔案大小的限制;
主鍵索引採用聚集索引(索引的資料域儲存資料檔案本身),輔索引的資料域儲存主鍵的值;因此從輔索引查詢資料,需要先通過輔索引找到主鍵值,再訪問輔索引;最好使用自增主鍵,防止插入資料時,為維持 B+樹結構,檔案的大調整。

30、MySQL 中 InnoDB 支援的四種事務隔離級別名稱,以及逐級之間的區別?

SQL 標準定義的四個隔離級別為:

  1. read uncommited :讀到未提交資料
  2. read committed:髒讀,不可重複讀
  3. repeatable read: 可 重 讀
  4. serializable :序列事物

31、CHAR 和 VARCHAR 的區別?

  1. CHAR 和 VARCHAR 型別在儲存和檢索方面有所不同
  2. CHAR 列長度固定為建立表時宣告的長度,長度值範圍是 1 到 255 當 CHAR值被儲存時,它們被用空格填充到特定長度,檢索 CHAR 值時需刪除尾隨空格。

32、主鍵和候選鍵有什麼區別?

表格的每一行都由主鍵唯一標識,一個表只有一個主鍵。
主鍵也是候選鍵。按照慣例,候選鍵可以被指定為主鍵,並且可以用於任何外來鍵引用。

33、myisamchk 是用來做什麼的?

它用來壓縮 MyISAM 表,這減少了磁碟或記憶體使用。

34、MyISAM Static 和 MyISAM Dynamic 有什麼區別?

在 MyISAM Static 上的所有欄位有固定寬度。動態 MyISAM 表將具有像 TEXT,BLOB 等欄位,以適應不同長度的資料型別。
MyISAM Static 在受損情況下更容易恢復。

35、如果一個表有一列定義為 TIMESTAMP,將發生什麼?

每當行被更改時,時間戳欄位將獲取當前時間戳。
列設定為 AUTO INCREMENT 時,如果在表中達到最大值,會發生什麼情況?
它會停止遞增,任何進一步的插入都將產生錯誤,因為金鑰已被使用。
怎樣才能找出最後一次插入時分配了哪個自動增量?
LAST_INSERT_ID 將返回由 Auto_increment 分配的最後一個值,並且不需要指定表名稱

36、你怎麼看到為表格定義的所有索引?

索引是通過以下方式為表格定義的:

SHOW INDEX FROM ;

37、LIKE 宣告中的%和_是什麼意思?

%對應於 0 個或更多字元,_只是 LIKE 語句中的一個字元
如何在 Unix 和 MySQL 時間戳之間進行轉換?
UNIX_TIMESTAMP 是從 MySQL 時間戳轉換為 Unix 時間戳的命令
FROM_UNIXTIME 是從 Unix 時間戳轉換為 MySQL 時間戳的命令

38、列對比運算子是什麼?

在 SELECT 語句的列比較中使用=,<>,<=,<,> =,>,<<,>>,<=>,AND,OR 或 LIKE 運算子。

39、BLOB 和 TEXT 有什麼區別?

BLOB 是一個二進位制物件,可以容納可變數量的資料。TEXT 是一個不區分大小寫的 BLOB。

BLOB 和 TEXT 型別之間的唯一區別在於對 BLOB 值進行排序和比較時區分大小寫,對 TEXT 值不區分大小寫。

40、MySQL_fetch_array 和 MySQL_fetch_object 的區別是什麼?

以 下 是 MySQL_fetch_array 和 MySQL_fetch_object 的 區 別 : MySQL_fetch_array() – 將結果行作為關聯陣列或來自資料庫的常規陣列返回。MySQL_fetch_object – 從資料庫返回結果行作為物件。

41、MyISAM 表格將在哪裡儲存,並且還提供其儲存格式?

每個 MyISAM 表格以三種格式儲存在磁碟上:
·“.frm”檔案儲存表定義
·資料檔案具有“.MYD”(MYData)副檔名索引檔案具有“.MYI”(MYIndex)副檔名

42、MySQL 如何優化 DISTINCT?

DISTINCT 在所有列上轉換為 GROUP BY,並與 ORDER BY 子句結合使用。
SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;

43、如何顯示前 50 行?

在 MySQL 中,使用以下程式碼查詢顯示前 50 行:

44、可以使用多少列建立索引?

任何標準表最多可以建立 16 個索引列 。

45、NOW()和 CURRENT_DATE()有什麼區別?

NOW()命令用於顯示當前年份,月份,日期,小時,分鐘和秒。CURRENT_DATE()僅顯示當前年份,月份和日期。

46、什麼是非標準字串型別?

  1. TINYTEXT
  2. TEXT
  3. MEDIUMTEXT
  4. LONGTEXT

47、什麼是通用 SQL 函式?

  1. CONCAT(A, B) – 連線兩個字串值以建立單個字串輸出。通常用於將兩個或多個欄位合併為一個欄位。
  2. FORMAT(X, D)- 格式化數字 X 到 D 有效數字。
  3. CURRDATE(), CURRTIME()- 返回當前日期或時間。
  4. NOW() – 將當前日期和時間作為一個值返回。
  5. MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() – 從日期值中提取給定資料。
  6. HOUR(),MINUTE(),SECOND() – 從時間值中提取給定資料。
  7. DATEDIFF(A,B) – 確定兩個日期之間的差異,通常用於計算年齡
  8. SUBTIMES(A,B) – 確定兩次之間的差異。
  9. FROMDAYS(INT) – 將整數天數轉換為日期值

48、MySQL 支援事務嗎?

在預設模式下,MySQL 是 autocommit 模式的,所有的資料庫更新操作都會即時提交,所以在預設情況下,MySQL 是不支援事務的。
但是如果你的 MySQL 表型別是使用 InnoDB Tables 或 BDB tables 的話,你的MySQL 就可以使用事務處理,使用 SET AUTOCOMMIT=0 就可以使 MySQL 允許在非 autocommit 模式,在非autocommit 模式下,你必須使用 COMMIT 來提交你的更改,或者用 ROLLBACK來回滾你的更改。

49、MySQL 裡記錄貨幣用什麼欄位型別好

NUMERIC 和 DECIMAL 型別被 MySQL 實現為同樣的型別,這在 SQL92 標準允許。他們被用於儲存值,該值的準確精度是極其重要的值, 例如與金錢有關的資料。當宣告一個類是這些型別之一時,精度和規模的能被(並且通常是)指定。
例如:
在這個例子中,9(precision)代表將被用於儲存值的總的小數位數,而 2(scale)代表將被用於儲存小數點後的位數。因此,在這種情況下,能被儲存在 salary 列中的值的範圍是從-9999999.99 到
9999999.99。

salary DECIMAL(9,2)

在這個例子中,9(precision)代表將被用於儲存值的總的小數位數,而 2(scale)代表將被用於儲存小數點後的位數。因此,在這種情況下,能被儲存在 salary 列中的值的範圍是從-9999999.99 到
9999999.99。

50、MySQL 有關許可權的表都有哪幾個?

MySQL 伺服器通過許可權表來控制使用者對資料庫的訪問,許可權表存放在 MySQL 資料庫裡,由 MySQL_install_db 指令碼初始化。這些許可權表分別 user,db,table_priv,columns_priv 和 host。

歡迎關注
CSDN:程式設計師小羊
微信公眾號:程式設計師小羊
部落格園:程式設計師小羊