今天面試官問我你會MySQL嗎?我上來就和他聊了一個小時

前言:作爲數據庫知識點,不管是什麼語言肯定都會問到,當問到MySql一定要硬起來,給大家準備了50道MySql相關的面試題,先搞明白這些,後面的我繼續準備。只要你關注我,我就會持續更新。

1.什麼是數據庫?

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

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

比如看建表的語法:

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。

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

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

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

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

數據文件和索引文件可以放置在不同的目錄,平均分佈io,獲得更快的速度。

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

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.如何選擇字符集?

建議在能夠完全滿足應用的前提下,儘量使用小的字符集。因爲更小的字符集意味着能夠節省空間、 減少網絡傳輸字節數,同時由於存儲空間的較小間接的提高了系統的性能。

有很多字符集可以保存漢字,比如 utf8、gb2312、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
  • 物理存儲角度

1、聚集索引(clustered index)

2、非聚集索引(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索引.

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中的數值類型?

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列有哪些?含義?

一、 id

SQL查詢中的序列號。

id列數字越大越先執行,如果說數字一樣大,那麼就從上往下依次執行。

二、select_type

三、table

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

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

四、type

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

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

1、system

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

2、const

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

3、eq_ref

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

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

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

4、ref

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

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

5、 fulltext

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

6、ref_or_null

跟ref類型類似,只是增加了null值的比較。實際用的不多。

7、index_merge

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

8、unique_subquery

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

9、index_subquery

該聯接類型類似於unique_subquery。適用於非唯一索引,可以返回重複值。

10、range

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

11、index

索引全表掃描,把索引從頭到尾掃一遍。這裏包含兩種情況: 一種是查詢使用了覆蓋索引,那麼它只需要掃描索引就可以獲得數據,這個效率要比全表掃描要快,因爲索引通常比數據表小,而且還能避免二次查詢。在extra中顯示Using index,反之,如果在索引上進行全表掃描,沒有Using index的提示。

12、all

全表掃描,性能最差。

五、possible_keys

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

六、Key

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

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

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

七、key_len

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

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

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

八、ref

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

九、rows

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

十、Extra

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

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

鏈接:http://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(*) 的時候,需要把數據一行一行地從引擎裏面讀出來,然後累積計數。

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