1. 程式人生 > 實用技巧 >MySQL--資料庫面試題彙集

MySQL--資料庫面試題彙集

目錄

Ⅰ.MySQL簡易內容

1.msyql的安裝

1.安裝方式
三種:
   1.原始碼包安裝
   2.二進位制安裝
   3.rpm包安裝

2.服務端和客戶端模型

1.資料庫構成三層的作用

#連線層
   1)驗證使用者身份,判斷使用者名稱和密碼
   2)提供兩種連線方式(tcp/ip連線    socket連線)
   3)與sql層建立互動的執行緒

#sql層
   1)接收連線層傳過來的資料
   2)判斷sql語句的語法
   3)判斷sql語句的語義
   4)解析器:解析sql語句,生成執行計劃
   5)優化器:選出執行計劃中最優的計劃
   6)執行器:執行計劃
     6.1 與儲存引擎層建立互動
     6.2 將優化後要執行的SQL發給儲存引擎層
   7)記錄快取,如果前端有redis,將資料快取至redis
   8)記錄日誌

#儲存引擎層
   1)與sql層建立互動,接收sql層傳來的sql語句
   2)與磁碟進行互動,獲取資料,將資料返回給sql層

3.mysql多例項

1.mysql使用者許可權管理
	授權的時候,單庫,單表,單列
	#所有
	grant all on *.* to rep@'172.16.1.%' identified by '123';
	
	#單庫
	grant all on mysql.* to rep@'172.16.1.%' identified by '123';
	
	#單表
	grant all on mysql.user to rep@'172.16.1.%' identified by '123';
	
	
2.多例項如何配置
#多例項配置
mysql多個配置檔案:
1.多個埠
2.多個socket檔案
3.多個日誌檔案
4.多個srver_id
5.多個數據目錄
6.生成多個數據庫

4.常用引數及sql語句

1.mysql命令常用引數
#mysql 常用的引數
-u:		#指定使用者   		mysql -uroot
-p:		#指定使用者的密碼	  mysql -uroot -p123
-h:		#指定連線的主機	  mysql -uroot -p123 -h172.16.1.51
-S:		#指定socket檔案		mysql -uroot -p123 -S /tmp/mysql.sock
-P:		#指定埠			mysql -uroot -p123 -P3307
-e:		#庫外執行sql語句	   mysql -uroot -p123 -e 'show databases'


2.資料庫語句的語義
3.SQL語句
    1)建庫語句
  create database db1;
	
4.select高階用法
	1)傳統連線
	2)自連線
	3)內外連線

5.mysql的索引

1.索引
	1)建立索引
	#建立表時建立索引(建立了主鍵索引)
	   create table test2(id int not null auto_increment primary key comment '學號');
	
	#已有表中給列新增索引(建立的是唯一鍵索引)
	   alter table student add unique key uni_key(name);
	   
	2)索引型別
	#索引
	   主鍵索引
	   唯一鍵索引
	   普通索引
	   字首索引
	   聯合索引
	   
	   
	3)索引不生效的情況
	##索引不生效:
	  1.索引本身失效
	  2.查詢條件使用函式在索引列上或者對索引列進行運算,運算包括(+,-,*等)
	  3.隱式轉換,會導致索引失效
	  4.<> 和 not in 和 or 也不走索引
	  5.like模糊查詢 % 位置決定走不走索引
	  6.聯合索引查詢的條件不是按照順序排列的,或者條件沒有聯合索引的第一個列

6.儲存引擎和事務

1.InnoDB儲存引擎
  #儲存引擎特點:
    01)InnoDB
        適合資料增刪改查
    02)MyISAM
        儲存一些只讀的資料
    03)MEMORY
        支援hash索引
    
    
2.核心特性
#核心特性:
  MVCC          #多併發
  事務
  行級鎖         #innodb支援行級鎖,myiasm支援表級鎖
  熱備份         #innodb支援熱備,myisam不支援熱備
  自動故障恢復    #Crash Safe Recovery,簡稱CSR
  
  
3.表空間
  1)共享表空間(ibdata1)
  2)獨立表空間(city.ibd)
  
  
4.事務
	1)ACID特性
	  Atomic(原子性):所有語句作為一個單元全部成功執行或全部取消。
       
      Consistent(一致性):如果資料庫在事務開始時處於一致狀態,則在執行該事務期間將保留一致態。
       
      Isolated(隔離性):事務之間不相互影響。
       
      Durable(永續性):事務成功完成後,所做的所有更改都會準確地記錄在資料庫中,所做的更改不會丟失。
      
	2)事務日誌
	  1.redo log
	  2.undo log
	  
	  #redo位置
      [root@db01 ~]# ll /usr/local/mysql/data/
      -rw-rw---- 1 mysql mysql 50331648 Jul 21 10:44 ib_logfile0
      -rw-rw---- 1 mysql mysql 50331648 Jul 10 19:07 ib_logfile1
       
      #undo位置
      [root@db01 ~]# ll /usr/local/mysql/data/
      -rw-rw---- 1 mysql mysql 12582912 Jul 21 10:44 ibdata1
      
      
	3)鎖、隔離級別
	 #1.鎖
	   排他鎖:保證在多事務操作時,資料的一致性。(在我修改資料時,其他人不得修改)
 
       共享鎖:保證在多事務工作期間,資料查詢時不會被阻塞。
        
       樂觀鎖:多事務操作時,資料可以同時修改,誰先提交,以誰為準
        
       悲觀鎖:多事務操作時,資料只有一個人可以修改
       
       #鎖的粒度:
          1.MyIsam:表級鎖
          2.Innodb:行級鎖 
          
       
     #2.隔離級別
       1.RU級別:READ UNCOMMITTED(獨立提交):未提交讀,允許事務檢視其他事務所進行的未提交更改
 
       2.RC級別:READ COMMITTED:允許事務檢視其他事務所進行的已提交更改,檢視不需要重新記入資料庫
        
       3.RR級別:REPEATABLE READ:允許事務檢視其他事務所進行的已提交更改,檢視資料需要重新進入資料庫(InnoDB 的預設級別)
        
       4.序列化:SERIALIZABLE:將一個事務的結果與其他事務完全隔離

7.二進位制日誌

1.二進位制日誌
   1)操作
     開啟:
       #配置了binlog就是開啟
       [root@db02 ~]# vim /etc/my.cnf
       [mysqld]
       server_id
       log_bin=/usr/local/mysql/data/mysql-bin
       
       
   2)作用
      資料庫的備份與恢復
      使用binlog配合資料庫升級(一般都不升級)
      
      
   3)工作模式(三種)
      #檢視當前模式:
      mysql> show variables like '%binlog_format%';
      +---------------+-----------+
      | Variable_name | Value     |
      +---------------+-----------+
      | binlog_format | STATEMENT |
      +---------------+-----------+
     
     1.STATEMENT語句模式 
        #優缺點:
          易讀
          不安全
          相對於行級模式佔用磁碟空間小
          
     2.row行級模式
        #優缺點:
          安全
          不易讀
          相對於語句模式佔用磁碟大
          
     3.mixed混合模式
        #優缺點:
          自動使用前兩個組合
          安全
          不易讀,混合後比較雜

8.資料備份

1.備份方式
  1)邏輯備份
     #基於SQL語句的備份
      1.binlog
      2.into outfile
          [root@db03 data]# vim /etc/my.cnf
          [mysqld]
          secure-file-priv=/tmp
          mysql> select * from world.city into outfile '/tmp/world_city.data';
       
      3.mysqldump
      4.replication
      
      
  2)物理備份
     #備份底層的資料檔案
     1.備份整個data資料目錄
     2.xtrabackup     


2.備份策略
  全備:全部資料備份
  增備:針對於上一次備份,將新資料備份
  差異備份:基於上一次全備進行新資料的備份

3.備份型別
   1.冷備:停庫,停服務,備份
   2.溫備:不停服務,鎖表(阻止資料寫入),備份
   3.熱備:不停庫,不停服務,備份
    
   #冷備份:
   這些備份在使用者不能訪問資料時進行,因此無法讀取或修改資料。這些離線備份會阻止執行任何使用資料的活動。這些型別的備份不會干擾正常執行的系統的效能。但是,對於某些應用程式,會無法接受必須在一段較長的時間裡鎖定或完全阻止使用者訪問資料。
    
   #溫備份:
   這些備份在讀取資料時進行,但在多數情況下,在進行備份時不能修改資料本身。這種中途備份型別的優點是不必完全鎖定終端使用者。但是,其不足之處在於無法在進行備份時修改資料集,這可能使這種型別的備份不適用於某些應用程式。在備份過程中無法修改資料可能產生效能問題。
    
   #熱備份:
   這些動態備份在讀取或修改資料的過程中進行,很少中斷或者不中斷傳輸或處理資料的功能。使用熱備份時,系統仍可供讀取和修改資料的操作訪問。

9.主從複製

1.主從複製原理
##非同步複製原理:
     1.主庫配置server_id和開啟binlog
     2.主庫授權從庫連線的使用者
     3.主庫檢視binlog資訊,與伺服器資訊
     4.從庫配置跟主庫不一致server_id
     5.配置主從,通過change master to 告訴從庫主庫的資訊:ip、使用者、密碼、埠、binlog位置點、binlog名字
     6.從庫開啟IO執行緒和sql執行緒
     7.從庫連線主庫以後,IO執行緒會向主庫的dump執行緒發起詢問,詢問是否有新資料
     8.dump執行緒被詢問,去查詢新資料,並將新資料返回給IO執行緒
     9.IO執行緒拿到資料先寫入TCP快取
     10.TCP快取將資料寫入中繼日誌,並返回給IO執行緒一個ACK
     11.IO執行緒收到ACK會記錄當前位置點到master.info
     12.sql執行緒會讀取relay-log,執行從主庫獲取的sql語句
     13.執行完以後將執行到的位置點,記錄到relay-log.info

2.主從的操作
  ##主庫操作:
     1)主庫開啟binlog日誌
     2)設定server_id
     3)授權一個主從使用者
     4)檢視binlog資訊
     5)匯出所有資料
     
  ##從庫操作:
     1)設定配置檔案,server_id和主庫不同
     2)使用主庫授權的使用者登陸使用者登陸主庫,驗證主從使用者
     3)同步資料
     4)配置主從
     5)開啟IO和sql執行緒

10.MHA高可用,Atlas讀寫分離

1.MHA原理
  ##實現原理:
   1.把宕機的master二進位制日誌儲存下來。
   2.找到binlog位置點最新的slave。
   3.在binlog位置點最新的slave上用relay-log(差異日誌)修復其它slave。
   4.將宕機的master上儲存下來的二進位制日誌恢復到含有最新位置點的slave上。
   5.將含有最新位置點binlog所在的slave提升為master。
   6.將其它slave重新指向新提升的master,並開啟主從複製。
   
2.MHA搭建
    ##需要:
       mha的rpm包,node包和manager包
       
3.Atlas讀寫分離
    1).Atlas的安裝
    2).Atlas的操作
    3).怎麼結合MHA實現故障恢復
    4).Atlas的分表

Ⅱ.MySQL綜合題

  1. 請寫出什麼是事務?

    將很多事件或者sql語句看作一個整體,每條語句都成功則都執行,當有一條語句失敗都回滾
    
  2. 事務的特性是什麼?

    Atomic(原子性):所有語句作為一個單元全部成功執行或全部取消。
    Consistent(一致性):如果資料庫在事務開始時處於一致狀態,則在執行該事務期間將保留一致狀態。
    Isolated(隔離性):事務之間不相互影響。
    Durable(永續性):事務成功完成後,所做的所有更改都會準確地記錄在資料庫中。所做的更改不會丟失。
    
  3. MySQL事務的隔離級別有幾種,分別是什麼?

    1.RU:READ UNCOMMITTED(獨立提交)未提交讀,允許事務檢視其他事務所進行的未提交更改
    2.RR:REPEATABLE READ 可重複讀,確保每個事務的 SELECT 輸出一致  InnoDB 的預設級別  #commit之後,其他視窗看不到資料,必須退出重新登入檢視
    3.RC:READ COMMITTED 允許其他事務檢視已經提交的事務
    4.序列化:SERIALIZABLE 將一個事務與其他事務完全隔離   #當一個事務沒有提交,查詢也不行
    
  4. 什麼是髒讀,幻讀,不可重複讀?

    1.髒讀(RU級別):執行一個事務,還沒有提交就被讀取,可是事務回滾了,那麼之前被讀取到的資料就是髒資料
    2.幻讀:刪除資料庫所有內容,剛刪除完,其他事物添加了資料,好像沒有刪除乾淨一樣,以為是幻覺
    3.不可重複讀:執行事物的時候需要讀取兩次資料,第一次讀取與第二次讀取之間資料被修改,導致第一次讀取和第二次讀取資料不同
    
  5. 如何解決髒讀,幻讀,不可重複讀的問題?

    1.RU:最低的隔離級別,允許讀取尚未提交的資料變更,可能會導致髒讀、幻讀或不可重複讀。
    2.RC:允許讀取併發事務已經提交的資料,可以阻止髒讀,但是幻讀或不可重複讀仍有可能發生。
    3.RR:對同一欄位的多次讀取結果都是一致的,除非資料是被本身事務自己所修改,可以阻止髒讀和不可重複讀,但幻讀仍有可能發生。
    4.序列化:最高的隔離級別,完全服從ACID的隔離級別。所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止髒讀、不可重複讀以及幻讀。
    
  6. MySQL中索引的分類有幾種?分別是什麼?

    1.普通索引
    2.唯一鍵索引
    3.主鍵索引
    4.字首索引
    5.聯合索引
    
  7. 請寫出如下慢查詢SQL語句的排查過程?及解決辦法

    Select * from world.city where population > 100;
    
    #排查過程
    1.查詢語句的條件population是否有索引
    2.有索引是否使用了索引
    3.如果有看看是什麼級別
    4.看看為什麼沒有走索引
    5.檢視資料量
    
    #解決方式
    1.建立索引
    2.提高索引級別
    3.優化sql語句
    4.使用limit進行分批查詢資料
    
  8. MySQL 儲存引擎,innodb與myisam的區別?

    #MyISAM:
    不支援事務,但是每次查詢都是原子的;
    支援表級鎖,即每次操作是對整個表加鎖;
    物理檔案有三個
    不支援熱備
    
    #InnoDb:
    支援ACID的事務,支援事務的四種隔離級別;
    支援行級鎖及外來鍵約束:因此可以支援寫併發;
    物理檔案有兩個
    支援熱備
    
  9. 資料型別,varchar和char的區別?

    #長度不同
    1.char型別:char型別的長度是固定的。
    2.varchar型別:varchar型別的長度是可變的。
    #效率不同
    1.char型別:char型別每次修改的資料長度相同,效率更高。
    2.varchar型別:varchar型別每次修改的資料長度不同,效率更低。
    #儲存不同
    1.char型別:char型別儲存的時候是初始預計字串再加上一個記錄字串長度的位元組,佔用空間較大。
    2.varchar型別:varchar型別儲存的時候是實際字串再加上一個記錄字串長度的位元組,佔用空間較小。
    
    #總結:
    char的長度是不可變的,而varchar的長度是可變的,定義一個char(10)和varchar(10),如果存進去的是'linux',那麼char所佔的長度依然為10,除'linux'外,後面跟5個空格,而varchar就立馬把長度變為5了,取資料的時候,char型別的要用trim()去掉多餘的空格,而varchar是不需要的,char的存取速度要比varchar要快得多,因為其長度固定,方便程式的儲存與查詢;但是char儲存空間要耗費更多。
    
  10. Int型別的範圍是多少?

    int在32位環境中,取值範圍為-(2^31)~(2^31-1),即-2147483648~2147483647;
    
  11. 請寫出以下鎖的功能?

    排他鎖:保證在多事務操作時,資料的一致性。(在我修改資料時,其他人不得修改)
    共享鎖:保證在多事務工作期間,資料查詢時不會被阻塞。
    樂觀鎖:多事務操作時,資料可以被同時修改,誰先提交,誰修改成功。
    悲觀鎖:多事務操作時,資料只有一個人可以修改。
    
  12. 請寫出innodb儲存引擎鎖粒度是什麼?

    InnoDB支援行級鎖,而MyISAM支援表級鎖
    
  13. 請寫出,delete、drop、truncate的區別

    1.delete是DML語句,可以選擇刪除部分資料,也可以選擇刪除全部資料;刪除的資料可以回滾;不會釋放空間
    2.drop是DDL語句,刪除表結構和所有資料,同時刪除表結構所依賴的約束、觸發器和索引;刪除的資料無法回滾;會釋放空間
    3.truncate是DDL語句,刪除表的所有資料,不能刪除表的部分資料,也不能刪除表的結構;刪除的資料無法回滾;會釋放空間
    
    執行速度:drop > truncate > delete
    一般使用場景:如果一張表確定不再使用,我們使用drop來操作;如果只是刪表中的全部資料,一般使用truncate;如果刪除的是表中的部分資料,一般使用delete
    
  14. 如何使用update代替delete?

    資料庫中新增一列狀態列,刪除資料時只需要修改狀態列的值即可,開發只需要在查詢時加上該列的值作為查詢條件即可避免真的刪除資料
    
  15. 請寫出MySQL主從複製原理,畫圖+文字描述

    1.主庫配置server_id和binlog
    2.主庫授權從庫連線的使用者
    3.主庫檢視位置點個binlog名字
    4.從庫配置serevr_id
    5.通過change master to語句告訴從庫主庫的資訊:host,user,password,port,binlog_file,binlog_pos
    6.從庫開啟IO執行緒和SQL執行緒(start slave)
    7.從庫連線主庫後,IO執行緒會去詢問主庫的dump執行緒,是否有比從庫master.info裡面記錄的更新的binlog名字或位置點
    8.主庫接收IO執行緒的詢問後,dump執行緒會去查詢binlog,如果有新資料就會將新資料的binlog傳給IO執行緒
    9.IO執行緒拿到新資料的binlog以後,會將內容儲存到TCP\IP快取
    10.TCP\IP快取收到資料,會返回給IO執行緒一個ACK
    11.IO執行緒會更新master.info新的位置點或binlog名,然後繼續去主庫獲取新資料
    12.TCP\IP會將新資料的binlog存到中繼日誌relay_log
    13.SQL執行緒會去讀取中繼日誌的內容,並且去relay-log.info對比,如果有新資料就執行新資料的內容
    14.SQL執行緒執行完新資料,將新資料執行完的位置點更新到relay-log.info
    
  16. 請寫出半同步複製和延時從庫的原理?

    #半同步複製
    1.從庫連線主庫後,IO執行緒會去詢問主庫的dump執行緒,是否有比從庫master.info裡面記錄的更新的binlog名字或位置點
    2.主庫接收IO執行緒的詢問後,dump執行緒會去查詢binlog,如果有新資料就會將新資料的binlog傳給IO執行緒
    3.IO執行緒拿到新資料的binlog以後,會將內容儲存到TCP\IP快取
    4.TCP\IP會將新資料的binlog存到中繼日誌relay_log
    5.會返回給IO執行緒一個ACK
    6.IO執行緒將ACK返回給主庫
    7.然後主庫繼續寫入binlog
    8.SQL執行緒會去讀取中繼日誌的內容,並且去relay-log.info對比,如果有新資料就執行新資料的內容
    9.SQL執行緒執行完新資料,將新資料執行完的位置點更新到relay-log.info
    10.IO執行緒會更新master.info新的位置點或binlog名,然後繼續去主庫獲取新資料
    
    #延時從庫
    1.SQL執行緒會去讀取中繼日誌的內容,並且會讀取延時時間,到達時間後才會執行
    
  17. 請寫出MySQL主從複製的相關檔案和執行緒名

    #主庫
    1.主庫的binlog:記錄主庫發變化的過程
    2.dump執行緒:對比binlog是否更新,並將新資料的binlog傳送給主庫
    #從庫
    1.IO執行緒:連線主庫,接收主庫傳送過來新資料的binlog日誌
    2.SQL執行緒:執行主庫傳過來的新資料的binlog日誌
    3.relay-log(中繼日誌):儲存所有主庫傳過來的binlog日誌
    4.master.info:記錄上一次請求到主庫的binlog名字和位置點
    5.relay-log.info:記錄上一次執行relay-log的位置點,下一次從該點執行後面的內容
    
  18. MySQL如何保證資料的安全性和一致性?

    #安全性
    CSR自動故障恢復
    #一致性
    ACID
    
  19. 請寫出MySQL二進位制日誌的工作模式有幾種?區別是什麼?

    #語句模式
    	1.不嚴謹,不安全
    	2.語句容易理解
    	3.日誌檔案不是很大,不佔用磁碟
    	4.記錄的是sql語句
    #行級模式
    	1.嚴謹,安全
    	2.語句不容易理解
    	3.日誌檔案很大,比較佔用磁碟
    	4.記錄的是資料的變化過程
    #混合模式 MIXED
    	結合上面兩中模式使用
    	
    binlog_format="ROW"
    binlog_format="MIXED"
    binlog_format="STATEMENT"
    
  20. 請寫出mysqldump常用引數及含義

    1.不加引數
    2.-A
    3.-B
    4.-F
    5.--master-data
    6.--single-transaction
    7.-R
    9.--triggers
    
  21. 請寫出如何擷取二進位制日誌和中繼日誌?

    mysqlbinlog --start-position=120 --stop-position=400 mysql-bin.000001 > /tmp/full.sql
    
  22. 如何在資料庫中只備份單表?

    mysqldump world city > /tmp/city.sql
    
  23. 如何在已執行在生產環境中的叢集,新增一臺從庫?

    1.搭建資料庫
    2.匯出主庫資料並打點
    3.將主庫資料匯入到新的資料庫
    4.新搭建的庫執行change master to
    
  24. 請寫出MHA的工作原理?

    1.儲存master主庫上面的所有binlog(node節點)
    2.找到資料最新的從庫(通過對比relay-log)
    3.將資料最新的從庫資料同步到其他從庫
    4.提升一個從庫為主庫(一般情況提升資料最新的,二般情況提升我們指定的從庫為主庫)
    5.通過原來主庫的binlog補全新的主庫資料
    6.其他從庫以新的主庫為主做主從複製
    
  25. 在阿里雲中如何使用MHA?

    使用彈性網絡卡作為MHA中的VIP,當資料庫掛掉,則解除彈性網絡卡,繫結到另一臺機器上
    
  26. 請寫出MySQL 主從複製IO執行緒報錯的排查思路?

    1.檢測網路
    2.檢測埠
    3.檢視防火牆
    4.測試主從使用者能否連線
    5.反向解析
    6.server_id或者UUID是否相同
    
  27. 請寫出MySQL 主從複製SQL執行緒報錯的解決辦法?

    #原因:
    1.主庫有的資料,從庫沒有
    	主庫:有a庫
    	從庫:沒有a庫
    	對主庫的a庫操作時,從庫會出現問題
    2.主庫沒有的資料,從庫有
    	從庫:有b庫
    	主庫:剛打算建立b庫
    	主庫建立從庫已有的資料庫,從庫會出現錯誤
    3.主庫與從庫資料庫結構不一致
    
    #解決方式:
    1.停掉主從
    2.清空從庫資訊
    3.同步主庫所有資料
    4.重新配置主從
    
  28. 如何設定MySQL的會話變數及全域性變數?

    #session變數(會話變數)
    set session autocommit=1;
    set autocommit=1;
    
    #全域性變數
    set global autocommit=1;
    
    #global變數和session變數在mysql服務重啟之後,又會失效,所以都是臨時生效的,如果想要永久生效,需要配置my.ini的內容定義變數
    
  29. 什麼是水平分表?什麼是垂直分表?表真的分了麼分成什麼樣的了?

    資料表拆分:主要就是垂直拆分和水平拆分。
    水平切分:將記錄雜湊到不同的表中,各表的結構完全相同,每次從分表中查詢, 提高效率。
    垂直切分:將表中大欄位單獨拆分到另外一張表, 形成一對一的關係。
    
  30. 請寫出,你在企業中,MySQL遇到資料不一致問題時,是如何解決的?

    #原因:
    1.網路的延遲
    2.主從兩臺機器的負載不一致
    3.max_allowed_packet設定不一致
    4.自增鍵不一致
    5.雙一標準同步引數設定問題
    6.版本不一致
    
    #解決:
    重新做主從
    
  31. 什麼是儲存過程?用什麼來呼叫?

    儲存過程是在大型資料庫系統中,一組為了完成特定功能的SQL語句集,它儲存在資料庫中,一次編譯後永久有效,使用者通過指定儲存過程的名字並給出引數來執行它。儲存過程是資料庫中的一個重要物件。在資料量特別龐大的情況下利用儲存過程能達到倍速的效率提升
    
    #儲存過程優缺點
    #優點:
    1.在生產環境下,可以通過直接修改儲存過程的方式修改業務邏輯或bug,而不用重啟伺服器。
    2.執行速度快,儲存過程經過編譯之後會比單獨一條一條編譯執行要快很多。
    3.減少網路傳輸流量。
    4.便於開發者或DBA使用和維護。
    5.在相同資料庫語法的情況下,改善了可移植性。
    
    #缺點:
    1.過程化程式設計,複雜業務處理的維護成本高。
    2.除錯不便。
    3.因為不同資料庫語法不一致,不同資料庫之間可移植性差。
    
    #儲存過程的語法
    1.建立檢視
    delimiter //
    create procedure 儲存過程名([in|out|inout]引數名 型別....)
    begin
    SQL 語句;
    end//
    delimiter;
    
    2.刪除檢視
    drop procedure 儲存過程名
    
    3.呼叫儲存過程
    call 儲存過程名(引數)
    
    #語法說明:
    1.delimiter//
    	是將SQL程式碼的結束符號設定為//,因為儲存過程中有多條SQL語句以分號結束,如果定義儲存過程也以分號結束,就存在混淆,所以先將//作為定義儲存過程的結束符號,建立完成後再定義為原來的分號。
    2.[in|out|inout]
    	引數前可以新增in、out、inout關鍵字設定引數的型別:
    	in 代表輸入引數,用於傳入資料,預設
    	out 代表輸出引數,用於返回資料,類似return的作用
    	inout 代表輸入和輸出都可以
    
  32. 什麼是觸發器?觸發器的作用是什麼?

    觸發器(trigger):監視某種情況,並觸發某種操作,它是提供給程式設計師和資料分析員來保證資料完整性的一種方法,它是與表事件相關的特殊的儲存過程,它的執行不是由程式呼叫,也不是手工啟動,而是由事件來觸發,例如當對一個表進行操作(insert,delete, update)時就會啟用它執行。
    
    #建立觸發器的四要素:
    監視地點(table)
    監視事件(update、insert、delete)
    觸發時間(before、after)
    觸發事件(update、insert、delete)
    
    #語法:
    CREATE TRIGGER <觸發器名> <觸發時間> <監視事件>
    ON 監視地點 FOR EACH ROW 
    begin
        觸發事件
    end;
    
  33. 主鍵和唯一鍵還有候選鍵有什麼區別?

    主鍵:一個表只有一個主鍵,主鍵是唯一且非空的
    唯一鍵:唯一鍵在一個表中可以有多個,資料是唯一的,可以為空
    候選鍵:主鍵也是候選鍵,按照慣例,候選鍵可以被指定為主鍵,並且可以用於任何外來鍵引用。
    
  34. AUTO_INCREMENT 可不可以設定最大值,可以的話怎麼設定

    可在建表時可用"AUTO_INCREMENT=n"選項來指定一個自增的初始值
    可用alter table table_name AUTO_INCREMENT=n命令來重設自增的起始值
    沒有最大值上限。
    
  35. 查詢時運算子都有哪些

    =,<>,<=,<,> =,>,AND,IN,OR或LIKE運算子。
    
  36. 列出我們用過的函式(最少4個)

    password()		#密碼加密
    database()		#當前資料庫
    now()			#當前時間
    count()			#統計數量
    distinct()		#資料去重後數量
    max()			#最大值
    min()			#最小值
    sum()			#求和
    avg()			#求平均值
    
    CONCAT(A, B) 	#連線兩個字串值以建立單個字串輸出。通常用於將兩個或多個欄位合併為一個欄位。
    FORMAT(X, D) 	#格式化數字X到D有效數字。
    CURRDATE(), CURRTIME() 	#返回當前日期或時間。
    MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() 	#從日期值中提取給定資料。
    HOUR(),MINUTE(),SECOND() 	#從時間值中提取給定資料。
    DATEDIFF(A,B) 	#確定兩個日期之間的差異,通常用於計算年齡
    SUBTIMES(A,B) 	#確定兩次之間的差異。
    FROMDAYS(INT) 	#將整數天數轉換為日期值。
    
  37. 怎麼檢視一個表的字符集(最少兩種方法)

    show create table tablename;
    show charset;
    
    #字符集常用的種類:
    1.ascii:共收錄128個字元,包括空格、標點符號、數字、大小寫字母和一些不可見字元。由於總共才128個字元,所以可以使用1個位元組來進行編碼
    2.latin1:共收錄256個字元,是在ASCII字符集的基礎上又擴充了128個西歐常用字元(包括德法兩國的字母),也可以使用1個位元組來進行編碼。
    3.gb2312: 收錄了漢字以及拉丁字母、希臘字母、日文平假名及片假名字母、俄語西裡爾字母。其中收錄漢字6763個,其他文字元號682個,相容ASCII字符集。這是一個變長字符集,如果該字元在ascii字符集中,則採用1位元組編碼,否則採用兩位元組。
    4.gbk: GBK是在gb2312基礎上擴容後的標準。收錄了所有的中文字元。同樣的,這是一個變長字符集,如果該字元在ascii字符集中,則採用1位元組編碼,否則採用兩位元組。
    5.utf8和utf8mb4: 收錄地球上能想到的所有字元,而且還在不斷擴充。這種字符集相容ASCII字符集,採用變長編碼方式,編碼一個字元需要使用1~4個位元組。MySQL為了節省空間,其中的utf8是標準 UTF8 閹割後的,只有1~3位元組編碼的字符集,基本包含了所有常用的字元。如果還要使用 emoji 表情,那麼需要使用utf8mb4,這個是完整的 UTF8 字符集。
    6.utf16: 不同於utf8,utf16用兩個位元組或者四個位元組編碼字元,可以理解為utf8的不節省空間的一種形式
    7.utf32: 固定用四個位元組編碼字元,可以理解為utf8的不節省空間的一種形式
    
  38. B+tree索引對比Btree索引在哪裡進行了優化

    1.B+TREE對比Btree的變化就是在也葉子節點添加了相鄰節點的指標,不需要從根節點重新讀取資料
    2.B+tree優化了範圍查詢
    
  39. Mysql優化該怎麼做?

    1.硬體的優化
    2.系統配置的優化
    3.資料庫表結構的優化
    4.配置檔案的優化
    5.SQL語句及索引的優化
    
    #優化的原則:
    查詢時,能不要*就不用*,儘量寫全欄位名
    多使用explain和profile分析查詢語句
    檢視慢查詢日誌,找出執行時間長的sql語句優化
    多表連線時,儘量小表驅動大表,即小表 join 大表
    在千萬級分頁時使用limit
    對於經常使用的查詢,可以開啟快取
    把資料庫的大表按時間或一些標誌分成小表
    將表拆分
    
  40. SQL語言包括哪幾部分?每部分都有哪些命令?

    1.資料查詢語言DQL
    	select、desc
    2.資料操作語言DML
    	insert、	update、	delete
    3.資料控制語言DCL
    	grant、revoke
    4.資料定義語言DDL
    	create、drop、alter、rename
    
  41. 請說明主鍵、外來鍵和索引的區別?

    #應用範疇不同:
    主鍵是用來標記資料唯一性的,而索引是加快查詢速度的,外來鍵是為了關聯兩個表的
    
    #種類不同:
    根據資料庫的功能,可以在資料庫設計器中建立三種索引:唯一索引、主鍵索引和聚集索引。而主鍵只是其中的一種。外來鍵與他們都不同
    
    #建立方式不同
    主鍵只能建立一個,索引有多種型別可以建立多種,外來鍵不能在自己當前表建立
    
    1.主鍵:是一種特殊的唯一索引,在一張表中只能定義一個主鍵索引,主鍵用於唯一標識一條記錄,使用關鍵字 PRIMARY KEY 來建立。對於關係表,有個很重要的約束,就是任意兩條記錄不能重複。不能重複不是指兩條記錄不完全相同,而是指能夠通過某個欄位唯一區分出不同的記錄,這個欄位被稱為主鍵。
    
    2.索引:是一種特殊的檔案(InnoDB資料表上的索引是表空間的一個組成部分),它們包含著對資料表裡所有記錄的引用指標。可以對一張表建立多個索引。索引的優點是提高了查詢效率,缺點是在插入、更新和刪除記錄時,需要同時修改索引,因此,索引越多,插入、更新和刪除記錄的速度就越慢。
    
    3.外來鍵:在students表中,通過class_id的欄位,可以把資料與另一張表關聯起來,這種列稱為外來鍵;外來鍵約束會降低資料庫的效能,大部分網際網路應用程式為了追求速度,並不設定外來鍵,而是僅靠應用程式自身來保證邏輯的正確性
    
  42. 索引有哪些優缺點?

    #優點:
    1.可以加快資料的檢索速度。
    2.可以加速表和表之間的連線。
    3.使用分組和排序子句進行資料檢索時,可以減少查詢中分組和排序的時間。
    
    #缺點
    1.建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。
    2.索引需要佔物理空間,除了資料表佔資料空間之外,每一個索引還要佔一定的物理空間。
    3.當對錶中的資料進行增加、刪除和修改的時候,索引需要動態的維護,這樣就降低了資料的維護速度。
    
  43. 索引有哪幾種類型?

    #常見的索引掃描型別,前提條件,查詢的條件必須有索引
    1.index		全索引掃描
    2.range		範圍查詢
    3.ref		精確查詢
    4.eq_ref	類似於ref,使用join on的時候
    5.const		查詢的條件的列是唯一索引或主鍵索引
    6.system	跟const同級別
    7.null		執行過程中不訪問表或者索引
    
  44. 請寫出給table表id欄位新增索引和刪除索引的命令?

    #新增普通索引
    alter table table add index idx_name(id);
    #新增唯一建索引
    alter table table add unique key uni_name(name);
    #新增主鍵索引
    alter table table add primary key pri_id(id);
    
    #刪除索引
    alter table table drop index idx_name;
    
  45. 一般建立索引你會考慮到那些?

    1.選擇唯一性索引
    2.為經常需要排序、分組和聯合操作的欄位建立索引
    3.對於查詢操作中頻繁使用的列建立索引,不對很少或從來不作為查詢條件的列建立索引
    4.限制索引的數目
    5.儘量使用資料量少的索引
    6.對於資料較長的列,儘量使用字首索引
    7.刪除不再使用或者很少使用的索引
    8.儘量的擴充套件索引,不要新建索引
    9.當單個索引欄位查詢資料很多,區分度都不是很大時,則需要考慮建立聯合索引來提高查詢效率
    10.先存資料,再建索引
    11.不要對規模小的資料表建立索引,資料量超過300的表應該有索引;
    12.在不同值較少的欄位上不必要建立索引,如性別欄位
    13.經常出現在Where子句中的欄位,特別是大表的欄位,應該建立索引;
    14.索引應該建在選擇性高的欄位上;
    15.在SQL語句中經常進行GROUP BY、ORDER BY的欄位上建立索引;
    
  46. 什麼是臨時表

    臨時表與實體表類似,只是在使用過程中,臨時表是儲存在系統資料庫快取中,當我們不再使用臨時表的時候,臨時表會自動刪除,臨時表並不是真實存在的,是sql將我們的查詢結果以表格的形式展示給我們的資料
    
  47. 資料庫分幾種?分別都有哪些?

    關係型資料庫和非關係型資料庫
    
    #關係型資料庫
    MySQL、Oracle、mariadb
    
    #非關係型資料庫
    1.鍵值儲存資料庫(key-value)
    	Memcached、Redis
    2.列儲存(Column-oriented)資料庫
    	HBase
    3.面向文件(Document-Oriented)資料庫
    	MongoDB
    4.搜尋引擎式資料庫
    	Elasticsearch
    
  48. 什麼情況下索引會不生效

    1.沒有查詢條件,或者查詢條件沒有建索引
    2.查詢的結果集是原表中的大部分資料,25%以上
    3.索引本身失效
    4.查詢條件使用函式在索引列上或者對索引列進行運算,運算包括(+,-,*等)
    5.隱式轉換,會導致索引失效
    6.<> 和 not in 和 or 也不走索引
    7.like模糊查詢 % 位置決定走不走索引
    8.聯合索引查詢的條件不是按照順序排列的,或者條件沒有聯合索引的第一個列
    
  49. 一條sql語句執行時間過長你會優化?

    查詢時,能不要*就不用*,儘量寫全欄位名
    多使用explain和profile分析查詢語句
    檢視慢查詢日誌,找出執行時間長的sql語句優化
    多表連線時,儘量小表驅動大表,即小表 join 大表
    在千萬級分頁時使用limit
    對於經常使用的查詢,可以開啟快取
    把資料庫的大表按時間或一些標誌分成小表
    將表拆分
    
  50. 你們資料庫不支援emoji表情,你該怎麼辦?怎麼操作?

    升級字符集至utf8_mb4
    
    #操作
    1.匯出資料庫中需要需要支援emoji表情的庫
    2.批量修改建庫語句中的字符集
    3.將資料庫匯入新的資料庫
    4.將業務請求傳送到新庫
    5.將新增的資料通過binlog同步至新的資料庫
    
  51. 當伺服器出現問題,你該如何入手排查問題,排查思路是什麼?

    #思考
    1.故障的表現是什麼?無響應?報錯?
    2.故障是什麼時候發現的?
    3.故障是否可重現?
    4.有沒有出現的規律(比如每小時出現一次)
    5.最後一次對整個平臺進行更新的內容是什麼(程式碼、伺服器等)?
    6.故障影響的特定使用者群是什麼樣的(已登入的, 退出的, 某個地域的…)?
    7.基礎架構(物理的、邏輯的)的文件是否能找到?
    8.是否有監控平臺可用? (比如Munin、Zabbix、 Nagios、 New Relic… 什麼都可以)
    9.是否有日誌可以檢視?
    
    #操作
    10.檢視訪問使用者
    11.檢視歷史命令
    12.現在有哪些程序執行
    13.檢查CPU和記憶體
    14.檢查磁碟
    15.有沒有掛載檔案伺服器
    16.是否有定時任務導致問題
    17.檢視日誌
    

52.關係型資料庫和非關係型資料庫區別

關係型資料庫(RDBMS)的特點:
	1.二維表
	2.資料存取是通過SQL(Structured Query Language結構化查詢語言)
	3.最大特點資料安全性方面強(ACID)
		原子性,一致性,隔離性,永續性

非關係型資料庫(NoSQL:Not only SQL)的特點:
	1.不是否定關係型資料庫,而是做關係型資料庫的補充。
	2.效能高,速度快(儲存在記憶體中,所以速度快,但是要考慮資料放入記憶體會不會丟失資料,可以考慮redis,做到了資料一邊放入記憶體的同時,將記憶體的資訊也放入磁碟,保證資料不丟失)

53.redo log和undo log的區別

# redo log:重做日誌
在事務ACID過程中,實現的是“D”持久化的作用。
REDO:記錄的是,記憶體資料頁的變化過程
特性:WAL(Write Ahead Log)日誌優先寫

# undo log:回滾日誌
在事務ACID過程中,實現的是“A”原子性的作用。當然CI的特性也和undo有關。
· 當斷電,或者未將資料commit提交,則在undo buffer page undo快取區則不會有記錄
· 當用戶查詢資料,則會從date buffer page、redo buffer page redo快取區和undo buffer page undo快取區中同時拿取資料,但是最後以undo buffer page 也就是undo快取區中生效。
· 總的來說,就是隻要沒有commit則資料就不會生效,也就是回滾日誌,當用戶在查詢就只會是初始未修改資料

# 詳情見:
https://www.cnblogs.com/tcy1/p/13355592.html#1redo-log