MongoD基础之六 索引

一 . 索引概述和基本操作

1. 索引提高查询速度,降低写入速度,权衡常用的查询字段,不必在太多列上建索引
2. 在mongodb中,索引可以按字段升序/降序来创建,便于排序
3. 默认是用btree来组织索引文件,2.4版本以后,也允许建立hash索引.

常用命令:
查看当前索引状态: db.collection.getIndexes();

创建普通的单列索引:db.collection.ensureIndex({field:1/-1}); 1是升续 2是降续

删除单个索引
db.collection.dropIndex({filed:1/-1});

一下删除所有索引
db.collection.dropIndexes();

创建多列索引 db.collection.ensureIndex({field1:1/-1, field2:1/-1});

例子:

 1 > for (var i = 1;i<=1000;i++){
 2 ... db.stu.insert({sn:i,name:‘student‘+i})
 3 ... };
 4 >
 5 >
 6 > db.stu.find().count();
 7 1000
 8 > db.stu.find({sn:99});
 9 { "_id" : ObjectId("574271a9addef29711337c28"), "sn" : 99, "name" : "student99" }
10 > db.stu.find({sn:99}).explain();
11 {
12 "cursor" : "BasicCursor", -- 无索引相当于mysql的全表扫描
13 "isMultiKey" : false,
14 "n" : 1,
15 "nscannedObjects" : 1000, -- 扫描了1000行
16 ....
17
18 > db.stu.ensureIndex({sn:1}); --创建索引
19 > db.stu.find({sn:99}).explain();
20 {
21 "cursor" : "BtreeCursor sn_1", --使用了索引
22 "isMultiKey" : false,
23 "n" : 1,
24 "nscannedObjects" : 1, --只用扫描一行
25 ...
26 }
27
28
29 > db.stu.getIndexes(); --查询索引
30 [
31 {
32 "v" : 1,
33 "key" : {
34 "_id" : 1 -- 默认创建 正序
35 },
36 "ns" : "test.stu",
37 "name" : "_id_"
38 },
39 {
40 "v" : 1,
41 "key" : {
42 "sn" : 1
43 },
44 "ns" : "test.stu",
45 "name" : "sn_1"
46 }
47 ]
48
49
50 > db.stu.ensureIndex({sn:1,name:1});
51 >
52 >
53 > db.stu.getIndexes();
54 [
55 {
56 "v" : 1,
57 "key" : {
58 "_id" : 1
59 },
60 "ns" : "test.stu",
61 "name" : "_id_"
62 },
63 {
64 "v" : 1,
65 "key" : {
66 "sn" : 1
67 },
68 "ns" : "test.stu",
69 "name" : "sn_1"
70 },
71 {
72 "v" : 1,
73 "key" : {
74 "sn" : 1,
75 "name" : 1
76 },
77 "ns" : "test.stu",
78 "name" : "sn_1_name_1"
79 }
80 ]

二. 子文档索引

     指向下级嵌套的文档的索引

 1 > db.shop.insert({name:‘Nokia‘,spc:{weight:120,area:‘taiwan‘}});
 2 > db.shop.insert({name:‘Nokia‘,spc:{weight:100,area:‘korea‘}});
 3
 4 > db.shop.find({‘spc.area‘:‘taiwan‘});
 5 { "_id" : ObjectId("5743d662addef29711337fb0"), "name" : "Nokia", "spc" : { "weight" : 120, "area" : "taiwan" } }
 6
 7
 8 > db.shop.ensureIndex({‘spc.area,1‘});
 9 Tue May 24 12:29:58.823 SyntaxError: Unexpected token }
10 > db.shop.ensureIndex({‘spc.area‘:1});
11 >
12 > db.shop.getIndexes();
13 [
14 {
15 "v" : 1,
16 "key" : {
17 "_id" : 1
18 },
19 "ns" : "test.shop",
20 "name" : "_id_"
21 },
22 {
23 "v" : 1,
24 "key" : {
25 "spc.area" : 1
26 },
27 "ns" : "test.shop",
28 "name" : "spc.area_1"
29 }
30 ]
31 >

三.  唯一索引

 1 > show tables;
 2 shop
 3 stu
 4 system.indexes
 5 >
 6 >
 7 > db.tea.insert({email:‘[email protected]‘})
 8 > db.tea.insert({email:‘[email protected]‘})
 9 >
10 > db.tea.getIndexes();
11 [
12 {
13 "v" : 1,
14 "key" : {
15 "_id" : 1
16 },
17 "ns" : "test.tea",
18 "name" : "_id_"
19 }
20 ]
21 >
22 >
23 >
24 > db.tea.ensureIndex({email:1},{unique:true});
25 >
26 >
27 > db.tea.insert({email:‘[email protected]‘})
28 > db.tea.insert({email:‘[email protected]‘})
29 E11000 duplicate key error index: test.tea.$email_1 dup key: { : "[email protected]" }
30 >

四. 稀疏索引

稀疏索引的特点------如果针对field做索引,针对不含field列的文档,将不建立索引.
与之相对,普通索引,会把该文档的field列的值认为NULL,并建索引.
适宜于: 小部分文档含有某列时.

db.collection.ensureIndex({field:1/-1},{sparse:true})

 1 -- 模拟数据
 2 > db.tea.insert({});
 3 > db.tea.find();
 4 { "_id" : ObjectId("5743d98aaddef29711337fb4"), "email" : "[email protected]" }
 5 { "_id" : ObjectId("5743d98daddef29711337fb5"), "email" : "[email protected]" }
 6 { "_id" : ObjectId("5743d9cfaddef29711337fb7"), "email" : "[email protected]" }
 7 { "_id" : ObjectId("5743dc98addef29711337fbc") }
 8
 9
10
11 --稀疏索引下查不到数据
12 > db.tea.ensureIndex({email:1},{sparse:true});
13 > db.tea.find({email:null});
14 >
15
16 > db.tea.dropIndexes();
17 {
18 "nIndexesWas" : 2,
19 "msg" : "non-_id indexes dropped for collection",
20 "ok" : 1
21 }
22
23 --普通索引能查到
24 > db.tea.ensureIndex({email:1});
25 > db.tea.find({email:null});
26 { "_id" : ObjectId("5743dc98addef29711337fbc") }

总结:
如果分别加普通索引,和稀疏索引,
对于最后一行的email分别当成null 和 忽略最后一行来处理.
根据{email:null}来查询,前者能查到,而稀疏索引查不到最后一行.

五. 创建哈希索引(2.4新增的)

哈希索引速度比普通索引快,但是,无能对范围查询进行优化.
适宜于---随机性强的散列

db.collection.ensureIndex({file:‘hashed‘});

 1 > db.tea.ensureIndex({email:‘hashed‘});
 2 > db.tea.find({email:‘[email protected]‘}).explain();
 3 {
 4 "cursor" : "BtreeCursor email_hashed",
 5 "isMultiKey" : false,
 6 "n" : 1,
 7 "nscannedObjects" : 1,
 8 "nscanned" : 1,
 9 "nscannedObjectsAllPlans" : 1,
10 "nscannedAllPlans" : 1,
11 "scanAndOrder" : false,
12 "indexOnly" : false,
13 "nYields" : 0,
14 "nChunkSkips" : 0,
15 "millis" : 0,
16 "indexBounds" : {
17 "email" : [
18 [
19 NumberLong("2069420833715827975"),
20 NumberLong("2069420833715827975")
21 ]
22 ]
23 },
24 "server" : "localhost.localdomain:27017"
25 }
26 >

六. 重建索引

一个表经过很多次修改后,导致表的文件产生空洞,索引文件也如此.
可以通过索引的重建,减少索引文件碎片,并提高索引的效率.
类似mysql中的optimize table

db.collection.reIndex()

 1 > db.tea.reIndex();
 2 {
 3 "nIndexesWas" : 2,
 4 "msg" : "indexes dropped for collection",
 5 "nIndexes" : 2,
 6 "indexes" : [
 7 {
 8 "key" : {
 9 "_id" : 1
10 },
11 "ns" : "test.tea",
12 "name" : "_id_"
13 },
14 {
15 "key" : {
16 "email" : "hashed"
17 },
18 "ns" : "test.tea",
19 "name" : "email_hashed"
20 }
21 ],
22 "ok" : 1
23 }
时间: 2024-07-28 17:29:23

MongoD基础之六 索引的相关文章

统计学基础知识索引

面向小白的统计学:描述性统计(均值,中位数,众数,方差,标准差,与常见的统计图表)集中趋势:均值,中位数,众数离散程度:极差,方差,标准差常见统计图表:直方图,概率质量函数,箱线图,茎叶图 统计学基础知识索引

Oracle SQL基础(3)-索引/触发器/视图操作

本文只列出索引,触发器,视图的简单操作语句 1.索引 a.创建 create index idx_name on fdh_client_info(name); --普通索引(单列索引) create unique index uni_idx_id on fdh_client(id); --唯一索引 create index union_idx_name_addr on fdh_client(name, address); --联合索引 b.查询索引 select * from user_inde

SQL 基础之索引、闪回、临时表(十八)

创建索引: 自动 – 创建 PRIMARY KEY – 创建 UNIQUE KEY 手动 – CREATE INDEX 语句 – CREATE TABLE 语句 create table  语句中 create index create table new_emp (employee_id number(6) primary key using index (create index emp_id_idx on new_emp(employee_id)), first_name varchar2

C# 基础之索引器

当一个类有数组成员时,索引器将大大简化对类中数组成员的访问 索引器类似于属性有get与set访问器 列如: 使用: 总结:从以上代码可以看出索引器也是对私有字段进行访问的方式,但此时的私有字段是数组类型,而属性一般只对简单数据类型的私有字段进行访问

利用Python进行数据分析(11) pandas基础: 层次化索引

层次化索引 层次化索引指你能在一个数组上拥有多个索引,例如: 有点像Excel里的合并单元格对么? 根据索引选择数据子集 以外层索引的方式选择数据子集: 以内层索引的方式选择数据: 多重索引Series转换为DataFrame 层次化索引在数据重塑和分组中扮演着很重要的角色,例如,上面的层次化索引数据可以转换为一个DataFrame: 对于一个DataFrame,横轴和竖轴都可以有层次化索引,例如: 重排分级顺序 根据索引交换 swaplevel()函数可以将两个级别的数据进行交换,例如: 根据

Oracle 基础篇 --- 索引

第四. 索引 4.1 定义 索引是与表关联的可选结构.通过创建索引可提高数据更新和检索的性能.Oracle 索引提供到数据行的直接访问路径. 可以对表的一个或多个列创建索引.创建索引后,Oracle 服务器会自动维护和使用索引.表数据的更新(如添加新行.更新行或删除行)会自动传播到所有相关的索引,这些对用户来说是完全透明的. 索引还可以提高实施主键和唯一键约束条件时的性能.如果没有索引,则每次对表执行DML 操作时都会扫描整个表(全表扫描). 4.2 类型 有多种类型的索引结构,可以根据需要使用

SQL优化基础 使用索引(一个小例子)

按照本文操作和体会,会对sql优化有个基本最简单的了解,其他深入还需要更多资料和实践的学习: 1. 建表: 复制代码 代码如下: create table site_user ( id int IDENTITY(1,1) PRIMARY KEY, [name] varchar(20), code varchar(20), date datetime ) 2. 插入8万条数据 复制代码 代码如下: declare @m int set @m=1 while @m<80000 begin INSER

Linux基础目录索引

一.Linux初识 Linux初识之一:开关机 Linux初识之二:切面切换.快捷键 Linux初识之三:系统启动过程 Linux初识之四:在线帮助 Linux初识之五:忘记root密码怎么办 Linux初识之六:远程登录 二.文件权限与目录配置 Linux文件权限与目录配置之一:用户和用户组 Linux文件权限与目录配置之二:Linux文件基本属性 Linux文件权限与目录配置之三:更改文件权限 Linux文件权限与目录配置之四:目录与文件的权限意义 Linux文件权限与目录配置之五:Linu

pandas基础--层次化索引

以下代码的前提:import pandas as pd 层次化索引使你能在一个轴上拥有多个(两个以上)索引级别.抽象的说,它使你能以低维度形式处理高维度数据. 1 >>> data = pd.Series(np.random.randn(10), index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd', 'd'], [1, 2, 3, 1, 2, 3, 1, 2, 2, 3]]) 2 >>> data 3 a 1 3.23