MySQL面試

優化查詢

1.使用索引

儘可能避免全表掃描,在常常用來搜索的字段上創建索引。html

2.優化SQL語句

經過EXPLAIN來查看SQL語句執行效果,explain select * from mysql

避免使用select * from  ,用具體的字段表明*sql

查詢儘量使用limit,減小返回的行數數據庫

避免在where子句中使用函數、運算,不然會放棄索引而使用全表掃描。緩存

儘可能避免使用or,or可能會致使放棄索引,可使用union all   安全

select id from t where num=10 or num=20 
能夠這樣查詢: 
select id from t where num=10 
union all 
select id from t where num=20 服務器

應儘可能避免在 where 子句中對字段進行 null 值判斷,不然將致使引擎放棄使用索引而進行全表掃描

3 垂直拆分

按列進行拆分,若是表中一些列經常使用,而另一些不經常使用,就能夠將他們拆分開來。併發

水平拆分:app

一個表中數據量特別多時,將該表水平地拆分多個表。負載均衡

4 硬件優化

選擇多核和主頻高的 CPU; 使用更大的內存,將更多內存分配給MySQL

5  使用查詢緩存。

更新不頻繁的表。

若是訪問量特別大(本身項目出現大數據量)

除了上面的優化,還能夠主從複製、讀寫分離、負載均衡

經過設置主從數據庫實現讀寫分離,主數據庫負責「寫操做」,從數據庫負責「讀操做」,根據壓力狀況,從數據庫能夠部署多個提升「讀」的速度,藉此來提升系統整體的性能。

mysql 主(稱master)從(稱slave)複製的原理:
(1)master 將數據改變記錄到二進制日誌(binary log)中,也便是配置文件log-bin 指定
的文件(這些記錄叫作二進制日誌事件,binary log events)
PS:從圖中能夠看出,Slave 服務器中有一個I/O 線程(I/O Thread)在不停地監聽Master
的二進制日誌(Binary Log)是否有更新:若是沒有它會睡眠等待Master 產生新的日誌事件;
若是有新的日誌事件(Log Events),則會將其拷貝至Slave 服務器中的中繼日誌(Relay
Log)。
(2).slave 將master 的二進制日誌事件(binary log events)拷貝到它的中繼日誌(relay
log)
(3).slave 重作中繼日誌中的事件,將Master 上的改變反映到它本身的數據庫中。,所
以兩端的數據是徹底同樣的。

 

 數據庫三級範式

第一範式:確保每一列的原子性,字段不可再分。

第二範式:知足第一範式。非主鍵字段依賴於主鍵字段。一個表只能說明一個事物。

表:學號, 姓名, 年齡, 課程名稱, 成績, 學分;
這個代表顯說明了兩個事物:學生信息, 課程信息。

第三範式:任何非主鍵屬性不能依賴於其餘非主鍵屬性

學號, 姓名, 年齡, 所在學院, 學院地點,學院聯繫電話,主鍵爲"
學號「;
存在依賴傳遞: (學號) → (所在學院) → (學院地點, 學院電話)

drop 、truncate、delete

 drop直接刪掉表 truncate刪除表中數據,再插入時自增加id又從1開始 ;delete刪除表中數據,能夠加where字句,delete的自增加id不會變,從上一個最大值開始

當你再也不須要該表時, 用 drop;當你仍要保留該表,但要刪除全部記錄時, 用 truncate;當你要刪除部分記錄時(always with a WHERE clause), 用 delete.

事務的四個特性

事務是由一系列SQL語句組成的一系列操做

原子性:一個事務的全部操做,要麼所有成功,要麼都不成功。

一致性:事務執行先後保證數據的完整性。好比轉帳,總金額不變

隔離性:一個事務的執行,不能受其餘事務的干擾。

持久性:一個事務一旦執行成功,它對數據的修改就是永久性的。

併發讀問題

髒讀:讀到另外一個事務未提交的數據。

不可重複讀:對一個事物兩次讀取不一致,另外一個事物作了修改。

幻讀:對一張表兩次查詢不一致,另外一個事務插入或刪除了記錄,出現幻行、。

解決併發問題

加鎖。樂觀鎖、悲觀鎖、行鎖、表鎖。看鎖的文章

四大隔離級別,等級由低到高

讀未提交數據:能夠讀未提交的數據。髒讀、不可重複讀、幻讀

讀已提交數據:避免髒讀。可能有不可重複讀、幻讀

可重複讀:避免了髒讀和不可重複讀。同一事物屢次讀取一樣記錄結果一致。可是不能解決幻讀。由於另外一個事務插入記錄,會出現幻行。MySQL默認該隔離級                    別。同時,InnoDB引擎使用間隙鎖解決了幻讀問題。

串行化:強制事物串行執行,沒有併發,也就沒有問題。

count(*) 跟count(1) 的結果同樣,返回記錄的總行數,都包括
對NULL 的統計,而count(column) 是不包括NULL 的統計

索引相關問題

索引的優缺點

優勢:

   1.大大加快數據的檢索速度。

   2.建立惟一索引,保證表中每一行數據惟一。

 缺點:

     1. 佔用物理內存

     2.對錶中數據進行增長刪減時,索引須要動態維護。

儘可能選擇區分度高的字段做爲索引。好比性別,區分度就不高。

索引有哪些

惟一索引:在表上一個或者多個字段組合創建的索引,這個或者這些字段組合值在表中是不可重複的,好比主鍵就能夠做爲惟一索引。

主鍵索引(主索引):這是惟一索引的特例。一個表只能有一個主索引。

組合索引:基於多個字段的索引。 建立索引 create index idx1 on table1(col1,col2,col3) 查詢 select * from table1 where col1= A and col2= B and col3 = C

索引的建立

CREATE UNIQUE INDEX index_name ON table_name (column_list)

ALTER TABLE table_name ADD INDEX index_name (column_list)

索引的原理

http://www.javashuo.com/article/p-yhpqgfto-q.html

mysql 中MyIsam 與InnoDB 的區別,至少5 點。

Mysql 數據庫中,最經常使用的兩種引擎是innordb 和myisam。InnoDB 是Mysql 的默認存儲引擎。

1.MyISAM 不提供事務支持。InnoDB 提供事務支持事務。

2.MyISAM 不支持外鍵,InnoDB 支持外鍵。

3.鎖MyISAM 只支持表級鎖,InnoDB 支持行級鎖和表級鎖,默認是行級鎖,行鎖大幅度提升了多用戶併發操做的性能。innodb 比較適合於插入和更新操做比較多的狀況,而myisam 則適合用於頻繁查詢的狀況。

4.MyISAM 支持全文索引, InnoDB 不支持全文索引

5.MyISAM:容許沒有主鍵的表存在。InnoDB:若是沒有設定主鍵,就會自動生成一個6 字節的主鍵(用戶不可見)

一張表,裏面有ID 自增主鍵,當insert 了17 條記錄以後,刪除了第15,16,17 條記錄,再把Mysql 重啓,再insert 一條記錄,這條記錄的ID 是18 仍是15 ?

若是表的類型是MyISAM,那麼是18。由於MyISAM 表會把自增主鍵的最大ID 記錄到數據文件裏,重啓MySQL 自增主鍵的最大ID 也不會丟失。若是表的類型是InnoDB,那麼是15。InnoDB 表只是把自增主鍵的最大ID 記錄到內存中,因此重啓數據庫會致使最大ID 丟失。

數據庫索引失效的幾種狀況。

1.對於組合索引,不是使用的第一部分,則不會使用索引。
2.or 語句先後沒有同時使用索引。要想使用or,又想讓索引生效,只能將or 條件中的每一個
列都加上索引。
3.若是列類型是字符串,那必定要在條件中使用引號引發來,不然不會使用索引。
4.若是mysql 估計使用全表描述比使用索引快,則不使用索引。
5.在索引列上作運算或者使用函數。
6.以「%」開頭的LIKE 查詢,模糊匹配。

 

行鎖、表鎖

MyISAM使用的是表鎖,會給整張表加鎖,不會出現死鎖。

InnoDB使用行鎖和表鎖,默認行鎖,行鎖會產生死鎖。

InnoDB行鎖是經過給索引加鎖來實現的。也就是說,並非給記錄加鎖,而是索引加鎖,若是沒有使用索引,那麼InnoDB仍是會使用表鎖。

雖然訪問不一樣的行,可是若是使用的是相同的索引,那麼仍是會出現衝突。

行鎖的死鎖

當兩個事務同時執行,一個鎖住了主鍵索引,在等待其餘相關索引。另外一個鎖定了非主鍵索引,在等待主鍵索引。這樣就會發生死鎖。

發生死鎖後,InnoDB通常均可以檢測到,將持有最少行級鎖的事務回滾。

有多種方法能夠避免死鎖,這裏只介紹常見的三種

一、若是不一樣程序會併發存取多個表,儘可能約定以相同的順序訪問表,能夠大大下降死鎖機會。

二、在同一個事務中,儘量作到一次鎖定所須要的全部資源,減小死鎖產生機率;

三、對於很是容易產生死鎖的業務部分,能夠嘗試使用升級鎖定顆粒度,經過表級鎖定來減小死鎖產生的機率;

 

什麼是存儲過程呢?
存儲過程就是做爲可執行對象存放在數據庫中的一個或多個SQL命令。 
通俗來說:存儲過程其實就是能完成必定操做的一組SQL語句。

那爲何要用存儲過程呢?
1.存儲過程只在創造時進行編譯,之後每次執行存儲過程都不需再從新編譯,而通常SQL語句每執行一次就編譯一次,因此使用存儲過程可提升數據庫執行速度。
2.當對數據庫進行復雜操做時,可將此複雜操做用存儲過程封裝起來與數據庫提供的事務處理結合一塊兒使用。
3.存儲過程能夠重複使用,可減小數據庫開發人員的工做量。
4.安全性高,可設定只有某些用戶才具備對指定存儲過程的使用權

 

InnoDB事務的實現

隔離性:經過鎖實現

原子性和一致性:經過回滾日誌(undo log)實現。全部事務進行的修改都會先記錄到這個回滾日誌中,而後在對數據庫中的對應行進行寫入。當出現錯誤或者須要rollback時,只會按照日誌邏輯地將數據庫中的修改撤銷掉看

持久性:經過重作日誌(redo Log)實現。重作日誌由兩部分組成,一是內存中的重作日誌緩衝區,由於重作日誌緩衝區在內存中,因此它是易失的,另外一個就是在磁盤上的重作日誌文件,它是持久的。當咱們在一個事務中嘗試對數據進行修改時,它會先將數據從磁盤讀入內存,並更新內存中緩存的數據,而後生成一條重作日誌並寫入重作日誌緩存,當事務真正提交時,MySQL 會將重作日誌緩存中的內容刷新到重作日誌文件,再將內存中的數據更新到磁盤上。在發生錯誤後,數據庫重啓時會從重作日誌中找出未被更新到數據庫磁盤中的日誌從新執行以知足事務的持久性。

 

聚簇索引和非 聚簇索引

聚簇索引的葉子節點就是數據節點,而非聚簇索引的葉子節點仍然是索引節點,只不過有指向對應數據塊的指針。

union 與union all的區別

union 在進行表連接後會篩選掉重複的記錄,因此在表連接後會對所產生的結果集進行排 序運算,刪除重複的記錄再返回結果。 union all 則會顯示重複結果,只是簡單的兩個結果合併並返回.因此效率比union高,在保證沒有重複數據的狀況下用union all.
例:選擇全部不一樣的country,去重
SELECT country FROM Websites
UNION
SELECT country FROM apps
例:直接將兩個表的country拼接返回,不去重
SELECT country FROM Websites
UNION ALL
SELECT country FROM apps

內鏈接和外連接

 
 
 
 
 
 
 
 

內鏈接 則是隻有條件的交叉鏈接,根據某個條件篩選出符合條件的記錄,不符合條件的記錄不會出如今結果集中,即內鏈接只鏈接匹配的行。
外鏈接 其結果集中不只包含符合鏈接條件的行,並且還會包括左表、右表或兩個表中
的全部數據行,這三種狀況依次稱之爲左外鏈接,右外鏈接,和全外鏈接。

左外鏈接,也稱左鏈接,左表爲主表,左表中的全部記錄都會出如今結果集中,對於那些在右表中並無匹配的記錄,仍然要顯示,右邊對應的那些字段值以NULL來填充。右外鏈接,也稱右鏈接,右表爲主表,右表中的全部記錄都會出如今結果集中。左鏈接和右鏈接能夠互換,MySQL目前還不支持全外鏈接。

視圖

視圖是一種虛擬的表,具備和物理表相同的功能。能夠對視圖進行增,改,查,操做,視圖是從一個或幾個基本表導出的表。對視圖的修改不影響基本表。它使得咱們獲取數據更容易,相比多表查詢。

主鍵和外鍵

主鍵--惟一標識一條記錄,不能有重複的,不容許爲空

 外鍵--表的外鍵是另外一表的主鍵, 外鍵能夠有重複的, 能夠是空值

主鍵--主鍵只能有一個

 外鍵--一個表能夠有多個外鍵

NULL是什麼意思

答:NULL這個值表示UNKNOWN(未知):它不表示「」(空字符串)。對NULL這個值的任何比較都會生產一個NULL值。您不能把任何值與一個 NULL值進行比較,並在邏輯上但願得到一個答案。

char和varchar的區別?

答:是一種固定長度的類型,varchar則是一種可變長度的類型,它們的區別是:  

char(M)類型的數據列裏,每一個值都佔用M個字節,若是某個長度小於M,MySQL就會在它的右邊用空格字符補足.(在檢索操做中那些填補出來的空格字符將被去掉)在varchar(M)類型的數據列裏,每一個值只佔用恰好夠用的字節再加上一個用來記錄其長度的字節(即總長度爲L+1字節).

 視圖

視圖(view)是一種虛擬存在的表,是一個邏輯表,自己並不包含數據。做爲一個select語句保存在數據字典中的。

  經過視圖,能夠展示基表的部分數據;視圖數據來自定義視圖的查詢中使用的表,使用視圖動態生成。

存儲過程和函數

存儲過程和函數是事先通過編譯並存儲在數據庫中的一段SQL 語句的集合,調用存儲過程和函數能夠簡化應用開發人員的不少工做,減小數據在數據庫和應用服務器之間的傳輸,對於提升數據處理的效率是有好處的存儲過程和函數的區別在於函數必須有返回值,而存儲過程沒有。

觸發器簡介

觸發器是一個特殊的存儲過程,執行存儲過程須要使用CALL語句來調用,可是觸發器的執行不須要用CALL語句調用,也不須要手工啓動,只要的當一個預約義的事件發生時,就會被MYSQL自動調用。好比當對fruits表進行INSERT,DELETE或UPDATE操做時就會激活它。觸發器能夠查詢數據表,並且能夠包含複雜的SQL語句,主要用於複雜的業務規則或要求。

外鍵約束

一個表中的 FOREIGN KEY 指向另外一個表中的 PRIMARY KEY。經過外鍵與其餘表創建關係。

主鍵、外鍵和索引的區別

 

主鍵

外鍵

索引

定義:

惟一標識一條記錄,不能有重複的,不容許爲空

表的外鍵是另外一表的主鍵, 外鍵能夠有重複的, 能夠是空值

該字段沒有重複值,但能夠有一個空值

做用:

用來保證數據完整性

用來和其餘表創建聯繫用的

是提升查詢排序的速度

個數:

主鍵只能有一個

一個表能夠有多個外鍵

一個表能夠有多個唯一索引

相關文章
相關標籤/搜索