剛纔面試官問我你會Mysql嗎,我一聊一個多小時!

做爲數據庫知識點,無論是什麼語言確定都會問到,當問到MySql必定要硬起來,給你們準備了50道MySql相關的面試題,先搞明白這些,後面的我繼續準備。只要你關注我,我就會持續更新。mysql

1.什麼是數據庫?

數據庫是「按照數據結構來組織、存儲和管理數據的倉庫」。是一個長期存儲在計算機內的、有組織的、可共享的、統一管理的大量數據的集合。面試

2.如何查看某個操做的語法?

好比看建表的語法:sql

mysql> ? create table
Name: 'CREATE TABLE'
Description:
Syntax:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition,…)
    [table_options]
    [partition_options]

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(create_definition,…)]
    [table_options]
    [partition_options]
    [IGNORE | REPLACE]
    [AS] query_expression

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
複製代碼

3.MySql的存儲引擎有哪些?

MyISAM、 InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、 ARCHIVE、CSV、BLACKHOLE、FEDERATED。shell

Tips:InnoDB和BDB提供事務安全表,其餘存儲引擎都是非事務安全表。數據庫

4.經常使用的2種存儲引擎?

1.Myisam是Mysql的默認存儲引擎,當create建立新表時,未指定新表的存儲引擎時,默認使用Myisam。express

每一個MyISAM 在磁盤上存儲成三個文件。文件名都和表名相同,擴展名分別是 .frm (存儲表定義) 、.MYD (MYData,存儲數據)、.MYI (MYIndex,存儲索引)。緩存

數據文件和索引文件能夠放置在不一樣的目錄,平均分佈io,得到更快的速度。安全

2.InnoDB 存儲引擎提供了具備提交、回滾和崩潰恢復能力的事務安全。可是對比 Myisam 的存儲引擎,InnoDB 寫的處理效率差一些而且會佔用更多的磁盤空間以保留數據和索引。bash

6.能夠針對表設置引擎嗎?如何設置?

能夠, ENGINE=xxx 設置引擎。服務器

代碼示例:

create table person(
   id int primary key auto_increment,
   username varchar(32)
) ENGINE=InnoDB
複製代碼

6.選擇合適的存儲引擎?

選擇標準: 根據應用特色選擇合適的存儲引擎,對於複雜的應用系統能夠根據實際狀況選擇 多種存儲引擎進行組合. 下面是經常使用存儲引擎的適用環境:

  1. MyISAM: 默認的 MySQL 插件式存儲引擎, 它是在 Web、 數據倉儲和其餘應用環境下最常使用的存儲引擎之一。

  2. InnoDB:用於事務處理應用程序,具備衆多特性,包括 ACID 事務支持。

  3. Memory: 將 全部數據保存在RAM 中, 在 須要快速查找引用和其餘相似數據的環境下,可 提供極快的訪問。

  4. Merge:容許 MySQL DBA 或開發人員將一系列等同的 MyISAM 表以邏輯方式組合在一塊兒,並做爲 1 個對象引用它們。對於諸如數據倉儲等 VLDB 環境十分適合。

7.選擇合適的數據類型

前提: 使用適合存儲引擎。

選擇原則: 根據選定的存儲引擎,肯定如何選擇合適的數據類型下面的選擇方法按存儲引擎分類 :

  1. MyISAM 數據存儲引擎和數據列

    MyISAM數據表,最好使用固定長度的數據列代替可變長度的數據列。

  2. MEMORY存儲引擎和數據列

    MEMORY數據表目前都使用固定長度的數據行存儲,所以不管使用CHAR或VARCHAR列都沒有關係。二者都是做爲CHAR類型處理的。

  3. InnoDB 存儲引擎和數據列

    建議使用 VARCHAR類型

    對於InnoDB數據表,內部的行存儲格式沒有區分固定長度和可變長度列(全部數據行 都使用指向數據列值的頭指針) ,所以在本質上,使用固定長度的CHAR列不必定比使 用可變長度VARCHAR列簡單。 於是, 主要的性能因素是數據行使用的存儲總量。 因爲 CHAR 平均佔用的空間多於VARCHAR,所以使用VARCHAR來最小化須要處理的數據行的存儲總 量和磁盤I/O是比較好的。

8.char & varchar

保存和檢索的方式不一樣。它們的最大長度和是否尾部空格被保留等方面也不一樣。在存儲或檢索過程當中不進行大小寫轉換。

9.Mysql字符集

mysql服務器能夠支持多種字符集 (能夠用show character set命令查看全部mysql支持 的字符集) ,在同一臺服務器、同一個數據庫、甚至同一個表的不一樣字段均可以指定使用不 同的字符集。

mysql的字符集包括字符集(CHARACTER)和校對規則(COLLATION)兩個概念。

10.如何選擇字符集?

建議在可以徹底知足應用的前提下,儘可能使用小的字符集。由於更小的字符集意味着可以節省空間、 減小網絡傳輸字節數,同時因爲存儲空間的較小間接的提升了系統的性能。

有不少字符集能夠保存漢字,好比 utf八、gb23十二、gbk、latin1 等等,可是經常使用的是 gb2312 和 gbk。由於 gb2312 字庫比 gbk 字庫小,有些偏僻字(例如:洺)不能保存,所以 在選擇字符集的時候必定要權衡這些偏僻字在應用出現的概率以及形成的影響, 不能作出肯 定答覆的話最好選用 gbk。

11.什麼是索引?

在關係數據庫中,索引是一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。索引的做用至關於圖書的目錄,能夠根據目錄中的頁碼快速找到所需的內容。

12.索引設計原則?

  1. 搜索的索引列,不 必定是所要選擇的列。最適合索引的列是出如今WHERE子句中的列,或鏈接子句中指定的列,而不是出如今SELECT 關鍵字後的選擇列表中的列。

  2. 使用唯一索引。考慮某列中值的分佈。 對於唯一值的列,索引的效果最好,而具備多個 重複值的列,其索引效果最差。

  3. 使用短索引。若是對串列進行索引,應該指定一個前綴長度,只要有可能就應該這作樣。 例如,若是有一個 CHAR(200) 列,若是在前 10 個或 20 個字符內,多數值是唯一的, 那麼就不要對整個列進行索引。

  4. 利用最左前綴。在建立 一個 n 列的索引時,實際是建立了 MySQL 可利用的 n 個索引。 多列索引可起幾個索引的做用,由於可利用索引中最左邊的列集來匹配行。 這樣的列集 稱爲最左前綴。 (這與索引一個列的前綴不一樣,索引一個列的前綴是利用該的n前個字 符做爲索引值 )

  5. 不要過分索引。每一個額外的索引都要佔用額外的磁盤空間,並下降寫操做的性能,這一點咱們前面已經介紹 過。在修改表的內容時,索引必須進行更新,有時可能須要重構, 所以, 索引越多,所花的時間越長。

    若是有一個索引不多利用或從不使用,那麼會沒必要要地減緩表的修改速度。 此外,MySQL 在生成一個執行計劃時,要考慮各個索引,這也要費時間。

    建立多餘的索引給查詢優化帶來了更多的工做。索引太多,也可能會使 MySQL選擇不到所要使用的 最好索引。 只保持所需的索引有利於查詢優化。 若是想給已索引的表增長索引, 應 該考慮所要增長的索引是不是現有多列索引的最左索引。

  6. 考慮在列上進行的比較類型。 索引可用於「 <」、「 < = 」、「 = 」、「 > =」、「 > 」和 BETWEEN 運算。在模式具備一個直接量前綴時,索引也用於 LIKE 運算。若是隻將某個列用於其餘類型的運算時(如 STRCMP( )) ,對其進行索引沒有價值。

13.MySql有哪些索引?

  • 數據結構角度
  1. BTREE
  2. HASH
  3. FULLTEXT
  4. R-Tree
  • 物理存儲角度

一、彙集索引(clustered index)

二、非彙集索引(non-clustered index)

  • 從邏輯角度
  1. 普通索引:僅加速查詢
  2. 惟一索引:加速查詢 + 列值惟一(能夠有null)
  3. 主鍵索引:加速查詢 + 列值惟一(不能夠有null)+ 表中只有一個
  4. 組合索引:多列值組成一個索引,專門用於組合搜索,其效率大於索引合併
  5. 全文索引:對文本的內容進行分詞,進行搜索

14.Hash索引和B+樹索引的底層實現原理?

hash索引底層就是hash表,進行查詢時,調用一次hash函數就能夠獲取到相應的鍵值,以後進行回表查詢得到實際數據.

B+樹底層實現原理是多路平衡查找樹,對於每一次的查詢都是從根節點出發,查詢到葉子節點方能夠得到所查鍵值,而後查詢判斷是否須要回表查詢.

區別:

hash索引

1:hash索引進行等值查詢更快(通常狀況下)可是卻沒法進行範圍查詢.由於在hash索引中通過hash函數創建索引以後,索引的順序與原順序沒法保持一致,不能支持範圍查詢.

2:hash索引不支持模糊查詢以及多列索引的最左前綴匹配,由於hash函數的不可預測,eg:AAAA和AAAAB的索引沒有相關性.

3:hash索引任什麼時候候都避免不了回表查詢數據.

4:hash索引雖然在等值上查詢叫快,可是不穩定,性能不可預測,當某個鍵值存在大量重複的時候,發生hash碰撞,此時查詢效率可能極差.

5:hash索引不支持使用索引進行排序,由於hash函數的不可預測.

B+樹

1:B+樹的全部節點皆遵循(左節點小於父節點,右節點大於父節點,多叉樹也相似)天然支持範圍查詢.

2:在符合某些條件(聚簇索引,覆蓋索引等)的時候能夠只經過索引完成查詢.不須要回表查詢.

3:查詢效率比較穩定,對於查詢都是從根節點到葉子節點,且樹的高度較低.

結論

大多數狀況下,直接選擇B+樹索引能夠得到穩定且較好的查詢速度,而不須要使用Hash索引. 連接:blog.csdn.net/qq_44590469…

15. 非聚簇索引必定會回表查詢嗎?

不必定,這涉及到查詢語句所要求的字段是否所有命中了索引,若是所有命中了索引,那麼就沒必要再進行回表查詢.

舉個簡單的例子,假設咱們在員工表的年齡上創建了索引,那麼當進行select age from employee where age < 20的查詢時,在索引的葉子節點上,已經包含了age信息,不會再次進行回表查詢.

16.如何查詢最後一行記錄?

select * from table_name order by id desc limit 1;
複製代碼

17.MySQL自增id不連續問題?

  • 惟一鍵衝突
  • 事務回滾
  • 批量申請自增id的策略

18.sql注入問題?

緣由:用戶傳入的參數中注入符合sql的語法,從而破壞原有sql結構語意,達到攻擊效果。

19.什麼是3NF(範式)?

  • 1NF 指的是數據庫表中的任何屬性都具備原子性的,不可再分解
  • 2NF 是對記錄的唯一性約束,要求記錄有唯一標識,即實體的唯一性
  • 3NF是對字段冗餘性的約束,即任何字段不能由其餘字段派生出來,它要求字段沒有冗餘

20. NULL和空串判斷?

NULL值是沒有值,,它不是空串。若是指定''(兩個單引號,其間沒有字符),這在NOT NULL列中是容許的。空串是一個有效的值,它不是無值。

判斷NULL須要用 IS NULL 或者 IS NOT NULL。

21.什麼是事務?

能夠用來維護數據庫的完整性,它保證成批的MySQL操做要麼徹底執行,要麼徹底不執行。

22.事務4個特性?

事務是必須知足4個條件(ACID):

  • **原子性 Atomicity:**一個事務中的全部操做,要麼所有完成,要麼所有不完成,最小的執行單位。
  • **一致性 Consistency:**事務執行先後,都處於一致性狀態。
  • **隔離性 Isolation:**數據庫容許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性能夠防止多個事務併發執行時因爲交叉執行而致使數據的不一致。
  • **持久性 Durability:**事務執行完成後,對數據的修改就是永久的,即使系統故障也不會丟失。

23.事務隔離級別分別是?

  • READ_UNCOMMITTED 這是事務最低的隔離級別,它充許另一個事務能夠看到這個事務未提交的數據。解決第一類丟失更新的問題,可是會出現髒讀、不可重複讀、第二類丟失更新的問題,幻讀 。
  • READ_COMMITTED 保證一個事務修改的數據提交後才能被另一個事務讀取,即另一個事務不能讀取該事務未提交的數據。解決第一類丟失更新和髒讀的問題,但會出現不可重複讀、第二類丟失更新的問題,幻讀問題
  • REPEATABLE_READ 保證一個事務相同條件下先後兩次獲取的數據是一致的 (注意是 一個事務,能夠理解爲事務間的數據互不影響)解決第一類丟失更新,髒讀、不可重複讀、第二類丟失更新的問題,但會出幻讀。
  • SERIALIZABLE 事務串行執行,解決了髒讀、不可重複讀、幻讀。但效率不好,因此實際中通常不用。

24.InnoDB默認事務隔離級別?如何查看當前隔離級別

可重複讀(REPEATABLE-READ)

查看:

mysql> select @@global.tx_isolation;
+———————————+
| @@global.tx_isolation |
+———————————+
| REPEATABLE-READ       |
+———————————+
1 row in set, 1 warning (0.01 sec)
複製代碼

25.什麼是鎖?

數據庫的鎖是爲了支持對共享資源進行併發訪問,提供數據的完整性和一致性,這樣才能保證在高併發的狀況下,訪問數據庫的時候,數據不會出現問題。

26.死鎖?

是指兩個或兩個以上進程執行過程當中,因競爭共享資源形成的相互等待現象。

27.如何處理死鎖?

  • 設置超時時間。超時後自動釋放。

  • 發起死鎖檢測,主動回滾其中一條事務,讓其餘事務繼續執行。

28.如何建立用戶?受權?

建立用戶:

CREATE USER 'username'@'host' IDENTIFIED BY 'password';
複製代碼

受權:

GRANT privileges ON databasename.tablename TO 'username'@'host';
複製代碼
  • username:用戶名
  • host:能夠登錄的主機地址。本地用戶用localhost表示,任意遠程主機用通配符%。
  • password:登錄密碼,密碼能夠爲空表示不須要密碼登錄服務器
  • databasename: 數據庫名稱。
  • tablename:表名稱,*表明全部表。

29.如何查看錶結構?

​ desc table_name;

mysql> desc zipkin_spans;
+———————+———————+———+——+————+———+
| Field         | Type         | Null | Key | Default | Extra |
+———————+———————+———+——+————+———+
| trace_id_high | bigint(20)   | NO   | PRI | 0       |       |
| trace_id      | bigint(20)   | NO   | PRI | NULL    |       |
| id            | bigint(20)   | NO   | PRI | NULL    |       |
| name          | varchar(255) | NO   | MUL | NULL    |       |
| parent_id     | bigint(20)   | YES  |     | NULL    |       |
| debug         | bit(1)       | YES  |     | NULL    |       |
| start_ts      | bigint(20)   | YES  | MUL | NULL    |       |
| duration      | bigint(20)   | YES  |     | NULL    |       |
+———————+———————+———+——+————+———+
8 rows in set (0.01 sec)
複製代碼

30.Mysql刪除表的幾種方式?區別?

1.delete : 僅刪除表數據,支持條件過濾,支持回滾。記錄日誌。所以比較慢。

delete from table_name;
複製代碼

2.truncate: 僅刪除全部數據,不支持條件過濾,不支持回滾。不記錄日誌,效率高於delete。

truncate table table_name;
複製代碼

3.drop:刪除表數據同時刪除表結構。將表所佔的空間都釋放掉。刪除效率最高。

drop table table_name;
複製代碼

31.like走索引嗎?

Xxx% 走索引, %xxx不走索引。

32.什麼是回表?

在普通索引查到主鍵索引後,再去主鍵索引定位記錄。等於說非主鍵索引須要多走一個索引樹。

33.如何避免回表?

索引覆蓋被查詢的字段。

34.索引覆蓋是什麼?

若是一個索引包含(或覆蓋)全部須要查詢的字段的值,稱爲‘覆蓋索引’。

35.視圖的優缺點?

優勢

簡單化,數據所見即所得

安全性,用戶只能查詢或修改他們所能見到獲得的數據

邏輯獨立性,能夠屏蔽真實表結構變化帶來的影響

缺點

性能相對較差,簡單的查詢也會變得稍顯複雜

修改不方便,特變是複雜的聚合視圖基本沒法修改

36.主鍵和惟一索引區別?

本質區別,主鍵是一種約束,惟一索引是一種索引。

主鍵不能有空值(非空+惟一),惟一索引能夠爲空。

主鍵能夠是其餘表的外鍵,惟一索引不能夠。

一個表只能有一個主鍵,惟一索引 能夠多個。

均可以創建聯合主鍵或聯合惟一索引。

主鍵-》聚簇索引,惟一索引->非聚簇索引。

37.如何隨機獲取一條記錄?

SELECT * FROM table_name ORDER BY rand() LIMIT 1; 
複製代碼

38.Mysql中的數值類型?

image-20200422123555254

39.查看當前表有哪些索引?

show index from table_name;
複製代碼

40.索引不生效的狀況?

  • 使用不等於查詢
  • NULL值
  • 列參與了數學運算或者函數
  • 在字符串like時左邊是通配符.好比 %xxx
  • 當mysql分析全表掃描比使用索引快的時候不使用索引.
  • 當使用聯合索引,前面一個條件爲範圍查詢,後面的即便符合最左前綴原則,也沒法使用索引.

41.MVVC?

MVCC 全稱是多版本併發控制系統,InnoDB 的 MVCC 是經過在每行記錄後面保存兩個隱藏的列來實現,這兩個列一個保存了行的建立時間,一個保存行的過時時間(刪除時間)。固然存儲的並非真實的時間而是系統版本號(system version number)。每開始一個新的事務,系統版本號都會自動新增,事務開始時刻的系統版本號會做爲事務的版本號,用來查詢到每行記錄的版本號進行比較。

42.sql語句的執行流程?

客戶端鏈接數據庫,驗證身份。

獲取當前用戶權限。

當你查詢時,會先去緩存看看,若是有返回。

若是沒有,分析器對sql作詞法分析。

優化器對sql進行「它認爲比較好的優化」。

執行器負責具體執行sql語句。

最後把數據返回給客戶端。

43.如何獲取select 語句執行計劃?

explain sql;

44.explain列有哪些?含義?

image-20200501154131370

1、 id

SQL查詢中的序列號。

id列數字越大越先執行,若是說數字同樣大,那麼就從上往下依次執行。

2、select_type

image-20200501154212022

3、table

顯示這一行的數據是關於哪張表的。不必定是實際存在的表名。 能夠爲以下的值:

  • <unionM,N>: 引用id爲M和N UNION後的結果。
  • : 引用id爲N的結果派生出的表。派生表能夠是一個結果集,例如派生自FROM中子查詢的結果。
  • : 引用id爲N的子查詢結果物化獲得的表。即生成一個臨時表保存子查詢的結果。

4、type

這是最重要的字段之一,顯示查詢使用了何種類型。從最好到最差的鏈接類型依次爲:

system,const,eq_ref,ref,fulltext,ref_or_null,index_merge,unique_subquery,index_subquery,range,index,ALL

一、system

表中只有一行數據或者是空表,這是const類型的一個特例。且只能用於myisam和memory表。若是是Innodb引擎表,type列在這個狀況一般都是all或者index

二、const

最多隻有一行記錄匹配。當聯合主鍵或惟一索引的全部字段跟常量值比較時,join類型爲const。其餘數據庫也叫作惟一索引掃描

三、eq_ref

多表join時,對於來自前面表的每一行,在當前表中只能找到一行。這多是除了system和const以外最好的類型。當主鍵或惟一非NULL索引的全部字段都被用做join聯接時會使用此類型。

eq_ref可用於使用'='操做符做比較的索引列。比較的值能夠是常量,也能夠是使用在此表以前讀取的表的列的表達式。

相對於下面的ref區別就是它使用的惟一索引,即主鍵或惟一索引,而ref使用的是非惟一索引或者普通索引。 eq_ref只能找到一行,而ref能找到多行。

四、ref

對於來自前面表的每一行,在此表的索引中能夠匹配到多行。若聯接只用到索引的最左前綴或索引不是主鍵或惟一索引時,使用ref類型(也就是說,此聯接可以匹配多行記錄)。

ref可用於使用'='或'<=>'操做符做比較的索引列。

五、 fulltext

使用全文索引的時候是這個類型。要注意,全文索引的優先級很高,若全文索引和普通索引同時存在時,mysql無論代價,優先選擇使用全文索引

六、ref_or_null

跟ref類型相似,只是增長了null值的比較。實際用的很少。

七、index_merge

表示查詢使用了兩個以上的索引,最後取交集或者並集,常見and ,or的條件使用了不一樣的索引,官方排序這個在ref_or_null以後,可是實際上因爲要讀取多個索引,性能可能大部分時間都不如range

八、unique_subquery

用於where中的in形式子查詢,子查詢返回不重複值惟一值,能夠徹底替換子查詢,效率更高。 該類型替換了下面形式的IN子查詢的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr)

九、index_subquery

該聯接類型相似於unique_subquery。適用於非惟一索引,能夠返回重複值。

十、range

索引範圍查詢,常見於使用 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN()或者like等運算符的查詢中。

十一、index

索引全表掃描,把索引從頭至尾掃一遍。這裏包含兩種狀況: 一種是查詢使用了覆蓋索引,那麼它只須要掃描索引就能夠得到數據,這個效率要比全表掃描要快,由於索引一般比數據表小,並且還能避免二次查詢。在extra中顯示Using index,反之,若是在索引上進行全表掃描,沒有Using index的提示。

十二、all

全表掃描,性能最差。

5、possible_keys

查詢可能使用到的索引都會在這裏列出來。

6、Key

key列顯示MySQL實際使用的鍵(索引)

要想強制MySQL使用或忽視possible_keys列中的索引,可使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

select_type爲index_merge時,這裏可能出現兩個以上的索引,其餘的select_type這裏只會出現一個。

7、key_len

表示索引中使用的字節數。

key_len只計算where條件用到的索引長度,而排序和分組就算用到了索引,也不會計算到key_len中。

不損失精確性的狀況下,長度越短越好 。

8、ref

表示上述表的鏈接匹配條件,即哪些列或常量被用於查找索引列上的值。

9、rows

rows 也是一個重要的字段。 這是mysql估算的須要掃描的行數(不是精確值)。

10、Extra

該列包含MySQL解決查詢的詳細信息,有如下幾種狀況:

  • Using where:列數據是從僅僅使用了索引中的信息而沒有讀取實際的行動的表返回的,這發生在對錶的所有的請求列都是同一個索引的部分的時候,表示mysql服務器將在存儲引擎檢索行後再進行過濾。
  • Using temporary:表示MySQL須要使用臨時表來存儲結果集,常見於排序和分組查詢。
  • Using filesort:MySQL中沒法利用索引完成的排序操做稱爲「文件排序」。
  • Using join buffer:改值強調了在獲取鏈接條件時沒有使用索引,而且須要鏈接緩衝區來存儲中間結果。若是出現了這個值,那應該注意,根據查詢的具體狀況可能須要添加索引來改進能。
  • Impossible where:這個值強調了where語句會致使沒有符合條件的行。
  • Select tables optimized away:這個值意味着僅經過使用索引,優化器可能僅從聚合函數結果中返回一行。

連接:www.jianshu.com/p/8fab76bbf…

45.MySql最多建立多少列索引?

16

46.爲何最好創建一個主鍵?

主鍵是數據庫確保數據行在整張表惟一性的保障,即便業務上本張表沒有主鍵,也建議添加一個自增加的ID列做爲主鍵.設定了主鍵以後,在後續的刪改查的時候可能更加快速以及確保操做數據範圍安全.

47.字段爲何要求建議爲not null?

MySQL官網這樣介紹:

NULL columns require additional space in the rowto record whether their values are NULL. For MyISAM tables, each NULL columntakes one bit extra, rounded up to the nearest byte.

null值會佔用更多的字節,且會在程序中形成不少與預期不符的狀況.

48.varchar(10)和int(10)表明什麼含義

varchar的10表明了申請的空間長度,也是能夠存儲的數據的最大長度,而int的10只是表明了展現的長度,不足10位以0填充.也就是說,int(1)和int(10)所能存儲的數字大小以及佔用的空間都是相同的,只是在展現時按照長度展現。

49.視圖是什麼?對比普通表優點?

視圖(View)是一種虛擬存在的表,對於使用視圖的用戶來講基本上是透明的。視圖並 不在數據庫中實際存在,行和列數據來自定義視圖的查詢中使用的表,而且是在使用視圖時 動態生成的。

視圖相對於普通的表的優點主要包括如下幾項。

  • 簡單:使用視圖的用戶徹底不須要關心後面對應的表的結構、關聯條件和篩選條件,

    對用戶來講已是過濾好的複合條件的結果集。

  • 安全:使用視圖的用戶只能訪問他們被容許查詢的結果集,對錶的權限管理並不能

    限制到某個行某個列,可是經過視圖就能夠簡單的實現。

  • 數據獨立:一旦視圖的結構肯定了,能夠屏蔽表結構變化對用戶的影響,源表增長

    列對視圖沒有影響;源表修改列名,則能夠經過修改視圖來解決,不會形成對訪問 者的影響。

50.count(*)在不一樣引擎的實現方式?

MyISAM :把一個表的總行數存在了磁盤上,執行 count(*) 的時候會直接返回這個數,效率很高。

InnoDB : 比較麻煩,它執行 count(*) 的時候,須要把數據一行一行地從引擎裏面讀出來,而後累積計數。

參考:

  • 《深刻淺出MySQL》
  • 《高性能MySql》
  • 《MySQL技術內幕(第5版)》
  • 《MySQL必知必會》
  • 極客時間:MySQL實戰45講
  • 百度百科

新人博主求三連,同時關注個人公衆號【Java小咖秀】回覆面試便可白嫖一份《Java全級別工程獅面試題.pdf》 持續更新,堅持✊✊✊

相關文章
相關標籤/搜索