mysql面試專題

1.數據庫三範式是什麼?

  1. 第一範式(1NF):字段具有原子性,不可再分。(所有關係型數據庫系 統都滿足第一範式數據庫表中的字段都是單一屬性的,不可再分)
  2. 第二範式(2NF)是在第一範式(1NF)的基礎上建立起來的,即滿足 第二範式(2NF)必須先滿足第一範式(1NF)。要求數據庫表中的每 個實例或行必須可以被惟一地區分。通常需要爲表加上一個列,以存儲 各個實例的惟一標識。這個惟一屬性列被稱爲主關鍵字或主鍵。
  3. 滿足第三範式(3NF)必須先滿足第二範式(2NF)。簡而言之,第三 範式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關 鍵字信息。 >所以第三範式具有如下特徵: >>
    1.每一列只有一個 值 >>
    2.每一行都能區分。 >>
    3.每一個表都不包含其他表已經包含 的非主關鍵字信息。

2.有哪些數據庫優化方面的經驗?

  1. 用 PreparedStatement, 一般來說比 Statement 性能高:一個 sql 發給服務器去執行,涉及步驟:語法檢查、語義分析, 編譯,緩存。
  2. 有外鍵約束會影響插入和刪除性能,如果程序能夠保證數據的完整性, 那在設計數據庫時就去掉外鍵。
  3. 表中允許適當冗餘,譬如,主題帖的回覆數量和最後回覆時間等
  4. UNION ALL 要比 UNION 快很多,所以,如果可以確認合併的兩個結 果集中不包含重複數據且不需要排序時的話,那麼就使用 UNION ALL。 >>UNION 和 UNION ALL 關鍵字都是將兩個結果集合併爲一 個,但這兩者從使用和效率上來說都有所不同。 >1. 對重複結果的處 理:UNION 在進行錶鏈接後會篩選掉重複的記錄,Union All 不會去除 重複記錄。 >2. 對排序的處理:Union 將會按照字段的順序進行排 序;UNION ALL 只是簡單的將兩個結果合併後就返回。

3.請簡述常用的索引有哪些種類?

1.普通索引: 即針對數據庫表創建索引
2. 唯一索引: 與普通索引類似,不同的就是:MySQL 數據庫索引列的值 必須唯一,但允許有空值
3. 主鍵索引: 它是一種特殊的唯一索引,不允許有空值。一般是在建表的 時候同時創建主鍵索引
4. 組合索引: 爲了進一步榨取 MySQL 的效率,就要考慮建立組合索引。 即將數據庫表中的多個字段聯合起來作爲一個組合索引。

4.以及在 mysql 數據庫中索引的工作機制是什麼?

數據庫索引,是數據庫管理系統中一個排序的數據結構,以協助快速查詢、更 新數據庫表中數據。索引的實現通常使用 B 樹及其變種 B+樹

5.MySQL 的基礎操作命令:

  1. MySQL 是否處於運行狀態:Debian 上運行命令 service mysql status,在 RedHat 上運行命令 service mysqld status
  2. 開啓或停止 MySQL 服務 :運行命令 service mysqld start 開啓服 務;運行命令 service mysqld stop 停止服務
  3. Shell 登入 MySQL: 運行命令 mysql -u root -p
  4. 列出所有數據庫:運行命令 show databases;
  5. 切換到某個數據庫並在上面工作:運行命令 use databasename; 進入 名爲 databasename 的數據庫
  6. 列出某個數據庫內所有表: show tables;
  7. 獲取表內所有 Field 對象的名稱和類型 :describe table_name;

6.mysql 的複製原理以及流程。

Mysql 內建的複製功能是構建大型,高性能應用程序的基礎。將 Mysql 的數據 分佈到多個系統上去,這種分佈的機制,是通過將 Mysql 的某一臺主機的數據 複製到其它主機(slaves)上,並重新執行一遍來實現的。 * 複製過程中一 個服務器充當主服務器,而一個或多個其它服務器充當從服務器。主服務器將 更新寫入二進制日誌文件,並維護文件的一個索引以跟蹤日誌循環。這些日誌 可以記錄發送到從服務器的更新。 當一個從服務器連接主服務器時,它通知主 服務器在日誌中讀取的最後一次成功更新的位置。從服務器接收從那時起發生 的任何更新,然後封鎖並等待主服務器通知新的更新。
過程如下
1.主服務器 把更新記錄到二進制日誌文件中。
2.從服務器把主服務器的二進制日誌拷貝 到自己的中繼日誌(replay log)中。
3. 從服務器重做中繼日誌中的時間, 把更新應用到自己的數據庫上。

7.mysql 支持的複製類型?

  1. 基於語句的複製: 在主服務器上執行的 SQL 語句,在從服務器上執行 同樣的語句。MySQL 默認採用基於語句的複製,效率比較高。 一旦發 現沒法精確複製時,會自動選着基於行的複製。
  2. 基於行的複製:把改變的內容複製過去,而不是把命令在從服務器上執 行一遍. 從 mysql5.0 開始支持
  3. 混合類型的複製: 默認採用基於語句的複製,一旦發現基於語句的無法 精確的複製時,就會採用基於行的複製。

8.mysql 中 myisam 與 innodb 的區別?

  1. 事務支持 > MyISAM :強調的是性能,每次查詢具有原子性 , 其執行數 度比 InnoDB 類型更快,但是不提供事務支持。 > InnoDB:提供事 務支持事務,外部鍵等高級數據庫功能。 具有事務(commit)、回滾 (rollback)和崩潰修復能力(crash recovery capabilities)的事務安全 (transaction-safe (ACID compliant))型表。
  2. InnoDB 支持行級鎖,而 MyISAM 支持表級鎖. >> 用戶在操作 myisam 表時,select,update,delete,insert 語句都會給表自動 加鎖,如果加鎖以後的表滿足 insert 併發的情況下,可以在表的尾部插 入新的數據。
  3. InnoDB 支持 MVCC, 而 MyISAM 不支持
  4. InnoDB 支持外鍵,而 MyISAM 不支持
  5. 表主鍵 > MyISAM :允許沒有任何索引和主鍵的表存在,索引都是保 存行的地址。 > InnoDB:如果沒有設定主鍵或者非空唯一索引,就會 自動生成一個 6 字節的主鍵(用戶不可見),數據是主索引的一部分,附 加索引保存的是主索引的值。
  6. InnoDB 不支持全文索引,而 MyISAM 支持。
  7. 可移植性、備份及恢復 > MyISAM :數據是以文件的形式存儲,所以 在跨平臺的數據轉移中會很方便。在備份和恢復時可單獨針對某個表進 行操作。 > InnoDB:免費的方案可以是拷貝數據文件、備份 binlog,或者用 mysqldump,在數據量達到幾十 G 的時候就相對痛 苦了
  8. 存儲結構 > MyISAM :每個 MyISAM 在磁盤上存儲成三個文件。第一 個文件的名字以表的名字開始,擴展名指出文件類型。 .frm 文件存儲表 定義。數據文件的擴展名爲 .MYD (MYData) 。索引文件的擴展名 是 .MYI (MYIndex) 。 > InnoDB:所有的表都保存在同一個數據文件 中(也可能是多個文件,或者是獨立的表空間文件),InnoDB 表的大 小隻受限於操作系統文件的大小,一般爲 2GB。

9.mysql 中 varchar 與 char 的區別以及 varchar(50)中的 50 代表的涵 義?

1. varchar 與 char 的區別: char 是一種固定長度的類型,varchar 則是 一種可變長度的類型.
2. varchar(50)中 50 的涵義 : 最多存放 50 個字節
3. int(20)中 20 的涵義: int(M)中的 M indicates the maximum display width (最大顯示寬度)for integer types. The maximum legal display width is 255.

10.MySQL 中 InnoDB 支持的四種事務隔離級別名稱,以及逐級之間的區別?

1.Read Uncommitted(讀取未提交內容) >> 在該隔離級別,所有事 務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應 用,因爲它的性能也不比其他級別好多少。讀取未提交的數據,也被稱 之爲髒讀(Dirty Read)。
2. Read Committed(讀取提交內容) >> 這是大多數數據庫系統的默 認隔離級別(但不是 MySQL 默認的)。它滿足了隔離的簡單定義:一 個事務只能看見已經提交事務所做的改變。這種隔離級別也支持所謂的 不可重複讀(Nonrepeatable Read),因爲同一事務的其他實例在該 實例處理其間可能會有新的 commit,所以同一 select 可能返回不同結 果。
3. Repeatable Read(可重讀) >> 這是 MySQL 的默認事務隔離級 別,它確保同一事務的多個實例在併發讀取數據時,會看到同樣的數據 行。不過理論上,這會導致另一個棘手的問題:幻讀(Phantom Read)。簡單的說,幻讀指當用戶讀取某一範圍的數據行時,另一個事 務又在該範圍內插入了新行,當用戶再讀取該範圍的數據行時,會發現 有新的“幻影” 行。InnoDB 和 Falcon 存儲引擎通過多版本併發控制 (MVCC,Multiversion Concurrency Control 間隙鎖)機制解決了 該問題。注:其實多版本只是解決不可重複讀問題,而加上間隙鎖(也 就是它這裏所謂的併發控制)才解決了幻讀問題。
4. Serializable(可串行化) >> 這是最高的隔離級別,它通過強制事務 排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個 讀的數據行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖 競爭。

11.表中有大字段 X(例如:text 類型),且字段 X 不會經常更新,以讀爲 爲主,將該字段拆成子表好處是什麼?

如果字段裏面有大字段(text,blob)類型的,而且這些字段的訪問並不多,這 時候放在一起就變成缺點了。 MYSQL 數據庫的記錄存儲是按行存儲的,數據 塊大小又是固定的(16K),每條記錄越小,相同的塊存儲的記錄就越多。此 時應該把大字段拆走,這樣應付大部分小字段的查詢時,就能提高效率。當需 要查詢大字段時,此時的關聯查詢是不可避免的,但也是值得的。拆分開後, 對字段的 UPDAE 就要 UPDATE 多個表了

12.MySQL 中 InnoDB 引擎的行鎖是通過加在什麼上完成(或稱實現) 的?

InnoDB 行鎖是通過給索引上的索引項加鎖來實現的,這一點 MySQL 與 Oracle 不同,後者是通過在數據塊中對相應數據行加鎖來實現的。InnoDB 這 種行鎖實現特點意味着:只有通過索引條件檢索數據,InnoDB 才使用行級 鎖,否則,InnoDB 將使用表鎖!

13.MySQL 中控制內存分配的全局參數,有哪些?

1. Keybuffersize: > * keybuffersize 指定索引緩衝區的大小, 它決定索引處理的速度,尤其是索引讀的速度。通過檢查狀態值 Keyreadrequests 和 Keyreads ,可以知道 keybuffersize 設置是否 合理。比例 keyreads /keyreadrequests 應該儘可能的低,至少是 1:100,1:1000 更好(上述狀態值可以使用 SHOW STATUS LIKE ‘keyread%’ 獲得)。 > * keybuffersize 只對 MyISAM 表起作用。 即使你不使用 MyISAM 表,但是內部的臨時磁盤表是 MyISAM 表,也 要使用該值。可以使用檢查狀態值 createdtmpdisktables 得知詳情。 對於 1G 內存的機器,如果不使用 MyISAM 表,推薦值是 16M(864M) > * keybuffersize 設置注意事項 >>>1. 單個 keybuffer 的 大小不能超過 4G ,如果設置超過 4G ,就有可能遇到下面 3 個 bug: >>>>> http://bugs.mysql.com/bug.php?id=29446
>>>>> http://bugs.mysql.com/bug.php?id=29419
>>>>> http://bugs.mysql.com/bug.php?id=5731
>>>2. 建議 keybuffer 設置爲物理內存的 1/4(針對 MyISAM 引 擎),甚至是物理內存的 30%~40%,如果 keybuffersize 設置太大,
系統就會頻繁的換頁,降低系統性能。因爲 MySQL 使用操作系統的緩 存來緩存數據,所以我們得爲系統留夠足夠的內存;在很多情況下數據 要比索引大得多。 >>>3. 如果機器性能優越,可以設置多個 keybuffer, 分別讓不同的 keybuffer 來緩存專門的索引
2.innodbbufferpool_size > 表示緩衝池字節大小, InnoDB 緩存 表和索引數據的內存區域。 mysql 默認的值是 128M 。最大值與你的 CPU 體系結構有關,在 32 位操作系統,最大值是 4294967295 (2^32-1) ,在 64 位操作系統,最大值爲 18446744073709551615 (2^64-1) 。 > 在 32 位操作系統中, CPU 和操作系統實用的最大大小低於設置的最大值。如果設定的緩衝池 的大小大於 1G,設置 innodbbufferpoolinstances 的值大於 1. > * 數據讀寫在內存中非常快 , innodbbufferpoolsize 減少了對磁盤的讀 寫。 當數據提交或滿足檢查點條件後才一次性將內存數據刷新到磁盤 中。然而內存還有操作系統或數據庫其他進程使用, 一般設置 buffer pool 大小爲總內存的 3/4 至 4/5。 若設置不當, 內存使用可能浪費 或者使用過多。 對於繁忙的服務器, buffer pool 將劃分爲多個實例以 提高系統併發性, 減少線程間讀寫緩存的爭用。buffer pool 的大小首 先受 innodbbufferpool_instances 影響, 當然影響較小。
3. querycachesize > 當 mysql 接收到一條 select 類型的 query 時, mysql 會對這條 query 進行 hash 計算而得到一個 hash 值,然後 通過該 hash 值到 query cache 中去匹配,如果沒有匹配中,則將這個 hash 值存放在一個 hash 鏈表中,同時將 query 的結果集存放進 cache 中,存放 hash 值的鏈表的每一個 hash 節點存放了相應 query 結果集在 cache 中的地址,以及該 query 所涉及到的一些 table 的相 關信息;如果通過 hash 值匹配到了一樣的 query ,則直接將 cache 中 相應的 query 結果集返回給客戶端。如果 mysql 任何一個表中的任何 一條數據發生了變化,便會通知 query cache 需要與該 table 相關的 query 的 cache 全部失效,並釋放佔用的內存地址。 > query cache 優缺點 >> 1. query 語句的 hash 計算和 hash 查找帶來的資源消 耗。mysql 會對每條接收到的 select 類型的 query 進行 hash 計算然 後查找該 query 的 cache 是否存在,雖然 hash 計算和查找的效率已 經足夠高了,一條 query 所帶來的消耗可以忽略,但一旦涉及到高並 發,有成千上萬條 query 時,hash 計算和查找所帶來的開銷就的重視 了; >> 2. query cache 的失效問題。如果表變更比較頻繁,則會造 成 query cache 的失效率非常高。表變更不僅僅指表中的數據發生變 化,還包括結構或者索引的任何變化; >> 3. 對於不同 sql 但同一結 果集的 query 都會被緩存,這樣便會造成內存資源的過渡消耗。sql 的 字符大小寫、空格或者註釋的不同,緩存都是認爲是不同的 sql(因爲 他們的 hash 值會不同); >> 4. 相關參數設置不合理會造成大量內 存碎片,相關的參數設置會稍後介紹。
4. readbuffersize >是 MySQL 讀入緩衝區大小。對錶進行順序掃描 的請求將分配一個讀入緩衝區,MySQL 會爲它分配一段內存緩衝區。 readbuffersize 變量控制這一緩衝區的大小。如果對錶的順序掃描請求
非常頻繁,並且你認爲頻繁掃描進行得太慢,可以通過增加該變量值以 及內存緩衝區大小提高其性能。

14.若一張表中只有一個字段 VARCHAR(N)類型,utf8 編碼,則 N 最大值 爲多少(精確到數量級即可)?

由於 utf8 的每個字符最多佔用 3 個字節。而 MySQL 定義行的長度不能超過 65535,因此 N 的最大值計算方法爲:(65535-1-2)/3。減去 1 的原因是實 際存儲從第二個字節開始,減去 2 的原因是因爲要在列表長度存儲實際的字符 長度,除以 3 是因爲 utf8 限制:每個字符最多佔用 3 個字節。

15. [SELECT *] 和[SELECT 全部字段]的 2 種寫法有何優缺點?

1.前者要解析數據字典,後者不需要
2. 結果輸出順序,前者與建表列順序相同,後者按指定字段順序。
3. 表字段改名,前者不需要修改,後者需要改
4. 後者可以建立索引進行優化,前者無法優化
5. 後者的可讀性比前者要高

16.HAVNG 子句 和 WHERE 的異同點?

  1. 語法上:where 用表中列名,having 用 select 結果別名
  2. 影響結果範圍:where 從表讀出數據的行數,having 返回客戶端的行 數
  3. 索引:where 可以使用索引,having 不能使用索引,只能在臨時結果 集操作
  4. where 後面不能使用聚集函數,having 是專門使用聚集函數的。

17.MySQL 當記錄不存在時 insert,當記錄存在時 update,語句怎麼寫?

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

18.MySQL 的 insert 和 update 的 select 語句語法

SQL insert into student (stuid,stuname,deptid) select 10,‘xzm’,3 from student where stuid > 8; update student a inner join student b on b.stuID=10 set a.stuname=concat(b.stuname, b.stuID) where a.stuID=10 ;

19. 在 MySQL 中 ENUM 的用法是什麼?

ENUM 是一個字符串對象,用於指定一組預定義的值,並可在創建表時使用。
SQL 語法如下:

Create table size(name ENUM('Smail,'Medium','Large'); 

20. 列的字符串類型可以是什麼?

字符串類型是:
SET
BLOB
ENUM
CHAR
TEXT
VARCHAR

21. MySQL 中使用什麼存儲引擎?

存儲引擎稱爲表類型,數據使用各種技術存儲在文件中。
技術涉及:
Storage mechanism
Locking levels
Indexing
Capabilities and functions.

22. TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 數據類型上做什麼?

創建表時 TIMESTAMP 列用 Zero 更新。只要表中的其他字段發生更改,UPDATE
CURRENT_TIMESTAMP 修飾符就將時間戳字段更新爲當前時間。

23. 主鍵和候選鍵有什麼區別?

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

24. MySQL 數據庫服務器性能分析的方法命令有哪些?

Show status 一些值得監控的變量值: Bytes received 和 Bytes sent 和服務器之間
來往的流量。 Com服務器正在執行的命令。 Created在查詢執行期限間創建的臨時
表和文件。 Handler存儲引擎操作。 Select不同類型的聯接執行計劃。
Sort_* 幾種排序信息
Show session status like ‘Select’;
Show profiles SET profiling=1; Show profiles\G Show profile;

25. LIKE 和 REGEXP 操作有什麼區別?

LIKE 和 REGEXP 運算符用於表示 ^ 和%。
SELECT * FROM WHERE * REGEXP “^b”;
SELECT * FROM WHERE * LIKE “%b”;

26. BLOB 和 TEXT 有什麼區別?

BLOB
BLOB 是一個二進制對象,可以容納可變數量的數據。有四種類型的 BLOB

  • TINYBLOB
  • BLOB
  • MEDIUMBLOB
  • LONGBLOB
    它們只能在所能容納價值的最大長度上有所不同。

TEXT
TEXT 是一個不區分大小寫的 BLOB。四種 TEXT 類型

  • TINYTEXT

  • TEXT

  • MEDIUMTEXT 和

  • LONGTEXT

它們對應於四種 BLOB 類型,並具有相同的最大長度和存儲要求。
BLOB 和 TEXT 類型之間的唯一區別在於對 BLOB 值進行排序和比較時區分大小
寫,對 TEXT 值不區分大小寫。

27. 什麼是通用 SQL 函數?

數學函數
 Abs(num)求絕對值
 floor(num)向下取整
 ceil(num)向上取整

字符串函數

  • insert (s1,index,length,s2) 替換函數
    o S1 表示被替換的字符串
    o s2 表示將要替換的字符串
    o Index 表示被替換的位置, 從 1 開始
    o Lebgth 表示被替換的長度
  • upper(str),ucase(str)將字母改爲大寫
  • lower(str),lcase(str)將字母改爲小寫
  • left(str,length)返回 str 字符串的前 length 個字符
  • right(str,length)返回 str 字符串的後 length 個字符
  • substring(str,index,length)返回 str 字符串從 index 位開始長度爲 length
    個字符(index 從 1 開始)
  • reverse(str)將 str 字符串倒序輸出

日期函數
 curdate()、current_date( ) 獲取當前日期
 curtime()、current_time( ) 獲取當前日期
 now()獲取當前日期和時間
 datediff(d1、d2)d1 和 d2 之間的天數差
 adddate(date,num)返回 date 日期開始,之後 num 天的日期
 subdate(date,num)返回 date 日期開始,之前 num 天的日期

聚合函數
 Count(字段)根據某個字段統計總記錄數(當前數據庫保存到多少條數據)
 sum(字段)計算某個字段的數值總和
 avg(字段)計算某個字段的數值的平均值
 Max(字段)、min(字段)求某個字段最大或最小值

28. MySQL 中有哪幾種鎖?

MyISAM 支持表鎖,InnoDB 支持表鎖和行鎖默認爲行鎖
表級鎖:開銷小,加鎖快,不會出現死鎖。鎖定粒度大,發生鎖衝突的概率最高,併發量最低。
行級鎖:開銷大,加鎖慢,會出現死鎖。鎖力度小,發生鎖衝突的概率小,併發度最高。

29. MySQL 數據優化

  • 優化數據類型
    o 避免使用 NULL,NULL 需要特殊處理, 大多數時候應該使用 NOT
    NULL,或者使用一個特殊的值,如 0,-1 作爲默認值。
    o 僅可能使用更小的字段,MySQL 從磁盤讀取數據後是存儲到內存中
    的,然後使用 cpu 週期和磁盤 I/O 讀取它,這意味着越小的數據類
    型佔用的空間越小.
  • 小心字符集轉換
    o 客戶端或應用程序使用的字符集可能和表本身的字符集不一樣,這需要
    MySQL 在運行過程中隱含地進行轉換,此外,要確定字符集如 UTF
    8 是否支持多字節字符,因此它們需要更多的存儲空間。
  • _ 優化 count(my col) 和 count( ) *
  • 優化子查詢
    o 遇到子查詢時,MySQL 查詢優化引擎並不是總是最有效的,這就是爲
    什麼經常將子查詢轉換爲連接查詢的原因了,優化器已經能夠正確處理
    連接查詢了,當然要注意的一點是,確保連接表 (第二個表) 的連接列
    是有索引的,在第一個表上 MySQL 通常會相對於第二個表的查詢子
    集進行一次全表掃描,這是嵌套循環算法的一部分。
  • 優化 UNION
    o 在跨多個不同的數據庫時使用 UNION 是一個有趣的優化方法,
    UNION 從兩個互不關聯的表中返回數據,這就意味着不會出現重複的
    行,同時也必須對數據進行排序,我們知道排序是非常耗費資源的,特
    別是對大表的排序。
    o UNION ALL 可以大大加快速度,如果你已經知道你的數據不會包括重
    復行,或者你不在乎是否會出現重複的行,在這兩種情況下使用
    UNION ALL 更適合。此外,還可以在應用程序邏輯中採用某些方法避
    免出現重複的行,這樣 UNION ALL 和 UNION 返回的結果都是一樣
    的,但 UNION ALL 不會進行排序。

30. MySQL 的關鍵字。

添加索引:
alter table tableName add 索引(索引字段)
主鍵:primary key
唯一:unique
全局:fulltext
普通:index
多列: index index_name
頁級: 引擎 BDB。次鎖定相鄰的一組記錄。
表級: 引擎 MyISAM , 理解爲鎖住整個表,可以同時讀,寫不行。 行級: 引擎
INNODB , 單獨的一行記錄加鎖,對指定的記錄進行加鎖,這樣其它進程還是可以
對同一個表中的其它記錄進行操作。 表級鎖速度快,但衝突多,行級衝突少,但速度
慢。

31. 存儲引擎。

存儲引擎說白了就是如何存儲數據、如何爲存儲的數據建立索引和如何更新查詢數據等技術的實現方法。

  • MyISAM:這種引擎是 mysql 最早提供的。這種引擎又可以分爲靜態 MyISAM、動態 MyISAM 和壓縮 MyISAM 三種:
    o 靜態 MyISAM:如果數據表中的各數據列的長度都是預先固定好的,
    服務器將自動選擇這種表類型。因爲數據表中每一條記錄所佔用的空間
    都是一樣的,所以這種表存取和更新的效率非常高。當數據受損時,恢
    復工作也比較容易做。
    o 動態 MyISAM:如果數據表中出現 varchar、text 或 BLOB 字段
    時,服務器將自動選擇這種表類型。相對於靜態 MyISAM,這種表存
    儲空間比較小,但由於每條記錄的長度不一,所以多次修改數據後,數
    據表中的數據就可能離散的存儲在內存中,進而導致執行效率下降。同
    時,內存中也可能會出現很多碎片。因此,這種類型的表要經常用
    optimize table 命令或優化工具來進行碎片整理。
    o 壓縮 MyISAM:以上說到的兩種類型的表都可以用 myisamchk 工具
    壓縮。這種類型的表進一步減小了佔用的存儲,但是這種表壓縮之後不
    能再被修改。另外,因爲是壓縮數據,所以這種表在讀取的時候要先時
    行解壓縮。

但是,不管是何種 MyISAM 表,目前它都不支持事務,行級鎖和外鍵約束的功能。 

  • MyISAM Merge 引擎:這種類型是 MyISAM 類型的一種變種。合併表是將 幾個相同的 MyISAM 表合併爲一個虛表。常應用於日誌和數據倉庫。

  • InnoDB:InnoDB 表類型可以看作是對 MyISAM 的進一步更新產品,它提 供了事務、行級鎖機制和外鍵約束的功能。

  • memory(heap):這種類型的數據表只存在於內存中。它使用散列索引,所以
    數據的存取速度非常快。因爲是存在於內存中,所以這種類型常應用於臨時表 中。

  • archive:這種類型只支持 select 和 insert 語句,而且不支持索引。

  • Desc[ribe] tablename:查看數據表的結構。

  • show engines:命令可以顯示當前數據庫支持的存儲引擎情況。

31.數據庫備份

必須要在未登錄狀態下

  • 導出整個數據庫
    mysqldump -u 用戶名 -p 數據庫名 > 導出的文件名
  • 導出一個表
    mysqldump -u 用戶名 -p 數據庫名 表名> 導出的文件名
     導出一個數據庫結構
    mysqldump -u dbuser -p -d --add-drop-table dbname >d:/dbname_db.sql
    -d 沒有數據 --add-drop-table 在每個 create 語句之前增加一個 drop table

32. truncate delete drop 的區別。

drop(DDL 語句):是不可逆操作,會將表所佔用空間全部釋放掉;
truncate(DDL 語句):只針對於刪除表的操作,在刪除過程中不會激活與表有關的刪
除觸發器並且不會把刪除記錄放在日誌中;當表被 truncate 後,這個表和索引會恢
復到初始大小;
delete(DML 語句):可以刪除表也可以刪除行,但是刪除記錄會被計入日誌保存,
而且表空間大小不會恢復到原來;
執行速度:drop>truncate>delete。

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