【面試題】--【MySql】

  • 事務的基本特徵原子性(atomicity):

    • 原子性 : 一個事務必須視爲一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於一個事務來說,不可能只執行其中的一部分操作。
    • 一致性(consistency):數據庫總數從一個一致性的狀態轉換到另一個一致性的狀態。
    • 隔離性(isolation):一個事務所做的修改在最終提交以前,對其他事務是不可見的。
    • 持久性(durability):一旦事務提交,則其所做的修改就會永久保存到數據庫中。此時即使系統崩潰,修改的數據也不會丟失。
  • 事務的隔離級別

    • 讀未提交(Read uncommitted),一個事務可以讀取另一個未提交事務的數據,最低級別,任何情況都無法保證。
    • 讀已提交(Read committed),一個事務要等另一個事務提交後才能讀取數據,可避免髒讀的發生。
    • 可重複讀(Repeatable read),就是在開始讀取數據(事務開啓)時,不再允許修改操作,可避免髒讀、不可重複讀的發生。Mysql的默認隔離級別是可重複讀(Repeatable read)。
    • 串行(Serializable),是最高的事務隔離級別,在該級別下,事務串行化順序執行,可以避免髒讀、不可重複讀與幻讀。但是這種事務隔離級別效率低下,比較耗數據庫性能,一般不使用。
  • 說一說髒讀、不可重複讀、幻讀髒讀

    • 髒讀: 事務A讀取了事務B更新的數據,然後B回滾操作,那麼A讀取到的數據是髒數據;
    • 不可重複讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新並提交,導致事務A多次讀取同一數據不一致;
    • 幻讀:幻讀解決了不重複讀,保證了同一個事務裏,查詢的結果都是事務開始時的狀態(一致性);
  • 數據表類型有哪些答

    • MyIASMInnoDBHEAPISAMMERGEDBD以及Gemeni(一般只知道前兩者即可);
  • innodb引擎的4大特性答

    • 插入緩衝(insert buffer);二次寫(double write);自適應哈希索引(ahi);預讀(read ahead)
  • InnoDB引擎的行鎖是通過加在什麼上實現的

    • 答:基於索引
  • myisam與innodb的區別

    • InooDB支持事務,而MyISAM不支持事務;
    • InnoDB支持行級鎖,而MyISAM支持表級鎖;
    • InnoDB支持MVCC,而MyISAM不支持;
    • InnoDB支持外鍵,而MyISAM不支持;
    • InnoDB支持全文索引,而MyISAM支持;
    • InnoDB能通過直接拷貝表文件的方法拷貝表到另外一臺機器, myisam 支持;
    • InnoDB表支持多種行格式, myisam 不支持;
    • InnoDB是索引組織表, myisam 是堆表
  • myisam與innodb select count(*)哪個更快,爲什麼?

    • myisam更快,因爲myisam內部維護了一個計數器,可以直接調取。
  • 數據庫三大範式

    • 第一範式:數據庫表中的字段都是單一屬性的,不可再分(保持數據的原子性);
    • 第二範式:第二範式必須符合第一範式,非主屬性必須完全依賴於主鍵
    • 第三範式:在滿足第二範式的基礎上,在實體中不存在其他實體中的非主鍵屬性,傳遞函數依賴於主鍵屬性,確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關(表中字段[非主鍵]不存在對主鍵的傳遞依賴)
  • 說一說你能想到的sql語句優化

    • 避免select *,將需要查找的字段列出來;
    • 使用連接(join)來代替子查詢
    • 拆分大的delete或insert語句;
    • 使用limit對查詢結果的記錄進行限定;
    • 用 exists 代替 in 是一個好的選擇;
    • Where子句替換HAVING 子句, 因爲HAVING 只會在檢索出所有記錄之後纔對結果集進行過濾;
    • 不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確
    • 使用索引儘量避免在where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描;
    • 儘量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描;
    • 儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描;
  • 說一說你能想到的表結構優化

    • 永遠爲每張表設置一個ID (所有建表的時候不設置主鍵的程序猿都應該被辭退);
    • 選擇正確的存儲引擎 ;
    • 使用可存下數據的最小的數據類型,整型 < date,time < char,varchar < blob;
    • 使用簡單的數據類型,整型比字符處理開銷更小,因爲字符串的比較更復雜。如,int類型存儲時間類型,bigint類型轉ip函數;
    • 使用合理的字段屬性長度,固定長度的表會更快。
    • 使用enum、char而不是varchar;
    • 儘可能使用not null定義字段(給空字段設置默認值);
    • 儘量少用text;給頻繁使用和查詢的字段建立合適的索引;
  • 說幾個mysql中你常用的函數答

    • sum、count 、avg、min、max
  • 說幾個你除了增刪改查之外在mysql中常用的命令答

    • Explain、describe、show、truncate
  • 說幾個除了增刪改查之外常用的關鍵字答

    • distinct、limit、offset、order by、union、union all、between、group by;
  • union、union all的區別對重複結果的處理

    • UNION在進行錶鏈接後會篩選掉重複的記錄,Union All不會去除重複記錄;
    • 對排序的處理:Union將會按照字段的順序進行排序;UNION ALL只是簡單的將兩個結果合併後就返回;
    • 從效率上說,UNION ALL 要比UNION快很多
  • varchar(100)和varchar(200)的區別答

    • varchar(100)最多存放100個字符,varchar(200)最多存放200個字符,
    • varchar(100)和(200)存儲 hello所佔空間一樣,但後者在排序時會消耗更多內存,因爲order by col採用fixed_length計算col長度(memory引擎也一樣)
  • varchar(20)和int(20)中的20含義一樣嗎

    • 不一樣,前者表示最多存放20個字符,後者表示最多顯示20個字符,但是存儲空間還是佔4字節存儲,存儲範圍不變;
  • 什麼是存儲過程?用什麼來調用?

    • 存儲過程是一個預編譯的SQL 語句,優點是允許模塊化的設計,就是說只需創建一次,以後在該程序中就可以調用多次。如果某次操作需要執行多次SQL ,使用存儲過程比單純SQL 語句執行要快。可以用一個命令對象來調用存儲過程。
  • 什麼是觸發器?觸發器的作用?

    • 觸發器是一中特殊的存儲過程,主要是通過事件來觸發而被執行的。
    • 它可以強化約束,來維護數據的完整性和一致性,可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化。
    • 可以聯級運算。如,某表上的觸發器上包含對另一個表的數據操作,而該操作又會導致該表觸發器被觸發。
  • 存儲過程與觸發器的區別

    • 觸發器與存儲過程非常相似,觸發器也是SQL語句集,兩者唯一的區別是觸發器不能用EXECUTE語句調用,而是在用戶執行Transact-SQL語句時自動觸發(激活)執行。觸發器是在一個修改了指定表中的數據時執行的存儲過程。通常通過創建觸發器來強制實現不同表中的邏輯相關數據的引用完整性和一致性。由於用戶不能繞過觸發器,所以可以用它來強制實施複雜的業務規則,以確保數據的完整性。觸發器不同於存儲過程,觸發器主要是通過事件執行觸發而被執行的,而存儲過程可以通過存儲過程名稱名字而直接調用。當對某一表進行諸如UPDATE、INSERT、DELETE這些操作時,SQLSERVER就會自動執行觸發器所定義的SQL語句,從而確保對數據的處理必須符合這些SQL語句所定義的規則。
  • 索引的作用?和它的優點缺點是什麼?

    • 索引就一種特殊的查詢表,數據庫的搜索引擎可以利用它加速對數據的檢索。它很類似與現實生活中書的目錄,不需要查詢整本書內容就可以找到想要的數據。索引可以是唯一的,創建索引允許指定單個列或者是多個列。缺點是它減慢了數據錄入的速度,同時也增加了數據庫的尺寸大小。
  • MySQL主要的索引類型

    • 普通索引:是最基本的索引,它沒有任何限制;
    • 唯一索引:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一;
    • 主鍵索引:是一種特殊的唯一索引,一個表只能有一個主鍵索引,不允許有空值;
    • 組合索引:指多個字段上創建的索引,只有在查詢條件中使用了創建索引時的第一個字段,索引纔會被使用。使用組合索引時遵循最左前綴集合;
    • 全文索引:主要用來查找文本中的關鍵字,而不是直接與索引中的值相比較,mysql中MyISAM支持全文索引而InnoDB不支持;
  • 使用like ‘a%’ 、like’%a’、like’%a%'查詢時是否會使用索引

    • 'a%'會,其他兩個不會;
  • 使用索引注意事項

    • 索引不會包含有NULL的列,複合索引中只要有一列含有NULL值,那麼這一列對於此符合索引就是無效的;
    • 使用短索引,對串列進行索引,如果可以就應該指定一個前綴長度;
    • 短索引不僅可以提高查詢速度而且可以節省磁盤空間和I/O操作;
    • mysql查詢只使用一個索引,因此數據庫默認排序可以符合要求的情況下不要使用排序操作,儘量不要包含多個列的排序,如果需要最好給這些列建複合索引;
    • 注意like,上文已經提到;
    • 不要在列上進行運算;
    • 不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的;
    • 索引要建立在經常進行select操作的字段上;
    • 索引要建立在值比較唯一的字段上;
    • 對於那些定義爲text、image和bit數據類型的列不應該增加索引;
    • 在where和join中出現的列需要建立索引;
    • 如果where字句的查詢條件裏使用了函數(如:where DAY(column)=…),mysql將無法使用索引;
    • 在join操作中(需要從多個數據表提取數據時),mysql只有在主鍵和外鍵的數據類型相同時才能使用索引,否則及時建立了索引也不會使用;
  • 說一說什麼是外鍵優缺點

    • 外鍵指的是外鍵約束,目的是保持數據一致性,完整性,控制存儲在外鍵表中的數據。
    • 使兩張表形成關聯,外鍵只能引用外表中列的值;
    • 優點:由數據庫自身保證數據一致性,完整性,更可靠,因爲程序很難100%保證數據的完整性,而用外鍵即使在數據庫服務器宕機或者出現其他問題的時候,也能夠最大限度的保證數據的一致性和完整性。
    • 有主外鍵的數據庫設計可以增加ER圖的可讀性,這點在數據庫設計時非常重要。外鍵在一定程度上說明的業務邏輯,會使設計周到具體全面。
    • 缺點:可以用觸發器或應用程序保證數據的完整性;
    • 過分強調或者說使用外鍵會平添開發難度,導致表過多,更改業務困難,擴展困難等問題;
    • 不用外鍵時數據管理簡單,操作方便,性能高(導入導出等操作,在insert, update, delete 數據的時候更快);
  • 在什麼時候你會選擇使用外鍵

    • 在我的業務邏輯非常簡單,業務一旦確定不會輕易更改,表結構簡單,業務量小的時候我會選擇使用外鍵。因爲當不符合以上條件的時候,外鍵會影響業務的擴展和修改,當數據量龐大時,會嚴重影響增刪改查的效率。
  • 什麼叫視圖遊標是什麼

    • 視圖是一種虛擬的表,具有和物理表相同的功能;
    • 可以對視圖進行增,改,查,操作,視圖通常是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表。
    • 它使得我們獲取數據更容易,相比多表查詢。
    • 遊標:是對查詢出來的結果集作爲一個單元來有效的處理。遊標可以定在該單元中的特定行,從結果集的當前行檢索一行或多行。可以對結果集當前行做修改。一般不使用遊標,但是需要逐條處理數據的時候,遊標顯得十分重要。
  • mysql有沒有rowid

    • 沒有,InnoDB如果沒有定義主鍵,內部會生成一個主鍵編號rowid ,但是無法查詢到。在平時InnoDB建表的時候我們最好自己確定主鍵,防止每次插入數據前數據庫會去生成rowid。
  • mysql怎麼在查詢時給查出來的數據設置一個自增的序號

    • set @i=0;SELECT (@i:=@i+1) 別名 FROM table, (SELECT @i:=0) AS 別名 ;
  • 如何使用explain優化sql和索引

    • explain sql ;table:顯示這一行的數據是關於哪張表的;
    • type:這是重要的列,顯示連接使用了何種類型。從最好到最差的連接類型爲const、eq_reg、ref、range、index和ALL;
    • all: full table scan ;MySQL將遍歷全表以找到匹配的行;
    • index : index scan; index 和 all的區別在於index類型只遍歷索引;
    • range:索引範圍掃描,對索引的掃描開始於某一點,返回匹配值的行,常見與between ,< ,>等查詢;
    • ref:非唯一性索引掃描,返回匹配某個單獨值的所有行,常見於使用非唯一索引即唯一索引的非唯一前綴進行查找;
    • eq_ref:唯一性索引掃描,對於每個索引鍵,表中只有一條記錄與之匹配,常用於主鍵或者唯一索引掃描;
    • const,system:當MySQL對某查詢某部分進行優化,並轉爲一個常量時,使用這些訪問類型;如果將主鍵置於where列表中,MySQL就能將該查詢轉化爲一個常量;
    • possible_keys:顯示可能應用在這張表中的索引;如果爲空,沒有可能的索引;可以爲相關的域從WHERE語句中選擇一個合適的語句;
    • key: 實際使用的索引;如果爲NULL,則沒有使用索引;很少的情況下,MySQL會選擇優化不足的索引;這種情況下,可以在SELECT語句中使用USE INDEX(indexname)來強制使用一個索引或者用IGNORE INDEX(indexname)來強制MySQL忽略索引
    • key_len:使用的索引的長度;在不損失精確性的情況下,長度越短越好;
    • ref:顯示索引的哪一列被使用了,如果可能的話,是一個常數;
    • rows:MySQL認爲必須檢查的用來返回請求數據的行數;
    • Extra:關於MySQL如何解析查詢的額外信息;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章