數(shù)據(jù)庫索引
mysql索引以B+樹作為存儲結構契邀,B+樹的主要特點是,非葉子節(jié)點不存儲數(shù)據(jù),數(shù)據(jù)只存儲在葉子節(jié)點上醒叁,并且所有葉子節(jié)點組成有序鏈表
主鍵索引(聚簇索引)
假設我們的表結構如下
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`name` varchar(20) DEFAULT NULL COMMENT '名稱',
`bank_no` varchar(20) DEFAULT NULL COMMENT '銀行卡號',
`hobby` varchar(20) DEFAULT NULL COMMENT '興趣愛好',
PRIMARY KEY (`id`),
UNIQUE KEY `user_bank_no` (`bank_no`,`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
數(shù)據(jù)庫主鍵索引對應的文檔存儲的表內(nèi)容可表示為:
DocumentId | name | bank_no | hobby |
---|---|---|---|
1 | 魯智深 | 6201 | 籃球、唱歌 |
200 | 吳用 | 5100 | 籃球泊业、旅游 |
3000 | 花榮 | 1234 | 臺球把沼、旅游 |
5000 | 柴進 | 2245 | 唱歌、游泳 |
5001 | 武松 | 5678 | 籃球吁伺、游泳 |
5200 | 楊志 | 1345 | 游泳饮睬、臺球 |
8000 | 宋江 | 9987 | 唱歌 |
10000 | 盧俊義 | 3347 | 足球、旅游 |
主鍵索引的存儲結構如下
非主鍵索引
非主鍵索引存儲結構
非主鍵索引的葉子節(jié)點只存儲索引字段及主鍵篮奄,如果需要索引字段之外的信息捆愁,則需要根據(jù)主鍵再回表查詢割去。
比如我們按照銀行卡號查詢用戶名、興趣愛好等字段昼丑,則會根據(jù)索引過濾后再回表查詢完整信息呻逆,被稱為是索引下推。
倒排索引
數(shù)據(jù)庫索引是一種正排索引菩帝,上面的例子中咖城,如果查詢興趣愛好為“游泳”的用戶信息,則會觸發(fā)全表掃描呼奢。這種情況下創(chuàng)建全文索引可很大程度的提高查詢效率宜雀,而全文索引(full inverted index )就一種倒排索引(inverted file index )的實現(xiàn)。
如果是倒排索引握础,則文檔存儲的表內(nèi)容可表示為:
Number | text | Documents |
---|---|---|
1 | 籃球 | 1州袒,200,5001 |
2 | 唱歌 | 1, 5000, 8000 |
3 | 旅游 | 200, 3000, 10000 |
4 | 臺球 | 3000, 5200 |
5 | 游泳 | 5000, 5200 |
6 | 足球 | 10000 |
全文索引不僅可以存儲文檔的ID弓候,還可以存儲單詞在text的位置信息(position)
Number | text | Documents[(DocumentId: position)] |
---|---|---|
1 | 籃球 | (1: 1)郎哭,(200: 1), (5001: 1) |
2 | 唱歌 | (1: 2), (5000: 1), (8000: 1) |
3 | 旅游 | (200: 2), (3000: 2), (10000: 2) |
4 | 臺球 | (3000: 1), (5200: 2) |
5 | 游泳 | (5000: 2), (5200: 1) |
6 | 足球 | (10000: 1) |
最后,倒排索引作為一種索引結構菇存,可以更好的定位數(shù)據(jù)夸研,并能擴充一些搜索特性,但是也會占用更多的磁盤空間依鸥。