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

文章目錄

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。

----------------------------------------不要當大收藏家哦--------------------------------------------------------

擴展連接:加粗樣式更多請點擊這裏

博主公衆號程序員小羊 只發面試相關推文
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章