MYSQL理論知識彙總

01. 列舉常見的關係型數據庫和非關係型都有那些?
        1.關係型數據庫經過外鍵關聯來創建表與表之間的關係,---------常見的有:SQLite、Oracle、mysql
        2.非關係型數據庫一般指數據以對象的形式存儲在數據庫中,而對象之間的關係經過每一個對象自身的屬性來決定  ---常見的有:MongoDb、redis
        
02. MySQL常見數據庫引擎及比較?
        · MyISAM:默認的MySQL插件式存儲引擎,它是在Web、數據倉儲和其餘應用環境下最常使用的存儲引擎之一。

        · InnoDB:用於事務處理應用程序,具備衆多特性,包括ACID事務支持。(提供行級鎖)

        · BDB:可替代InnoDB的事務引擎,支持COMMIT、ROLLBACK和其餘事務特性。

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

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

        · Archive:爲大量不多引用的歷史、歸檔、或安全審計信息的存儲和檢索提供了完美的解決方案。

        · Federated:可以將多個分離的MySQL服務器連接起來,從多個物理服務器建立一個邏輯數據庫。十分適合於分佈式環境或數據集市環境。

        · Cluster/NDB:MySQL的簇式數據庫引擎,尤爲適合於具備高性能查找要求的應用程序,這類查找需求還要求具備最高的正常工做時間和可用性。

        · Other:其餘存儲引擎包括CSV(引用由逗號隔開的用做數據庫表的文件),Blackhole(用於臨時禁止對數據庫的應用程序輸入),以及Example引擎(可爲快速建立定製的插件式存儲引擎提供幫助)。

        通常來講不使用事務的話,請使用MyISAM引擎,使用事務的話,通常使用InnoDB ------仙子啊學習如今咱們用的主要是InnoDB
        注意,經過更改STORAGE_ENGINE配置變量,可以方便地更改MySQL服務器的默認存儲引擎。
        
03. 簡述數據三大範式?
        什麼是範式:簡言之就是,數據庫設計對數據的存儲性能,還有開發人員對數據的操做都有莫大的關係。因此創建科學的,規範的的數據庫是須要知足一些
        規範的來優化數據數據存儲方式。在關係型數據庫中這些規範就能夠稱爲範式。
        什麼是三大範式:
        第一範式:當關系模式R的全部屬性都不能在分解爲更基本的數據單位時,稱R是知足第一範式的,簡記爲1NF。知足第一範式是關係模式規範化的最低要

                    求,不然,將有不少基本操做在這樣的關係模式中實現不了。
        第二範式:若是關係模式R知足第一範式,而且R得全部非主屬性都徹底依賴於R的每個候選關鍵屬性,稱R知足第二範式,簡記爲2NF。
        第三範式:設R是一個知足第一範式條件的關係模式,X是R的任意屬性集,若是X非傳遞依賴於R的任意一個候選關鍵字,稱R知足第三範式,簡記爲3NF.
        注:關係實質上是一張二維表,其中每一行是一個元組,每一列是一個屬性
        
04. 什麼是事務?MySQL如何支持事務?
        事務就是一段sql 語句的批處理,可是這個批處理是一個原子 ,不可分割,要麼都執行,要麼回滾(rollback)都不執行。
        事務具體四大特性,也就是常常說的ACID :1.原子性(全部操做要麼所有成功,要麼所有失敗回滾)
                                               2.一致性(事務執行以前和執行以後都必須處於一致性狀態。)
                                               3.隔離性(數據庫爲每個用戶開啓的事務,不能被其餘事務的操做所幹擾,多個併發事務之間要相互隔離)
                                               4.持久性(一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即便遭遇故障依然可以經過日誌恢復最後一次更新)
        在 MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務            
        MYSQL 事務處理主要有兩種方法:
                1、用 BEGIN, ROLLBACK, COMMIT來實現
                        BEGIN 開始一個事務
                        ROLLBACK 事務回滾
                        COMMIT 事務確認
                2、直接用 SET 來改變 MySQL 的自動提交模式:
                        SET AUTOCOMMIT=0 禁止自動提交
                        SET AUTOCOMMIT=1 開啓自動提交
                    
05. 簡述數據庫設計中一對多和多對多的應用場景?
        一對多:學生與班級---一個學生只能屬於一個班級,一個班級能夠有多個學生
        多對多:學生與課程---一個學生能夠選擇多個課程,一個課程也能夠被多個學生選擇
        
06. 如何基於數據庫實現商城商品計數器?
        建立一個商城表---包含(id,商品名,每個商品對應數量)
        create table product(id primary key auto_increment,
                             pname varchar(64),
                             pcount int);
                             
07. 簡述觸發器、函數、視圖、存儲過程?
        觸發器:觸發器是一個特殊的存儲過程,它是MySQL在insert、update、delete的時候自動執行的代碼塊。
                create trigger trigger_name
                after/before insert /update/delete on 表名
                for each row
                begin
                sql語句:(觸發的語句一句或多句)
                end
        函數:MySQL中提供了許多內置函數,還能夠自定義函數(實現程序員須要sql邏輯處理)
                自定義函數建立語法:
                        建立:CREATE FUNCTION 函數名稱(參數列表)
                            RETURNS 返回值類型
                            函數體
                        修改: ALTER FUNCTION 函數名稱 [characteristic ...]
                        刪除:DROP FUNCTION [IF EXISTS] 函數名稱
                        調用:SELECT 函數名稱(參數列表)
                        
        視圖:視圖是由查詢結果造成的一張虛擬表,是表經過某種運算獲得的一個投影
                create view view_name as select 語句
        存儲過程:把一段代碼封裝起來,當要執行這一段代碼的時候,能夠經過調用該存儲過程來實現(通過第一次編譯後再次調用不須要再次編譯,比一個個執行sql語句效率高)
                create procedure 存儲過程名(參數,參數,…)
                        begin
                            //代碼
                        end
                        
08. MySQL索引種類
    索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),更通俗的說,數據庫索引比如是一本書前面的目錄,能加快數據庫的查詢速度
    MySQL索引的類型:
                1. 普通索引:這是最基本的索引,它沒有任何限制
                2.惟一索引:索引列的值必須惟一,但容許有空值,若是是組合索引,則列值的組合必須惟一
                3.全文索引:全文索引僅可用於 MyISAM 表,能夠從CHAR、VARCHAR或TEXT列中做爲CREATE TABLE語句的一部分被建立,或是隨後使用ALTER TABLE 或CREATE INDEX被添加
                        (切記對於大容量的數據表,生成全文索引是一個很是消耗時間很是消耗硬盤空間的作法)
                4. 單列索引、多列索引:多個單列索引與單個多列索引的查詢效果不一樣,由於執行查詢時,MySQL只能使用一個索引,會從多個索引中選擇一個限制最爲嚴格的索引。
                5.組合索引(最左前綴):簡單的理解就是隻從最左面的開始組合(實在單列索引的基礎上進一步壓榨索引效率的一種方式)
                
09. 索引在什麼狀況下遵循最左前綴的規則?
    
10. 主鍵和外鍵的區別?
    1.主鍵是能肯定一條記錄的惟一標識
    2.外鍵用於與另外一張表的關聯,是能肯定另外一張表記錄的字段,用於保持數據的一致性
    
11. MySQL常見的函數?
    聚合函數:  AVG(col)返回指定列的平均值
                COUNT(col)返回指定列中非NULL值的個數
                MIN(col)返回指定列的最小值
                MAX(col)返回指定列的最大值
                SUM(col)返回指定列的全部值之和
                GROUP_CONCAT(col) 返回由屬於一組的列值鏈接組合而成的結果
    數學函數:  ABS(x)   返回x的絕對值
                BIN(x)   返回x的二進制(OCT返回八進制,HEX返回十六進制)
    
    
12. 列舉 建立索引可是沒法命中索引的8種狀況。
    1.若是條件中有or,即便其中有條件帶索引也不會使用(這也是爲何儘可能少用or的緣由)
    2.對於多列索引,不是使用的第一部分,則不會使用索引
    3.like查詢是以%開頭
    4.若是列類型是字符串,那必定要在條件中將數據使用引號引用起來,不然不使用索引
    5.若是mysql估計使用全表掃描要比使用索引快,則不使用索引
    6 對小表查詢 
    7 提示不使用索引
    8 統計數據不真實 
    9.單獨引用複合索引裏非第一位置的索引列. 

13. 如何開啓慢日誌查詢?
    1 執行 SHOW VARIABLES LIKE 「%slow%」,獲知 mysql 是否開啓慢查詢
            slow_query_log 慢查詢開啓狀態  OFF 未開啓 ON 爲開啓
            slow_query_log_file 慢查詢日誌存放的位置(這個目錄須要MySQL的運行賬號的可寫權限,通常設置爲MySQL的數據存放目錄)
    2 修改配置文件( 放在[mysqld]下),重啓
            long_query_time 查詢超過多少秒才記錄
    3 測試是否成功
    4 慢查詢日誌文件的信息格式
    
14. 數據庫導入導出命令(結構+數據)?
    1.導出整個數據庫 
  mysqldump -u用戶名 -p密碼  數據庫名 > 導出的文件名 
   例如:C:\Users\jack> mysqldump -uroot -pmysql sva_rec  > e:\sva_rec.sql 
  2.導出一個表,包括表結構和數據 
  mysqldump -u用戶名 -p 密碼  數據庫名 表名> 導出的文件名 
  例如:C:\Users\jack> mysqldump -uroot -pmysql sva_rec date_rec_drv> e:\date_rec_drv.sql 
  3.導出一個數據庫結構 
  例如:C:\Users\jack> mysqldump -uroot -pmysql -d sva_rec > e:\sva_rec.sql 
     4.導出一個表,只有表結構 
  mysqldump -u用戶名 -p 密碼 -d數據庫名  表名> 導出的文件名 
  例如:C:\Users\jack> mysqldump -uroot -pmysql -d sva_rec date_rec_drv> e:\date_rec_drv.sql 
  5.導入數據庫 
  經常使用source 命令 
  進入mysql數據庫控制檯, 
  如mysql -u root -p 
  mysql>use 數據庫 
  而後使用source命令,後面參數爲腳本文件(如這裏用到的.sql) 
  mysql>source d:wcnc_db.sql
    
15. 數據庫優化方案?
    整體思路從如下幾個方面:1、選取最適用的字段屬性
                            二、使用鏈接(JOIN)來代替子查詢(Sub-Queries)
                            3、使用聯合(UNION)來代替手動建立的臨時表
                            4、事務(當多個用戶同時使用相同的數據源時,它能夠利用鎖定數據庫的方法來爲用戶提供一種安全的訪問方式,這樣能夠保證用戶的操做不被其它的用戶所幹擾)
                            5.鎖定表(有些狀況下咱們能夠經過鎖定表的方法來得到更好的性能)
                            6、使用外鍵(鎖定表的方法能夠維護數據的完整性,可是它卻不能保證數據的關聯性。這個時候咱們就可使用外鍵)
                            7、使用索引
                            8、優化的查詢語句(絕大多數狀況下,使用索引能夠提升查詢的速度,但若是SQL語句使用不恰當的話,索引將沒法發揮它應有的做用)
16. char和varchar的區別?
    char:定長,char的存取數度相對快
    varchar:不定長,存取速度相對慢
    到底如何取捨能夠根據一下幾個方面考慮:
               1、對於MyISAM表,儘可能使用Char,對於那些常常須要修改而容易造成碎片的myisam和isam數據表就更是如此,它的缺點就是佔用磁盤空間;
               2、對於InnoDB表,由於它的數據行內部存儲格式對固定長度的數據行和可變長度的數據行不加區分(全部數據行共用一個表頭部分,這個標頭部分存放着指向各有關數據列的指針),
                  因此使用char類型不見得會比使用varchar類型好。事實上,由於char類型一般要比varchar類型佔用更多的空間,因此從減小空間佔用量和減小磁盤i/o的角度,使用varchar類型反而更有利;
               三、存儲很短的信息,好比門牌號碼101,201……這樣很短的信息應該用char,由於varchar還要佔個byte用於存儲信息長度,原本打算節約存儲的如今得不償失。
               4、固定長度的。好比使用uuid做爲主鍵,那用char應該更合適。由於他固定長度,varchar動態根據長度的特性就消失了,並且還要佔個長度信息。
               5、十分頻繁改變的column。由於varchar每次存儲都要有額外的計算,獲得長度等工做,若是一個很是頻繁改變的,那就要有不少的精力用於計算,而這些對於char來講是不須要的。

17. 簡述MySQL的執行計劃?
    執行計劃explain命令是查看查詢優化器如何決定執行查詢的主要方法。
    這個功能有侷限性,並不總會說出真相,但它的輸出是能夠獲取的最好信息,經過輸出結果反推執行過程
18. 在對name作了惟一索引前提下,簡述如下區別:
        select * from tb where name = ‘Oldboy’  -------------查找到tb表中全部name = ‘Oldboy’的數據
        select * from tb where name = ‘Oldboy’ limit 1------查找到tb表中全部name = ‘Oldboy’的數據只取其中的第一條
相關文章
相關標籤/搜索