- MySQL高性能索引
- SQL語句
- MySQL查詢優化
- MySQL高擴展高可用
- MySQL安全性
問題1:char、varchar的區別是什麼?
varchar是變長而char的長度是固定的。若是你的內容是固定大小的,你會獲得更好的性能。mysql
問題2: TRUNCATE和DELETE的區別是什麼?
DELETE命令從一個表中刪除某一行,或多行,TRUNCATE命令永久地從表中刪除每一行。程序員
問題3:什麼是觸發器,MySQL中都有哪些觸發器?
觸發器是指一段代碼,當觸發某個事件時,自動執行這些代碼。在MySQL數據庫中有以下六種觸發器:面試
問題4:FLOAT和DOUBLE的區別是什麼?sql
問題5:如何在MySQL種獲取當前日期?數據庫
SELECT CURRENT_DATE();
問題6:如何查詢第n高的工資?安全
SELECT DISTINCT(salary) from employee ORDER BY salary DESC LIMIT n-1,1
問題7:請寫出下面MySQL數據類型表達的意義(int(0)、char(16)、varchar(16)、datetime、text)服務器
此題考察的是MySQL數據類型。MySQL數據類型屬於MySQL數據庫基礎,由此延伸出的知識點還包括以下內容:數據結構
數據類型考點:併發
一、整數類型,
包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,分別表示1字節、2字節、3字節、4字節、8字節整數。任何整數類型均可以加上UNSIGNED屬性,表示數據是無符號的,即非負整數。 長度:
整數類型能夠被指定長度,例如:INT(11)表示長度爲11的INT類型。長度在大多數場景是沒有意義的,它不會限制值的合法範圍,只會影響顯示字符的個數,並且須要和UNSIGNED ZEROFILL屬性配合使用纔有意義。 例子,
假定類型設定爲INT(5),屬性爲UNSIGNED ZEROFILL,若是用戶插入的數據爲12的話,那麼數據庫實際存儲數據爲00012。二、實數類型,
包括FLOAT、DOUBLE、DECIMAL。 三、字符串類型,
包括VARCHAR、CHAR、TEXT、BLOB 使用策略:
對於常常變動的數據來講,CHAR比VARCHAR更好,由於CHAR不容易產生碎片。
對於很是短的列,CHAR比VARCHAR在存儲空間上更有效率。
使用時要注意只分配須要的空間,更長的列排序時會消耗更多內存。
儘可能避免使用TEXT/BLOB類型,查詢時會使用臨時表,致使嚴重的性能開銷。函數
四、枚舉類型(ENUM),
把不重複的數據存儲爲一個預約義的集合。 五、日期和時間類型,
儘可能使用timestamp,空間效率高於datetime, 答:int(0)表示數據是INT類型,長度是0、char(16)表示固定長度字符串,長度爲1六、varchar(16)表示可變長度字符串,長度爲1六、datetime表示時間類型、text表示字符串類型,能存儲大字符串,最多存儲65535字節數據)
常見操做
-u:指定用戶名
-p:指定密碼
-h:主機
-P:端口
G:打印結果垂直顯示
c:取消當前MySQL命令
q:退出MySQL鏈接
s:顯示服務器狀態
h:幫助信息
d:改變執行符
一、InnoDB存儲引擎,
二、MyISAM存儲引擎,
三、其餘表引擎,
Archive、Blackhole、CSV、Memory
使用策略
在大多數場景下建議使用InnoDB存儲引擎。
表鎖是平常開發中的常見問題,所以也是面試當中最多見的考察點,當多個查詢同一時刻進行數據修改時,就會產生併發控制的問題。共享鎖和排他鎖,就是讀鎖和寫鎖。
使用策略
提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的存儲過程。
使用場景
問題8:請說明InnoDB和MyISAM的區別
問題9:innodb引擎的特性
問題10:請列舉3個以上表引擎
InnoDB、MyISAM、Memory
問題11:請說明varchar和text的區別
問題11:varchar(50)中50的含義
最多存放50個字符,varchar(50)和(200)存儲hello所佔空間同樣,但後者在排序時會消耗更多內存,由於order by col採用fixed_length計算col長度(memory引擎也同樣)。
問題12:int(20)中20的含義
是指顯示字符的長度,不影響內部存儲,只是當定義了ZEROFILL時,前面補多少個 0
問題13:簡單描述MySQL中,索引,主鍵,惟一索引,聯合索引的區別,對數據庫的性能有什麼影響?
此真題主要考察的是MySQL索引的基礎和類型,由此延伸出的知識點還包括以下內容:
索引的基礎
建立索引的語法:
索引對性能的影響:
索引的使用場景:
索引的類型:
索引不少種類型,是在MySQL的存儲引擎實現的。
索引的區別:
-一個表只能有一個主鍵索引,可是能夠有多個惟一索引。
MySQL索引的建立原則
MySQL索引的注意事項
一、聯合索引遵循前綴原則
KEY(a,b,c)WHERE a = 1 AND b = 2 AND c = 3WHERE a = 1 AND b = 2WHERE a = 1#以上SQL語句能夠用到索引WHERE b = 2 AND c = 3WHERE a = 1 AND c = 3#以上SQL語句用不到索引
二、LIKE查詢,%不能在前
WHERE name LIKE "%wang%"#以上語句用不到索引,能夠用外部的ElasticSearch、Lucene等全文搜索引擎替代。
三、列值爲空(NULL)時是可使用索引的,但MySQL難以優化引用了可空列的查詢,它會使索引、索引統計和值更加複雜。可空列須要更多的儲存空間,還須要在MySQL內部進行特殊處理。
四、若是MySQL估計使用索引比全表掃描更慢,會放棄使用索引,例如:
表中只有100條數據左右。對於SQL語句WHERE id > 1 AND id < 100,MySQL會優先考慮全表掃描。
五、若是關鍵詞or前面的條件中的列有索引,後面的沒有,全部列的索引都不會被用到。
六、列類型是字符串,查詢時必定要給值加引號,不然索引失效,例如:
列name varchar(16),存儲了字符串"100"
WHERE name = 100;
以上SQL語句能搜到,但沒法用到索引。
MySQL索引的原理
注:B+ 樹是一種樹數據結構,是一個n叉排序樹,每一個節點一般有多個孩子,一棵B+樹包含根節點、內部節點和葉子節點。根節點多是一個葉子節點,也多是一個包含兩個或兩個以上孩子節點的節點。B+ 樹一般用於數據庫和操做系統的文件系統中。NTFS, ReiserFS, NSS, XFS, JFS, ReFS 和BFS等文件系統都在使用B+樹做爲元數據索引。B+ 樹的特色是可以保持數據穩定有序,其插入與修改擁有較穩定的對數時間複雜度。B+ 樹元素自底向上插入。
InnoDB經過主鍵聚簇數據,若是沒有定義主鍵,會選擇一個惟一的非空索引代替,若是沒有這樣的索引,會隱式定義個主鍵做爲聚簇索引。
下圖形象說明了聚簇索引表(InnoDB)和普通的堆組織表(MyISAM)的區別:
最常問的MySQL面試題三——每一個開發人員都應該知道
對於普通的堆組織表來講(右圖),表數據和索引是分別存儲的,主鍵索引和二級索引存儲上沒有任何區別。
而對於聚簇索引表來講(左圖),表數據是和主鍵一塊兒存儲的,主鍵索引的葉結點存儲行數據,二級索引的葉結點存儲行的主鍵值。
聚簇索引表最大限度地提升了I/O密集型應用的性能,但它也有如下幾個限制:
二級索引的葉節點存儲的是主鍵值,而不是行指針,這是爲了減小當出現行移動或數據頁分裂時二級索引的維護工做,但會讓二級索引佔用更多的空間。
在一些MySQL索引基礎考題中,咱們能夠輕鬆的經過索引基礎和類型來解決此類問題,對於一些索引建立注意事項方面的考點,咱們能夠經過索引建立原則和注意事項來解決。
問題14:建立MySQL聯合索引應該注意什麼?
需遵循前綴原則
問題15:列值爲NULL時,查詢是否會用到索引?
在MySQL裏NULL值的列也是走索引的。固然,若是計劃對列進行索引,就要儘可能避免把它設置爲可空,MySQL難以優化引用了可空列的查詢,它會使索引、索引統計和值更加複雜。
_問題16:如下語句是否會應用索引:SELECT_FROM users WHERE YEAR(adddate) < 2007;*
不會,由於只要列涉及到運算,MySQL就不會使用索引。
問題17:MyISAM索引實現?
MyISAM存儲引擎使用B+Tree做爲索引結構,葉節點的data域存放的是數據記錄的地址。MyISAM的索引方式也叫作非聚簇索引的,之因此這麼稱呼是爲了與InnoDB的聚簇索引區分。
問題17:MyISAM索引與InnoDB索引的區別?
問題18:如下三條sql 如何建索引,只建一條怎麼建?
WHERE a=1 AND b=1WHERE b=1WHERE b=1 ORDER BY time DESC
以順序b,a,time創建聯合索引,CREATE INDEX table1_b_a_time ON index_test01(b,a,time)。由於最新MySQL版本會優化WHERE子句後面的列順序,以匹配聯合索引順序。
問題19:有A(id,sex,par,c1,c2),B(id,age,c1,c2)兩張表,其中A.id與B.id關聯,如今要求寫出一條SQL語句,將B中age>50的記錄的c1,c2更新到A表中同一記錄中的c1,c2字段中
考點分析
這道題主要考察的是MySQL的關聯UPDATE語句
延伸考點:
UPDATE A,B SET A.c1 = B.c1, A.c2 = B.c2 WHERE A.id = B.idUPDATE A INNER JOIN B ON A.id=B.id SET A.c1 = B.c1,A.c2=B.c2再加上B中age>50的條件:UPDATE A,B set A.c1 = B.c1, A.c2 = B.c2 WHERE A.id = B.id and B.age > 50;UPDATE A INNER JOIN B ON A.id = B.id set A.c1 = B.c1,A.c2 = B.c2 WHERE B.age > 50