1、索引的底層實現原理和優化
B+樹,經過優化的B+樹,主要是在所有的葉子結點中增加了指向下一個葉子節點的指針,因此InnoDB建議為大部分表使用默認自增的主鍵作為主索引。
3、什么情況下設置了索引但無法使用
- 以“%”開頭的LIKE語句,模糊匹配
- OR語句前后沒有同時使用索引
- 數據類型出現隱式轉化(如varchar不加單引號的話可能會自動轉換為int型)
4、簡單描述mysql中,索引,主鍵,唯一索引,聯合索引的區別,對數據庫的性能有什么影響(從讀寫兩方面)
索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含着對數據表里所有記錄的引用指針。
普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快對數據的訪問速度。
普通索引允許被索引的數據列包含重復的值。如果能確定某個數據列將只包含彼此各不相同的值,在為這個數據列創建索引的時候就應該用關鍵字UNIQUE把它定義為一個唯一索引。也就是說, 唯一索引可以保證數據記錄的唯一性。
主鍵,是一種特殊的唯一索引,在一張表中只能定義一個主鍵索引,主鍵用於唯一標識一條記錄,使用關鍵字PRIMARY KEY 來創建。
索引可以覆蓋多個數據列,如像INDEX(columnA, columnB)索引,這就是聯合索引。
索引可以極大的提高數據的查詢速度,但是會降低插入、刪除、更新表的速度,因為在執行這些寫操作時,還要操作索引文件。
5、 對於關系型數據庫而言,索引是相當重要的概念,請回答有關索引的幾個問題:
a)、索引的目的是什么?
快速訪問數據表中的特定信息,提高檢索速度
創建唯一性索引,保證數據庫表中每一行數據的唯一性。
加速表和表之間的連接
使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間
b)、索引對數據庫系統的負面影響是什么?
負面影響:
創建索引和維護索引需要耗費時間,這個時間隨着數據量的增加而增加;索引需要占用物理空間,不光是表需要占用數據空間,每個索引也需要占用物理空間;當對表進行增、刪、改、的時候索引也要動態維護,這樣就降低了數據的維護速度。
c)、為數據表建立索引的原則有哪些?
在最頻繁使用的、用以縮小查詢范圍的字段上建立索引。
在頻繁使用的、需要排序的字段上建立索引
d)、 什么情況下不宜建立索引?
對於查詢中很少涉及的列或者重復值比較多的列,不宜建立索引。
對於一些特殊的數據類型,不宜建立索引,比如文本字段(text)等
6、你怎么看到為表格定義的所有索引?
索引是通過以下方式為表格定義的:
SHOW INDEX FROM <tablename>;
7、實現索引的方式? 索引的原理? 索引的代價? 索引的類型?
實現索引的方式有兩種:針對一張表的某些字段創建具體的索引,如對oracle: create index 索引名稱 on 表名(字段名);在創建表時為字段建立主鍵約束或者唯一約束,系統將自動為其建立索引。
索引的原理:根據建立索引的字段建立索引表,存放字段值以及對應記錄的物理地址,從而在搜索的時候根據字段值搜索索引表的到物理地址直接訪問記錄。
引入索引雖然提高了查詢速度,但本身占用一定的系統存儲容量和系統處理時間,需要根據實際情況進行具體的分析.
索引的類型有:B樹索引,位圖索引,函數索引等。
8、聚簇索引和普通索引在不同的SQL語句中哪個效率更高?(聚簇索引和普通索引的區別)
概念類:
聚合函數? Session的定義和用法? Oracle的存儲過程 ? 什么是構造函數?
9、怎樣創建一個一個索引,索引使用的原則,有什么優點和缺點
創建標准索引: CREATE INDEX 索引名 ON 表名 (列名) TABLESPACE 表空間名;
創建唯一索引: CREATE unique INDEX 索引名 ON 表名 (列名) TABLESPACE 表空間名;
創建組合索引: CREATE INDEX 索引名 ON 表名 (列名1,列名2) TABLESPACE 表空間名;
創建反向鍵索引: CREATE INDEX 索引名 ON 表名 (列名) reverse TABLESPACE 表空間名;
索引使用原則:
索引字段建議建立NOT NULL約束
經常與其他表進行連接的表,在連接字段上應該建立索引;
經常出現在Where子句中的字段且過濾性很強的,特別是大表的字段,應該建立索引;
可選擇性高的關鍵字 ,應該建立索引;
可選擇性低的關鍵字,但數據的值分布差異很大時,選擇性數據比較少時仍然可以利用索引提高效率
復合索引的建立需要進行仔細分析;盡量考慮用單字段索引代替:
A、正確選擇復合索引中的第一個字段,一般是選擇性較好的且在where子句中常用的字段上;
B、復合索引的幾個字段經常同時以AND方式出現在Where子句中可以建立復合索引;否則單字段索引;
C、如果復合索引中包含的字段經常單獨出現在Where子句中,則分解為多個單字段索引;
D、如果復合索引所包含的字段超過3個,那么仔細考慮其必要性,考慮減少復合的字段;
E、如果既有單字段索引,又有這幾個字段上的復合索引,一般可以刪除復合索引;
頻繁DML的表,不要建立太多的索引;
不要將那些頻繁修改的列作為索引列;
索引的優缺點:
有點:
1. 創建唯一性索引,保證數據庫表中每一行數據的唯一性
2. 大大加快數據的檢索速度,這也是創建索引的最主要的原因
3. 加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
4. 在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。
缺點:
1. 索引創建在表上,不能創建在視圖上
2. 創建索引和維護索引要耗費時間,這種時間隨着數據量的增加而增加
3. 索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會更大
4. 當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度
10、索引的實現方式
都是 B+樹索引, Innodb 是索引組織表, myisam 是堆表, 索引組織表和堆表的區別要熟悉
11、Oracle索引分為哪幾類,說出唯一索引和位圖索引的概念。
Oracle索引有B樹索引,位圖索引,函數索引,簇索引等。
唯一索引也是B樹索引的一種,它要求被索引的字段值不可以重復。在創建的時候使用B樹算法創建。
位圖索引並不是采用象唯一索引那樣存儲(索引字段值,記錄ROWID)來創建索引段的,而是為每一個唯一的字段值創建一個位圖,位圖中使用位元來對應一個記錄的ROWID。位元到ROWID是通過映射的到的。
12、如何寫 sql 能夠有效的使用到復合索引。
由於復合索引的組合索引,類似多個木板拼接在一起,如果中間斷了就無法用了,所以要能用到復合索引,首先開頭(第一列)要用上,比如index(a,b) 這種,我們可以select table tname where a=XX 用到第一列索引 如果想用第二列 可以 and b=XX 或者and b like‘TTT%’
13、當數據表中A、B字段做了組合索引,那么單獨使用A或單獨使用B會有索引效果嗎?(使用like查詢如何有索引效果)
看A、B兩字段做組合索引的時候,誰在前面,誰在后面,如果A在前,那么單獨使用A會有索引效果,單獨使用B則沒有,反之亦然。同理,使用like模糊查詢時,如果只是使用前面%,那么有索引效果,如果使用雙%號匹配,那么則無索引效果
14、數據庫索引的實現(B+樹介紹、和B樹、R樹區別)
http://blog.csdn.net/kennyrose/article/details/7532032
http://www.xuebuyuan.com/2216918.html
15、索引的使用注意事項
https://www.cnblogs.com/zlingh/p/3883716.html
16、MYsql 的索引原理,索引的類型有哪些,如何創建合理的索引,索引如何優化。
索引是通過復雜的算法,提高數據查詢性能的手段。從磁盤io到內存io的轉變
普通索引,主鍵,唯一,單列/多列索引建索引的幾大原則
1.最左前綴匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。
2.=和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式
3.盡量選擇區分度高的列作為索引,區分度的公式是count(distinct col)/count(*),表示字段不重復的比例,比例越大我們掃描的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別字段可能在大數據面前區分度就是0,那可能有人會問,這個比例有什么經驗值嗎?使用場景不同,這個值也很難確定,一般需要join的字段我們都要求是0.1以上,即平均1條掃描10條記錄
4.索引列不能參與計算,保持列“干凈”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很簡單,b+樹中存的都是數據表中的字段值,但進行檢索時,需要把所有元素都應用函數才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp(’2014-05-29’);
5.盡量的擴展索引,不要新建索引。比如表中已經有a的索引,現在要加(a,b)的索引,那么只需要修改原來的索引即可
http://tech.meituan.com/mysql-index.html
http://www.cnblogs.com/cq-home/p/3482101.html
17、聚集索引和非聚集索引的區別。
“聚簇”就是索引和記錄緊密在一起。
非聚簇索引 索引文件和數據文件分開存放,索引文件的葉子頁只保存了主鍵值,要定位記錄還要去查找相應的數據塊。
18、數據庫中 BTREE 和 B+tree 區別。
B+是btree的變種,本質都是btree,btree+與B-Tree相比,B+Tree有以下不同點:
每個節點的指針上限為2d而不是2d+1。
內節點不存儲data,只存儲key;葉子節點不存儲指針。
Btree 怎么分裂的,什么時候分裂,為什么是平衡的。
Key 超過1024才分裂B樹為甚會分裂? 因為隨着數據的增多,一個結點的key滿了,為了保持B樹的特性,就會產生分裂,就向紅黑樹和AVL樹為了保持樹的性質需要進行旋轉一樣!
(轉自:https://blog.csdn.net/qq_34988624/article/details/85838850)
