数据库基础-面试
普通索引(INDEX):最基本的索引,沒有任何限制
唯一索引(UNIQUE):與"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。
主鍵索引(PRIMARY):它 是一種特殊的唯一索引,不允許有空值。
全文搜索的索引(FULLTEXT)。FULLTEXT 用于搜索很長一篇文章的時候,效果最好。用在比較短的文本,如果就一兩行字的,普通的 INDEX 也可以。
mysql聯合索引(B+Tree中的“最左前綴原理”)簡單的理解就是只從最左邊開始組合。
簡單的理解就是只從最左面的開始組合。并不是只要包含這兩列的查詢都會用到該聯合索引。
總結以及收藏的MySQL索引的注意事項和優化方法。
1. 何時使用聚集索引或非聚集索引?
動作描述?? ??? ?使用聚集索引?? ?使用非聚集索引
列經常被分組排序?? ?使用?? ??? ?使用
返回某范圍內的數據?? ?使用?? ??? ?不使用
一個或極少不同值?? ?不使用?? ??? ?不使用
小數目的不同值?? ??? ?使用?? ??? ?不使用
大數目的不同值?? ??? ?不使用?? ??? ?使用
頻繁更新的列?? ??? ?不使用?? ??? ?使用
外鍵列?? ??? ??? ?使用?? ??? ?使用
主鍵列?? ??? ??? ?使用?? ??? ?使用
頻繁修改索引列?? ??? ?不使用?? ??? ?使用
http://www.kancloud.cn/kancloud/theory-of-mysql-index/41857
精確匹配(精確匹配指“=”或“IN”匹配)、最左前綴、range查詢
再多說幾句聯合索引的最左優先原則:
聯合索引的第一個字段必須出現在條件語句中,這個索引才會被用到。如果有一個組合索引(col_a,col_b,col_c),下面的情況都會用到這個索引:
col_a = "some value";
col_a = "some value" and col_b = "some value";
col_a = "some value" and col_b = "some value" and col_c = "some value";
col_b = "some value" and col_a = "some value" and col_c = "some value";
對于最后一條語句,mysql會自動優化成第三條的樣子~~。下面的情況就不會用到索引:
col_b = "aaaaaa";
col_b = "aaaa" and col_c = "cccccc";
查詢條件中含有函數或表達式,MySQL無法為其使用索引,不使用NOT IN和<>操作
MySQL索引背后的數據結構及算法原理:http://blog.jobbole.com/24006/
選擇B+樹而不是其他數據結構的原因主要是因為數據是保存在硬盤上而不是內存中,所以減少磁盤IO次數才是提升效率的關鍵。
=====================================================================================
InnoDB 和 MyISAM 的區別
0.MyISAM類型不支持事務,外鍵等高級處理,而InnoDB類型支持。
MyISAM不是事務安全,如果事務回滾將造成不完全回滾,不具有原子性。MyISAM類型的表強調的是性能,其執行速度比InnoDB類型更快。
如果執行大量的SELECT,MyISAM是更好的選擇。如果考慮事務安全,如果你的數據執行大量的INSERT或UPDATE,出于性能方面的考慮,應該使用InnoDB表,
1.InnoDB不支持FULLTEXT類型的索引,MyISAM支持全文索引。Innodb在MYSQL5.6中已經支持FULLTEXT索引。
2.InnoDB中不保存表的 行數,也就是說,執行select count(*) from table時,
InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可。注意的是,當count(*)語句包含 where條件時,兩種表的操作是一樣的。
3.對于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯合索引。
4.MyISAM類型的二進制數據文件可以在不同操作系統中遷移。也就是可以直接從Windows系統拷貝到linux系統中使用。
5.MyISAM速度快,磁盤空間占用少;InnoDB速度慢,磁盤占用多.
性能技巧:
對于支持事務的InnoDB類型的表,影響速度的主要原因是AUTOCOMMIT默認設置是打開的,而且程序沒有顯式調用BEGIN
開始事務,導致每插入一條都自動Commit,嚴重影響了速度。可以在執行sql前調用begin,多條sql形成一個事務(即使autocommit打開也可以),將大大提高性能。
=====================================================================================
1、inner join內連接:將兩個表中存在連結關系的字段符合連接條件的記錄形成記錄集
Select A.name,B.name from A inner join B on A.id=B.id和
Select A.name,B.name from A,B where A.id=B.id結果是一樣的(內連接的inner關鍵字可省略);
cross join 產生的是笛卡爾集,也就是 M*N 的集合,inner join 是內聯查詢,不是產生笛卡爾集。
left join(左聯接) 結果說明:
??? 是以A表的記錄為基礎的,A可以看成左表,B可以看成右表,left join是以左表為準的.
換句話說,左表(A)的記錄將會全部表示出來,而右表(B)只會顯示符合搜索條件的記錄(例子中為: A.aID = B.bID).
B表記錄不足的地方均為NULL.
right join(右聯接) 結果說明:
??? 仔細觀察一下,就會發現,和left join的結果剛好相反,這次是以右表(B)為基礎的,A表不足的地方用NULL填充.
唯一索引(UNIQUE):與"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。
主鍵索引(PRIMARY):它 是一種特殊的唯一索引,不允許有空值。
全文搜索的索引(FULLTEXT)。FULLTEXT 用于搜索很長一篇文章的時候,效果最好。用在比較短的文本,如果就一兩行字的,普通的 INDEX 也可以。
mysql聯合索引(B+Tree中的“最左前綴原理”)簡單的理解就是只從最左邊開始組合。
簡單的理解就是只從最左面的開始組合。并不是只要包含這兩列的查詢都會用到該聯合索引。
總結以及收藏的MySQL索引的注意事項和優化方法。
1. 何時使用聚集索引或非聚集索引?
動作描述?? ??? ?使用聚集索引?? ?使用非聚集索引
列經常被分組排序?? ?使用?? ??? ?使用
返回某范圍內的數據?? ?使用?? ??? ?不使用
一個或極少不同值?? ?不使用?? ??? ?不使用
小數目的不同值?? ??? ?使用?? ??? ?不使用
大數目的不同值?? ??? ?不使用?? ??? ?使用
頻繁更新的列?? ??? ?不使用?? ??? ?使用
外鍵列?? ??? ??? ?使用?? ??? ?使用
主鍵列?? ??? ??? ?使用?? ??? ?使用
頻繁修改索引列?? ??? ?不使用?? ??? ?使用
http://www.kancloud.cn/kancloud/theory-of-mysql-index/41857
精確匹配(精確匹配指“=”或“IN”匹配)、最左前綴、range查詢
再多說幾句聯合索引的最左優先原則:
聯合索引的第一個字段必須出現在條件語句中,這個索引才會被用到。如果有一個組合索引(col_a,col_b,col_c),下面的情況都會用到這個索引:
col_a = "some value";
col_a = "some value" and col_b = "some value";
col_a = "some value" and col_b = "some value" and col_c = "some value";
col_b = "some value" and col_a = "some value" and col_c = "some value";
對于最后一條語句,mysql會自動優化成第三條的樣子~~。下面的情況就不會用到索引:
col_b = "aaaaaa";
col_b = "aaaa" and col_c = "cccccc";
查詢條件中含有函數或表達式,MySQL無法為其使用索引,不使用NOT IN和<>操作
MySQL索引背后的數據結構及算法原理:http://blog.jobbole.com/24006/
選擇B+樹而不是其他數據結構的原因主要是因為數據是保存在硬盤上而不是內存中,所以減少磁盤IO次數才是提升效率的關鍵。
=====================================================================================
InnoDB 和 MyISAM 的區別
0.MyISAM類型不支持事務,外鍵等高級處理,而InnoDB類型支持。
MyISAM不是事務安全,如果事務回滾將造成不完全回滾,不具有原子性。MyISAM類型的表強調的是性能,其執行速度比InnoDB類型更快。
如果執行大量的SELECT,MyISAM是更好的選擇。如果考慮事務安全,如果你的數據執行大量的INSERT或UPDATE,出于性能方面的考慮,應該使用InnoDB表,
1.InnoDB不支持FULLTEXT類型的索引,MyISAM支持全文索引。Innodb在MYSQL5.6中已經支持FULLTEXT索引。
2.InnoDB中不保存表的 行數,也就是說,執行select count(*) from table時,
InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可。注意的是,當count(*)語句包含 where條件時,兩種表的操作是一樣的。
3.對于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯合索引。
4.MyISAM類型的二進制數據文件可以在不同操作系統中遷移。也就是可以直接從Windows系統拷貝到linux系統中使用。
5.MyISAM速度快,磁盤空間占用少;InnoDB速度慢,磁盤占用多.
性能技巧:
對于支持事務的InnoDB類型的表,影響速度的主要原因是AUTOCOMMIT默認設置是打開的,而且程序沒有顯式調用BEGIN
開始事務,導致每插入一條都自動Commit,嚴重影響了速度。可以在執行sql前調用begin,多條sql形成一個事務(即使autocommit打開也可以),將大大提高性能。
=====================================================================================
1、inner join內連接:將兩個表中存在連結關系的字段符合連接條件的記錄形成記錄集
Select A.name,B.name from A inner join B on A.id=B.id和
Select A.name,B.name from A,B where A.id=B.id結果是一樣的(內連接的inner關鍵字可省略);
cross join 產生的是笛卡爾集,也就是 M*N 的集合,inner join 是內聯查詢,不是產生笛卡爾集。
left join(左聯接) 結果說明:
??? 是以A表的記錄為基礎的,A可以看成左表,B可以看成右表,left join是以左表為準的.
換句話說,左表(A)的記錄將會全部表示出來,而右表(B)只會顯示符合搜索條件的記錄(例子中為: A.aID = B.bID).
B表記錄不足的地方均為NULL.
right join(右聯接) 結果說明:
??? 仔細觀察一下,就會發現,和left join的結果剛好相反,這次是以右表(B)為基礎的,A表不足的地方用NULL填充.
總結
- 上一篇: 网络基础知识-面试
- 下一篇: 算法总结之编码(C++)