索引 订阅
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。 展开全文
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。
信息
作    用
应于表的SQL语句执行得更快
分    类
数据库概念
中文名
索引
外文名
index
索引发展历史
旧称通检、备检或引得。组成的基本单位是索引款目。款目一般包括索引词、说明或注释语 、出处3项内容 。所有索引款目实现有序化编排。其本质特征是只揭示内容出处或文献线索 ,并不直接提供事实、资料本身。主要功能是为人们准确、迅速地获得文献资料提供线索性指引。常见的索引主要有报刊论文资料索引、文集篇目索引、语词索引、文句索引、关键词索引、专名索引、主题索引等。索引最早出现于西方,主要是中世纪欧洲宗教著作的索引。18世纪以后西方开始有主题索引,至19世纪末,内容分析索引被广泛使用。中国的索引出现较晚。一般认为,明末傅山所编的《两汉书姓名韵》是现存最早的人名索引。清代乾嘉时期,章学诚曾力倡编纂群书综合索引。20世纪20年代,随着西方索引理论与编制技术的传入,中国现代意义上的索引编制与研究才蓬勃展开 。1930年钱亚新发表《索引和索引法》,1932年洪业发表《引得说》,标志着具有中国特色的现代索引理论、技术已迅速发展起来。20世纪50年代,计算机技术被运用于索引编制 。此后,机编索引的大量出现,使索引编制理论、技术、索引载体形式发生了深刻变革。SQL标准中没有涉及索引,但商用关系数据库管理系统一般都支持索引机制,只是不同的关系数据库管理系统支持的索引类型不尽相同。索引已经成为关系数据库非常重要的部分。它们被用作包含所关心数据的表指针。通过一个索引,能从表中直接找到一个特定的记录,而不必连续顺序扫描这个表,一次一个地去查找。对于大的表,索引是必要的。没有索引,要想得到一个结果要等好几个小时、好几天,而不是几秒钟。 [1] 
收起全文
精华内容
下载资源
问答
  • 索引

    万次阅读 2020-02-19 23:37:23
    MySQL索引笔记

    定义


    索引是一种数据结构,通过使用索引,可以加快检索、排序。
    底层通常是BTree,通过BTree可以将无序的数据相对有序。
    索引的缺点是:

    1. 如果表中数据增删改,那么索引也要修改。
    2. 索引占用物理空间。
    3. 创建索引和维护索引耗费时间。

    索引分类


    1. 单值索引

      一个索引只包含单个列,一个表可以有多个单列索引

    2. 唯一索引

      索引列的值必须唯一,允许为空值

    3. 复合索引

      一个索引包含多个列

    基本语法


    1. 创建

      create [unique] index index_name on table(column_name(length));
      alter table_name add [unique] index [index_name] on (column_name(length))

    2. 删除

      drop index [index_name] on table_name;

    3. 查看

      show index from table_name;

    索引结构


    1. BTree索引
      原理:

    2. Hash索引

    3. full-text索引

    4. R-Tree索引

    建立索引注意事项


    1. 主键自动建立唯一索引
    2. 频繁作为查询的字段应该创建索引
    3. 外键建立索引
    4. 频繁更新的字段不要建立索引
    5. where条件里用不到的字段不创建索引
    6. 优先组合索引
    7. 表记录少不要建立索引
    8. 经常增删改的表不要建立索引
    9. 数据重复且平均的字段不要建立索引(比如说性别字段)

    Explain关键字


    Explain关键字用于查询MySQL如何执行SQL语句的,进而依此优化表结构或查询语句。

    作用

    • 表的读取顺序
    • 数据读取操作的操作类型.
    • 哪些索引可以使用
    • 哪些索引被实际使用
    • 表之间的引用
    • 每张表有多少行被优化器查询

    Explain查询结果

    在这里插入图片描述

    表的读取顺序

    1. id相同,从上到下依次执行
    2. id不同,由大到小依次执行

      数字大的优先执行,数字相同的顺序执行
      derived 衍生

    select_type

    在这里插入图片描述

    1. Simple简单查询
    2. Primary最外层查询标记为Primary
    3. SubQUERY子查询
    4. Derived
    5. Union联合查询
    6. Union Result

    Type

    访问类型:
    最好到最差:

    system > const > eq_ref > ref > range > index > ALL
    至少达到range级别

    1. system表只有一条记录(等于系统表)
    2. const比较唯一索引(如where id = 1)
    3. eq_ref唯一性索引扫描(如where t1.id = t2.id)
    4. ref非唯一性索引扫描
    5. range 索引范围查询(如查询索引大于10小于20)
    6. index遍历全部索引
    7. ALL全表查询

    possibble_kesy和key

    possible_keys显示可能应用在这张表的索引
    key实际使用的索引
    如果key为null,说明索引失效或不存在。

    key_len

    表示索引字段中使用的字节数,长度越短越好

    ref

    显示索引的那一列被使用了。如果可能,最好是const。

    rows

    根据表统计信息和索引选用情况,大致估算出找到所需的记录需要读取的行数。
    使用索引和不使用查询的对比

    extra

    额外的重要信息。

    1. Using Filesort :文件排序(不要出现)

    2. Using temporary:使用了临时表(order by和group by,不要出现这个)

      优化这两个,group by一定要按照索引的顺序和个数来。如idx_col1_col2,使用group by col1,col2,而不是group by col2,否则会使用临时表或文件排序(对索引外部排序)

    3. Using index: 使用了索引

      覆盖索引:查询的列就是所建的索引

    索引优化


    1. 左连接右表建立索引,右连接左表建立索引
    2. join语句,小结果集驱动大结果集。
    3. 优先优化内层循环
    4. 保证join字段已经被索引

    索引失效

    1. 全值匹配我最爱
    2. 最佳左前缀法则:查询从索引的最左前列并且不跳过索引中的列
    3. 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫
    4. 存储引擎不能使用索引中范围条件右边的列
    5. 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select*
    6. mysq|在使用不等于**(!=或者<>)**的时候无法使用索引会导致全表扫描
    7. is null ,is not null也无法使用索引
    8. like以通配符开头(’%abc… ')mysq|索引失效会变成全表扫描的操作(使用覆盖索引可以避免通配符匹配开头索引失效的问题)
    9. 字符串不加单引号索引失效
    10. 少用or,用它来连接时会索引失效

    口诀

    查询优化

    在这里插入图片描述

    1. 慢查询

      通过开启慢查询,可以把执行速度慢的SQL筛选出来

    2. 小表驱动大表

    3. order by 的顺序和复合索引顺序一致就不会产生filesort

      如index_AB 索引,使用order by A,B不会产生filesort ,使用order by B或者order by B,A就会filesort
      order by 不要和select * 一起使用
      尝试提高sort_buffer_size和max_length_for_sort_data参数

      在这里插入图片描述

    慢查询

    慢查询用于筛选响应时间超过阈值的语句。阈值默认是10秒,可以配合explain语句进行分析。

    select variables like ‘%slow_query_log%’;
    查询是否开启慢查询

    set global slow_query_log =1;
    开启慢查询

    如果要永久开启慢查询,则需要更改my.cnf文件

    set global long_query_time = 3;
    阈值设置为3秒

    日志分析工具mysqldumpslow
    在这里插入图片描述

    在这里插入图片描述

    Show Profile

    mysql 提供用来分析当前会话中语句执行的资源消耗情况,用于SQL调优。

    查询是否开启 show variables like ‘profiling’;
    开启set profiling = on;
    查看结果 show profiles;

    诊断SQL:show profiles cpu,block io for query ;
    在这里插入图片描述
    如果结果表status中出现以下:在这里插入图片描述
    则说明出现问题。

    展开全文
  • 多个单列索引和联合索引的区别详解

    万次阅读 多人点赞 2018-06-24 17:40:58
    那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下。 一、联合索引测试 注:Mysql版本为 5.7.20 创建测试表(表记录...

    背景:
    为了提高数据库效率,建索引是家常便饭;那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下。


    一、联合索引测试

    注:Mysql版本为 5.7.20

    创建测试表(表记录数为63188):

    CREATE TABLE `t_mobilesms_11` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `userId` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '用户id,创建任务时的userid',
      `mobile` varchar(24) NOT NULL DEFAULT '' COMMENT '手机号码',
      `billMonth` varchar(32) DEFAULT NULL COMMENT '账单月',
      `time` varchar(32) DEFAULT NULL COMMENT '收/发短信时间',
      `peerNumber` varchar(64) NOT NULL COMMENT '对方号码',
      `location` varchar(64) DEFAULT NULL COMMENT '通信地(自己的)',
      `sendType` varchar(16) DEFAULT NULL COMMENT 'SEND-发送; RECEIVE-收取',
      `msgType` varchar(8) DEFAULT NULL COMMENT 'SMS-短信; MSS-彩信',
      `serviceName` varchar(256) DEFAULT NULL COMMENT '业务名称. e.g. 点对点(网内)',
      `fee` int(11) DEFAULT NULL COMMENT '通信费(单位分)',
      `createTime` datetime DEFAULT NULL COMMENT '创建时间',
      `lastModifyTime` datetime DEFAULT NULL COMMENT '最后修改时间',
      PRIMARY KEY (`id`),
      KEY `联合索引` (`userId`,`mobile`,`billMonth`)
    ) ENGINE=InnoDB AUTO_INCREMENT=71185 DEFAULT CHARSET=utf8 COMMENT='手机短信详情'
    

    我们为userId, mobile, billMonth三个字段添加上联合索引!

    我们选择 explain 查看执行计划来观察索引利用情况:


    1.查询条件为 userid

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE userid='2222'
    

    这里写图片描述

    可以通过key看到,联合索引有效


    2.查询条件为 mobile

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE mobile='13281899972'
    

    这里写图片描述
    可以看到联合索引无效


    3.查询条件为 billMonth

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE billMonth='2018-04'
    

    这里写图片描述
    联合索引无效


    4.查询条件为 userid and mobile

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE userid='2222' AND mobile='13281899972'
    

    这里写图片描述
    联合索引有效


    5.查询条件为 mobile and userid

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE  mobile='13281899972' AND userid='2222' 
    

    这里写图片描述
    在4的基础上调换了查询条件的顺序,发现联合索引依旧有效


    6.查询条件为 userid or mobile

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE userid='2222' OR mobile='13281899972'
    

    这里写图片描述
    and 换成 or,发现联合所索引无效


    7.查询条件为 userid and billMonth

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE userid='2222' AND billMonth='2018-04'
    

    这里写图片描述
    这两个条件分别位于联合索引位置的第一和第三,测试联合索引依旧有效


    8.查询条件为 mobile and billMonth

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE mobile='13281899972' AND billMonth='2018-04'
    

    这里写图片描述
    这两个条件分别位于联合索引位置的第二和第三,发现联合索引无效


    9.查询条件为 userid and mobile and billMonth

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE  userid='2222' AND mobile='13281899972' AND billMonth='2018-04'
    

    这里写图片描述
    所有条件一起查询,联合索引有效!(当然,这才是最正统的用法啊!)


    二、单列索引测试

    创建三个单列索引:
    这里写图片描述

    1.查询条件为 userid and mobile and billMonth

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE  userid='2222' AND mobile='13281899972' AND billMonth='2018-04'
    

    这里写图片描述
    我们发现三个单列索引只有 userid 有效(位置为查询条件第一个),其他两个都没有用上。

    那么为什么没有用上呢?按照我们的理解,三个字段都加索引了,无论怎么排列组合查询,应该都能利用到这三个索引才对!

    其实这里其实涉及到了mysql优化器的优化策略!当多条件联合查询时,优化器会评估用哪个条件的索引效率最高!它会选择最佳的索引去使用,也就是说,此处userid 、mobile 、billMonth这三个索引列都能用,只不过优化器判断使用userid这一个索引能最高效完成本次查询,故最终explain展示的key为userid。


    2.查询条件为 mobile and billMonth

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE mobile='13281899972' AND billMonth='2018-04'
    

    这里写图片描述
    我们发现此处两个查询条件只有 mobile 生效(位置也为查询条件第一个)


    3.查询条件为 userid or mobile

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE  userid='2222' OR mobile='13281899972' 
    

    这里写图片描述
    这次把 and 换成 or,发现两个查询条件都用上索引了!

    我们在网上可能常常看到有人说or会导致索引失效,其实这并不准确。而且我们首先需要判断用的是哪个数据库哪个版本,什么引擎?

    比如我用的是mysql5.7版本,innodb引擎,在这个环境下我们再去讨论索引的具体问题。

    关于or查询的真相是:
    所谓的索引失效指的是:假如or连接的俩个查询条件字段中有一个没有索引的话,引擎会放弃索引而产生全表扫描。我们从or的基本含义出发应该能理解并认可这种说法,没啥问题。

    此刻需要注意type类型为index_merge
    我查资料说mysql 5.0 版本之前 使用or只会用到一个索引(即使如上我给userid和mobile都建立的单列索引),但自从5.0版本开始引入了index_merge索引合并优化!也就是说,我们现在可以利用上多个索引去优化or查询了。

    index_merge作用:
    1、索引合并是把几个索引的范围扫描合并成一个索引。
    2、索引合并的时候,会对索引进行并集,交集或者先交集再并集操作,以便合并成一个索引。
    3、这些需要合并的索引只能是一个表的。不能对多表进行索引合并。

    index_merge应用场景:

    1.对OR语句求并集,如查询SELECT * FROM TB1 WHERE c1="xxx" OR c2=""xxx"时,如果c1和c2列上分别有索引,可以按照c1和c2条件进行查询,再将查询结果合并(union)操作,得到最终结果

    2.对AND语句求交集,如查询SELECT * FROM TB1 WHERE c1="xxx" AND c2=""xxx"时,如果c1和c2列上分别有索引,可以按照c1和c2条件进行查询,再将查询结果取交集(intersect)操作,得到最终结果

    3.对AND和OR组合语句求结果


    三、结论

    通俗理解:
    利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处

    所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用仅对后面的任意列执行搜索时,复合索引则没有用处。


    重点:

    多个单列索引多条件查询时优化器会选择最优索引策略可能只用一个索引,也可能将多个索引全用上! 但多个单列索引底层会建立多个B+索引树,比较占用空间,也会浪费一定搜索效率,故如果只有多条件联合查询时最好建联合索引!


    最左前缀原则:

    顾名思义是最左优先,以最左边的为起点任何连续的索引都能匹配上,
    注:如果第一个字段是范围查询需要单独建一个索引
    注:在创建联合索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。这样的话扩展性较好,比如 userid 经常需要作为查询条件,而 mobile 不常常用,则需要把 userid 放在联合索引的第一位置,即最左边


    同时存在联合索引和单列索引(字段有重复的),这个时候查询mysql会怎么用索引呢?

    这个涉及到mysql本身的查询优化器策略了,当一个表有多条索引可走时, Mysql 根据查询语句的成本来选择走哪条索引;


    有人说where查询是按照从左到右的顺序,所以筛选力度大的条件尽量放前面。网上百度过,很多都是这种说法,但是据我研究,mysql执行优化器会对其进行优化当不考虑索引时,where条件顺序对效率没有影响真正有影响的是是否用到了索引


    联合索引本质:

    当创建**(a,b,c)联合索引时,相当于创建了(a)单列索引**,(a,b)联合索引以及**(a,b,c)联合索引**
    想要索引生效的话,只能使用 a和a,b和a,b,c三种组合;当然,我们上面测试过,a,c组合也可以,但实际上只用到了a的索引,c并没有用到!
    注:这个可以结合上边的 通俗理解 来思考!


    其他知识点:

    1、需要加索引的字段,要在where条件中
    2、数据量少的字段不需要加索引;因为建索引有一定开销,如果数据量小则没必要建索引(速度反而慢)
    3、避免在where子句中使用or来连接条件,因为如果俩个字段中有一个没有索引的话,引擎会放弃索引而产生全表扫描
    4、联合索引比对每个列分别建索引更有优势,因为索引建立得越多就越占磁盘空间,在更新数据的时候速度会更慢。另外建立多列索引时,顺序也是需要注意的,应该将严格的索引放在前面,这样筛选的力度会更大,效率更高


    最后的说明:

    网上关于索引优化等文章太多了,针对各个数据库各个版本各种引擎都可能存在不一样的说法

    我们的SQL引擎自带的优化也越来越强大,说不定你的某个SQL优化认知,其SQL引擎在某次升级中早就自优化了。

    所以要么跟进官方文档,要么关注数据库大牛的最新文章,要么在现有数据库环境下自己去亲手测试!

    数据库领域的水很深。。大家加油。。共勉 ~

    展开全文
  • Mysql | 查看表的索引

    万次阅读 多人点赞 2018-02-07 19:58:40
    查看表的索引: show index from table_name(表名)

    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

    打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

    拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。

    索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。

    创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

    实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

    上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

    建立索引会占用磁盘空间的索引文件。

    总结,索引优缺点:

    I、优点
    1.大大加快数据的检索速度;
    2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
    3.加速表和表之间的连接;
    4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

    II、缺点
    1.索引需要占物理空间。
    2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

    查看表的索引:

    show index from table_name(表名)
    

    结果列表中各字段的含义:

    · Non_unique

    如果索引不能包括重复词,则为0。如果可以,则为1。

    · Key_name

    索引的名称。

    · Seq_in_index

    索引中的列序列号,从1开始。

    · Column_name

    列名称。

    · Collation

    列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。

    · Cardinality

    索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机 会就越大。

    · Sub_part

    如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。

    · Packed

    指示关键字如何被压缩。如果没有被压缩,则为NULL。

    · Null

    如果列含有NULL,则含有YES。如果没有,则该列含有NO。

    · Index_type

    用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)

    展开全文
  • MongoDb之TTL索引

    万次阅读 2020-09-06 11:49:34
    TTL全称是(Time To Live),TTL索引能对一个单列配置过期属性来实现对文档的自动过期删除,我们可以在对字段创建索引时添加expireAfterSeconds选项将索引转换为TTL索引,该字段需要是date类型,在以下几种场景下即使...

    一、TTL索引介绍

    TTL全称是(Time To Live),TTL索引能对一个单列配置过期属性来实现对文档的自动过期删除,我们可以在对字段创建索引时添加expireAfterSeconds选项将索引转换为TTL索引,该字段需要是date类型,在以下几种场景下即使索引设置了expireAfterSeconds属性也不会生效
    - 如果该字段不是date类型,则文档不会过期
    - 如果文档没包含索引的这个字段,则文档不会过期
    

    二、TTL索引运行逻辑

    • MongoDB会开启一个后台线程读取该TTL索引的值来判断文档是否过期,但不会保证已过期的数据会立马被删除,因后台线程每60秒触发一次删除任务,且如果删除的数据量较大,会存在上一次的删除未完成,而下一次的任务已经开启的情况,导致过期的数据也会出现超过了数据保留时间60秒以上的现象。
    • 对于副本集而言,TTL索引的后台进程只会在primary节点开启,在从节点会始终处于空闲状态,从节点的数据删除是由主库删除后产生的oplog来做同步。
    • TTL索引除了有expireAfterSeconds属性外,和普通索引一样

    三、TTL索引的限制

    • 只支持对单个字段创建TTL索引,复合索引不支持expireAfterSeconds选项
    • _id列不支持TTL索引
    • 固定集合(capped collection)不支持TTL索引
    • 不支持用createIndex() 修改expireAfterSeconds属性,但可以用collMod命令修改,或者重建索引,但重建对于大集合成本较高,建议用collMod方式
    • 一个列只能创建普通索引或TTL索引,不能同时对一个列创建这2种类型索引(实际TTL索引本身就是普通索引,只是多了一个过期属性)
    • 如果一个列已经存在索引,则需要先将该索引drop后才能重建为TTL索引,不能直接转换

    四、TTL索引的使用场景

    1. 指定具体的过期时间属性

    该场景是在创建索引时明确指定一个expireAfterSeconds时间作为文档的过期时间

    // 对log_events集合的createdAt字段创建TTL索引且设置expireAfterSeconds过期时间为3600秒(1小时)
    onepiece:PRIMARY> db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )
    
    // 对文档插入数据,包含createdAt字段,则该文档会在1小时候字段删除
    onepiece:PRIMARY> db.log_events.insert( {
       "createdAt": new Date(),
       "logEvent": 2,
       "logMessage": "Success!"
    } )
    

    2. 插入一个具体的过期时间

    该场景是在创建索引时将expireAfterSeconds设置为0,在这种情况下由插入到字段的数据来控制文档何时过期,这种场景更加精细化,可灵活的控制文档的过期时间及控制在业务低峰期触发文档过期

    // 对log_events集合的expireAt创建TTL索引,并设置expireAfterSeconds属性为0
    onepiece:PRIMARY> db.log_events.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0 } )
    
    // 对文档插入数据,包含expireAt字段,该文档过期时间就是expireAt字段记录的时间
    onepiece:PRIMARY> db.log_events.insert( {
       "expireAt": new Date('Jan 16, 2020 14:00:00'),
       "logEvent": 2,
       "logMessage": "Success!"
    } )
    

    3. TTL属性的修改(collMod)

    对于TTL索引的expireAfterSeconds的属性,可以用collMod方式进行修改

    // 创建TTL索引设置1小时过期属性
    onepiece:PRIMARY> db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )
    {
    	"createdCollectionAutomatically" : true,
    	"numIndexesBefore" : 1,
    	"numIndexesAfter" : 2,
    	"ok" : 1
    }
    
    // 查看索引定义
    onepiece:PRIMARY> db.log_events.getIndexes()
    [
    	{
    		"v" : 2,
    		"key" : {
    			"_id" : 1
    		},
    		"name" : "_id_",
    		"ns" : "test.log_events"
    	},
    	{
    		"v" : 2,
    		"key" : {
    			"createdAt" : 1
    		},
    		"name" : "createdAt_1",
    		"ns" : "test.log_events",
    		"expireAfterSeconds" : 3600
    	}
    ]
    
    // 修改索引定义,将一小时文档过期改为60秒
    onepiece:PRIMARY> db.runCommand( { collMod: "log_events",
    			index: { keyPattern: { createdAt: 1 },
    			expireAfterSeconds: 60
    			}
    })
    
    // 返回值: { "expireAfterSeconds_old" : 3600, "expireAfterSeconds_new" : 60, "ok" : 1 }
    

    五、Date类型

    • Date() method which returns the current date as a string.
    • new Date() constructor which returns a Date object using the ISODate() wrapper.
    • ISODate() constructor which returns a Date object using the ISODate() wrapper.
    onepiece:PRIMARY> Date()
    Thu Jan 16 2020 14:48:40 GMT+0800 (CST)
    
    onepiece:PRIMARY> new Date()
    ISODate("2020-01-16T06:48:48.655Z")
    
    onepiece:PRIMARY> ISODate()
    ISODate("2020-01-16T06:48:53.673Z")
    

    六、参考文档

    • https://docs.mongodb.com/manual/core/index-ttl/index.html
    展开全文
  • GitHub 4.8k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 4.8k Star 的Java工程师成神之路 ,真的不来...相信很多人对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据结构。 因为索引...
  • 说到索引,很多人都知道“索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,在数据十分庞大的时候,索引可以大大加快查询的速度,这是因为使用索引后可以不用扫描全表来定位某...
  • MySQL索引的创建与使用

    万次阅读 多人点赞 2018-08-06 18:49:59
    索引有很多,且按不同的分类方式,又有很多种分类。不同的数据库,对索引的支持情况也不尽相同。 声明:本人主要简单示例MySQL中的单列索引、组合索引的创建与使用。 索引的创建: 建表时创建: CREATE TABLE ...
  • 索引是查询优化最主要的方式; 查询方式: 一种是:全表扫描; 一种是:利用数据表上建立的所以进行扫描。 1.索引类型分类 UNIQUE(唯一索引):不可以出现相同的值,可以有NULL值;( 加快查询速度,并且...
  • 索引的数据结构分析,数据库面试到索引最常见的问题分析,我总结了一下。
  • MySQL联合索引

    万次阅读 2020-06-02 22:31:35
    联合索引概念: 联合索引又叫复合索引,即一个覆盖表中两列或者以上的索引,例如: index_name(column a,column b) 1 创建方式 执行alter table语句时创建 alter table table_name add index index_name(column_list)...
  • 在《面试官:为啥加了索引查询会变快?》一文中,我们介绍了索引的数据结构,正是因为索引使用了B+树,才使得查询变快。说白了,索引的原理就是减少查询的次数、减少磁盘IO,达到快速查找所需数据的目的 我们一起来...
  • pandas小记:pandas索引和选择

    万次阅读 多人点赞 2014-01-08 21:49:08
    索引选择时建议全部使用loc(尤其是修改df原本数据时),原因是最下面说的视图和显示拷贝。 dataframe列选择 和Series一样,在DataFrame中的一列可以通过字典记法或属性来检索,返回Series: frame2[0]#选择第0列...
  • mysql 联合索引生效的条件、索引失效的条件

    万次阅读 多人点赞 2019-02-23 10:11:30
    1.联合索引失效的条件 联合索引又叫复合索引。两个或更多个列上的索引被称作复合索引。 对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key...
  • 详述 Elasticsearch 通过范围条件查询索引数据的方法

    万次阅读 多人点赞 2019-04-05 11:15:59
    在使用 Elasticsearch 的时候,我们可能会遇到需要**以范围为条件查询索引数据**的需求。有两种方法可以实现我们的需求: - 第一种:在服务器或者终端,使用命令来查询索引数据; - 第二种:编写程序,通过 Elastic...
  • python中找出numpy array数组的最值及其索引

    万次阅读 多人点赞 2018-02-13 16:24:40
    python中找出numpy array数组的最值及其索引 在list列表中,max(list)可以得到list的最大值,list.index(max(list))可以得到最大值对应的索引 但在numpy中的array没有index方法,取而代之的是where,其又是list...
  • 数据库索引原理,及MySQL索引类型

    万次阅读 多人点赞 2018-08-31 21:08:40
    MySQL索引类型一览 让MySQL高效运行起来 本文介绍了七种MySQL索引类型。在数据库表中,对字段建立索引可以大大提高查询速度。通过善用这些索引,可以令MySQL的查询和运行更加高效。 索引是快速搜索的关键。MySQL...
  • InnoDB索引

    万次阅读 2019-08-05 16:30:09
    1.概述 InnoDB存储引擎支持一下几种索引 B+ 树索引 全文索引 哈希索引 2.B+ 树索引 ...B+树索引可以分为聚集索引(clustered inex)和辅助索引(secondary),其内部全是B+树结构,高度平衡。...
  • 一、MYSQL索引的分类 索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找相关行。表越大,成本越高。如果表中有相关​​列的索引,MySQL可以快速确定要在数据文件中间...
  • 聚集索引,非聚集索引,覆盖索引 原理

    万次阅读 多人点赞 2018-08-28 11:37:34
    「数据库」和「数据库索引」这两个东西是在服务器端开发领域应用最为广泛的两个概念,熟练使用数据库和数据库索引是开发人员在行业内生存的必备技能 使用索引很简单,只要能写创建表的语句,就肯定能写创建索引的...
  • 1.创建索引 给 Label 为 Person 的节点的 name 属性上创建索引,CQL语句如下所示: CREATE INDEX ON :Person(name) 运行截图如下所示: 重复执行上述CQL语句,再次创建索引,不会报错,但是没有再创建索引。 ...
  • 普通索引 最基本的索引类型,没有唯一性之类的限制。普通索引可以通过以下几种方式创建: 创建索引,例如CREATE INDEX ON tablename (列的列表); 修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列...
  • 联合索引

    万次阅读 2020-09-15 23:06:32
    MySQL可以使用多个字段同时建立一个索引,叫做联合索引.在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。 MySQL使用索引时需要索引有序,假设现在建立了"name,age,school"的...
  • 数据库索引

    万次阅读 多人点赞 2018-11-11 09:27:25
    说白了,数据库的索引问题就是查找问题 数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库中表的数据.索引的实现通常使用B树和变种的B+树(mysql常用的索引就是B+树) 除了数据之外,数据库...
  • 查看索引 show index from 数据库表名 alter table 数据库add index 索引名称(数据库字段名称) PRIMARY KEY(主键索引) ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) UNIQUE(唯一索引) ...
  • 1、创建索引 索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER TABLE来给表增加索引。 以下命令语句分别展示了如何创建主键索引(PRIMARY KEY)、 唯一索引(UNIQUE)、 全文索引...
  • mysql索引的新手入门详解

    万次阅读 多人点赞 2018-07-27 17:16:59
    索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,会保存在额外的文件中。 2、索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构。类似于字典中的目录,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 413,172
精华内容 165,268
关键字:

索引