精华内容
下载资源
问答
  • mysql中联合索引排序问题

    千次阅读 2019-12-30 19:04:36
    在test数据库中,查询一组数据会根据id进行排序,而同样的条件在pre数据库中查询却没有根据默认的id主键来排序,于是激起了好奇心。 情况 正常情况下,在默认没有写order by条件的情况下,查询出来的结果会根据...

    背景

    在test数据库中,查询一组数据会根据id进行排序,而同样的条件在pre数据库中查询却没有根据默认的id主键来排序,于是激起了好奇心。

     

    情况

    正常情况下,在默认没有写order by条件的情况下,查询出来的结果会根据id主键从小到大的排序,例如在测试环境中会有:

    但是在pre数据库中,则有:

    分析

    到底是什么原因导致了没有根据id来排序呢?第一点想到的一定是与表结构定义有关,左侧是test的表定义,右侧是pre的表定义

    可以看到,两个表的只有索引不一样,在test数据库下,走的是INDEX_PLAN_ID的索引,而在pre数据库下,走的是联合索引idx_teach_plan_question,可能排序就与索引有关

     

    验证

    test数据库sql解释

    pre数据库sql解释

    发现查询条件走的索引和分析的一致。

    另外当我们删除掉test数据库中该表的INDEX_PLAN_ID索引后,也会出现id乱序的情况,从另一个方面也验证了根据联合索引的排序。

     

    结论

    若查询条件中没有走索引,或者是走的普通索引,结果都会按照id主键从小到大排序

    若查询条件走联合索引,则结果会按照联合索引的从左到右的字段先后顺序排序。

    展开全文
  • MongoDB组合索引

    千次阅读 2018-08-17 11:00:15
    MongoDB支持组合索引,就是一个索引结构里面包括一个集合文档的多个字段。下图展示了一个拥有两个字段的组合索引组合索引的字段不能超过31个 组合索引查询的时候支持多个字段的匹配   一、创建一个组合...

    MongoDB支持组合索引,就是一个索引结构里面包括一个集合文档的多个字段。下图展示了一个拥有两个字段的组合索引:

    组合索引的字段不能超过31个

    组合索引查询的时候支持多个字段的匹配

     

    一、创建一个组合索引

    创建组合索引的语法格式如下:

    db.collection.createIndex({field1:type,field2:type2,***})

    跟在字段后面的索引声明描述了该字段的索引类型,比如值为1描述了该索引是一个升序索引,值为-1表示该索引是降序索引

     

    重要:不能创建hash类型的组合索引。如果你创建hash类型的组合索引就会报报错

     

    假设有个products的集合,集合存在如下的文档:

    { "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases" }

     

    下面的操作会在item和stock上面创建升序索引:

    db.products.createIndex({"item":1,"stock":1})

     

    组合索引中字段出现的先后顺序非常重要。该索引首先对文档的item进行排序,然后再根据每个item对stock字段进行排序

     

    除了支持对组合索引的所有字段的查询的完全匹配,组合索引也支持对索引字段的前缀匹配,这意味着索引不仅仅支持item和stock字段的索引查询,也支持item字段的查询

     

    二、排序顺序

    索引的参考字段要么是升序的要么是降序的排序顺序。对于单字段索引,字段的排序顺序是无关紧要的,因为MongoDB可以在两个方向上来回切换。然后对于组合索引,排序顺序决定了索引支持的排序操作。

     

    假设一个集合events包含的文档里面有username和date字段,应用的查询结果首先需要根据username升序排序再根据date降序排序:

    db.events.find().sort({username:1,date:-1})

    或者查询的结果首先需要根据username降序排序再根据date升序排序:

    db.events.find().sort({username:-1,date:1})

    下面的索引支持上面两种排序操作:

    db.events.createIndex({"username":1,"date":-1})

    然而,上面的索引不支持根据username升序排列再根据date升序排列:

    db.events.find().sort({username:-1,date:-1})

     

    三、前缀

    索引前缀是指索引字段最前面的子集,例如下面的组合索引:

    { "item": 1, "location": 1, "stock": 1 }

     

    它有下来的索引前缀:

    • { item: 1 }
    • { item: 1, location: 1 }

     

    对于组合索引,MongoDB对索引前缀的查询也能使用索引。既然如此,MongoDB可以再下面字段的查询中使用索引:

    • item
    • item 和 location
    • item、location和stock

    MongoDB也能使用索引支持在item和stock上面的查询,因为item字段符合索引前缀,但是对于在item和stock上面的查询则没法使用索引

     

    然而,MongoDB不能在没有item字段的查询中使用索引,因为查询字段中没有匹配索引前缀:

    • location
    • stock
    • location 和 stock

     

    如果你的集合既有组合索引又有一个索引在其前缀上,比如{a:1,b:1}和{a:1},如果这个索引既不是稀疏索引也不是唯一索引,那么你就可以删除那个前缀上的索引({a:1}).MongoDB将会使用组合索引来匹配前缀索引

     

    展开全文
  • 组合索引中列的顺序对执行计划的影响比较大。下面先简单介绍组合索引的适用场景,后面再根据一个具体的SQL说说组合索引中列的顺序对DM7执行计划的影响。 1、使用组合索引查询的场景 兹有 Index (A,B,C) ——组合...

    组合索引中列的顺序对执行计划的影响比较大。下面先简单介绍组合索引的适用场景,后面再根据一个具体的SQL说说组合索引中列的顺序对DM7执行计划的影响。

    1、使用组合索引查询的场景

    兹有 Index (A,B,C) ——组合索引多字段是有序的,并且是个完整的BTree 索引。

    下面条件可以用该组合索引查询:

    A>5

    A=5 AND B>6

    A=5 AND B=6 AND C=7

    A=5 AND B IN (2,3) AND C>5

     

    下面条件将不能用该组合索引查询:

    B>5 ——查询条件不包含组合索引首列字段

    B=6 AND C=7 ——查询条件不包含组合索引首列字段

    下面条件将能用部分组合索引查询:

    A>5 AND B=2 ——当范围查询使用第一列,查询条件仅仅能使用第一列

    A=5 AND B>6 AND C=2 ——范围查询使用第二列,查询条件仅仅能使用前二列

    2、使用组合索引排序的各种场景

    兹有组合索引 Index(A,B)。

    下面条件可以用该组合索引排序:

    ORDER BY A——首列排序

    A=5 ORDER BY B——第一列过滤后第二列排序

    ORDER BY A DESC, B DESC——注意,此时两列以相同顺序排序

    A>5 ORDER BY A——数据检索和排序都在第一列

     

    下面条件不能用该组合索引排序:

    ORDER BY B ——排序在索引的第二列

    A>5 ORDER BY B ——范围查询在第一列,排序在第二列

    A IN(1,2) ORDER BY B ——理由同上

    ORDER BY A ASC, B DESC ——注意,此时两列以不同顺序排序

     

    3、组合索引的执行计划的影响

    先看一条查询的SQL:

    分析下这条SQL该如何建索引,根据UCAP_DEPT这个表中的记录数,可以判断通过DEPT_BELONGTO能够过滤很多记录,这条SQL最好的计划应该是先将


    的结果查询出来,然后再进行后续查询。

    a)    先建索引:

    收集统计信息:


    看看执行计划:

    可惜不是最优的计划,但是这个计划在并发的情况下速度不会慢的,代价也很小。在目前的版本里面这个计划算是最优的。

    b)  再建索引

    根据上面的计划,走NEST LOOPINDEX JOIN2的话,按照下面的索引顺序建索引是否会好点呢?


    收集统计信息:


    此时的执行计划:


    可以看到在第8行,一个走的是NEST LOOP INDEXJOIN2一个走的是HASH2 INNER JOIN我们知道,走hash的话对内存等要求比较高,并发下面占用内存比较多。所以这个a的索引顺序比较合适。因为目前系统刚上线数据量比较小,后期数据量大的话效果会更明显。并且但从计划上面也可以看出,就目前的数据量来看,a的索引顺序比b的代价要小,并且实际执行的时间比b的也快1被以上(K1环境)。

    4、Oracle中索引顺序的影响

    上面的SQL在Oracle中测试了下,发现Oracle中索引的顺序没有影响,2种索引计划一样:

    展开全文
  • 数据库组合索引

    千次阅读 2019-07-07 17:23:41
    组合索引是什么?组合索引建立的原则。b树和b+树的区别。 一次查询只能用到一个索引,所以 首先枪毙 a,b各建索引方案 a还是b? 谁的区分度更高(同值的最少),建谁! 当然,联合索引也是个不错的方案,...

    2018、03、12面试中的问题

    组合索引是什么?组合索引建立的原则。b树和b+树的区别。

     

    一次查询只能用到一个索引,所以 首先枪毙 a,b各建索引方案

     

    a还是b? 谁的区分度更高(同值的最少),建谁!

     

    当然,联合索引也是个不错的方案,ab,还是ba,则同上,区分度高者,在前

     

    索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行,还需要考虑每次读入数据页的IO开销。而如果采取索引,则可以根据索引指向的页以及记录在页中的位置,迅速地读取目标页进而获取目标记录。

    大多数情况下都(默认)采用B树来构建索引。只是空间列类型的索引使用R-树,并且MEMORY表还支持hash索引。B树是平衡多叉树,每个节点存放多少个值取决于值所占的空间,这与每一张数据页存放多少条记录与记录信息量有关同理。节点中的值是以非降序进行排列的,节点中的值总是小于等于指向它的结点中的值。

    MySQL使用B树构造索引的情况下,是由叶子指向具体的页和记录的。并且一个叶子有一个指针指向下一个叶子。

     

    使用索引需要注意:

    ⑴只对WHERE和ORDER BY需要查询的字段设置索引,避免无意义的硬盘开销;

    ⑵组合索引支持前缀索引;

    ⑶更新表的时候,如增删记录,MySQL会自动更新索引,保持树的平衡;因此更多的索引意味着更多的维护成本

     索引的字段类型问题

    • text类型,也可建索引(需指定长度)
    • myisam存储引擎索引键长度综合不能超过1000字节
    • 用来筛选的值尽量保持和索引列同样的数据类型

    索引分四类:

    index ----普通的索引,数据可以重复

    fulltext----全文索引,用来对大表的文本域(char,varchar,text)进行索引。语法和普通索引一样。 

    unique ----唯一索引,唯一索引,要求所有记录都唯一

    primary key ----主键索引,也就是在唯一索引的基础上相应的列必须为主键

    like 不能用索引?

    • 尽量减少like,但不是绝对不可用,”xxxx%” 是可以用到索引的,

    想象一下,你在看一本成语词典,目录是按成语拼音顺序建立,查询需求是,你想找以 “一”字开头的成语(”一%“),和你想找包含一字的成语(“%一%”)

    • 除了like,以下操作符也可用到索引:

    <,<=,=,>,>=,BETWEEN,IN

    <>,not in ,!=则不行

     

    原则

       1,单表数据太少,索引反而会影响速度;更新非常频繁的数据不适宜建索引

       2,where后的条件,order by ,group by 等这样过滤时,后面的字段最好加上索引。根据实际情况,选择PRIMARY KEY、UNIQUE、INDEX等索引,但是不是越多越好,要适度

        3,联合查询,子查询等多表操作时关连字段要加索引

    ps:数据量特别大的时候,最好不要用联合查询,即使你做了索引

    多列查询该如何建索引?

    一次查询只能用到一个索引,所以 首先枪毙 a,b各建索引方案

    a还是b? 谁的区分度更高(同值的最少),建谁!

    当然,联合索引也是个不错的方案,ab,还是ba,则同上,区分度高者,在前

    联合索引的问题?

    where a = “xxx” 可以使用 AB 联合索引
    where b = “xxx” 则不可 (再想象一下,这是书的目录?)

    所以,大多数情况下,有AB索引了,就可以不用在去建一个A索引了

    详解:

    联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。


    两个或更多个列上的索引被称作复合索引。
    利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知 道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。
    所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。
    如:建立 姓名、年龄、性别的复合索引。
     

    create table test(
    a int,
    b int,
    c int,
    KEY a(a,b,c)
    );

    优: select * from test where a=10 and b>50
    差: select * from test where a50

    优: select * from test order by a
    差: select * from test order by b
    差: select * from test order by c

    优: select * from test where a=10 order by a
    优: select * from test where a=10 order by b
    差: select * from test where a=10 order by c

    优: select * from test where a>10 order by a
    差: select * from test where a>10 order by b
    差: select * from test where a>10 order by c

    优: select * from test where a=10 and b=10 order by a
    优: select * from test where a=10 and b=10 order by b
    优: select * from test where a=10 and b=10 order by c

    优: select * from test where a=10 and b=10 order by a
    优: select * from test where a=10 and b>10 order by b
    差: select * from test where a=10 and b>10 order by c


     

    mysql 复合索引,联合索引 - flyflying1987 - ly

    索引原则

    1.索引越少越好
    原因:主要在修改数据时,第个索引都要进行更新,降低写速度。
    2.最窄的字段放在键的左边
    3.避免file sort排序,临时表和表扫描.

    哪些常见情况不能用索引?

    • like “%xxx”
    • not in , !=
    • 对列进行函数运算的情况(如 where md5(password) = “xxxx”)
    • WHERE index=1 OR A=10
    • 存了数值的字符串类型字段(如手机号),查询时记得不要丢掉值的引号,否则无法用到该字段相关索引,反之则没关系

    也即

    select * from test where mobile = 13711112222;

    可是无法用到mobile字段的索引的哦(如果mobile是char 或 varchar类型的话)

    btw,千万不要尝试用int来存手机号(为什么?自己想!要不自己试试)

     

    覆盖索引(Covering Indexes)拥有更高效率

    索引包含了所需的全部值的话,就只select 他们,换言之,只select 需要用到的字段,如无必要,可尽量避免select *

    NULL 的问题

    NULL会导致索引形同虚设,所以在设计表结构时应避免NULL 的存在(用其他方式表达你想表达的NULL,比如 -1?)

    如何查看索引信息,如何分析是否正确用到索引?

    show index from tablename;
    explain select ……;

    关于explain,改天可以找个时间专门写一篇入门帖,在此之前,可以尝试 google

    了解自己的系统,不要过早优化!

    过早优化,一直是个非常讨厌而又时刻存在的问题,大多数时候就是因为不了解自己的系统,不知道自己系统真正的承载能力

    比如:几千条数据的新闻表,每天几百几千次的正文搜索,大多数时候我们可以放心的去like,而不要又去建一套全文搜索什么的,毕竟cpu还是比人脑厉害太多

    最后:永远别忘记的关键词 sql注入

    展开全文
  • Order By文件排序和索引排序

    千次阅读 2017-07-30 17:39:24
    在MySQL中的ORDER BY有两种排序实现方式: 1、利用有序索引获取有序数据 2、文件排序 在使用explain分析查询的时候,利用有序索引获取有序数据显示Using index。而文件排序显示Using filesort。 1.利用有序...
  • 组合索引

    千次阅读 2020-05-20 06:12:24
    首先我们看看组合索引的与单列索引的区别: 一.为什么要使用联合索引 减少开销 建一个联合索引(col1,col2,col3),实际相当于建了(col1),(col1,col2),(col1,col2,col3)三个索引。每多一个索引,都会增加写操作的...
  • 组合索引中列的顺序对执行计划的影响比较大。下面先简单介绍组合索引的适用场景,后面再根据一个具体的SQL说说组合索引中列的顺序对DM7执行计划的影响。 1、使用组合索引查询的场景 兹有 Index (A,B,C) ——组合...
  • 在创建组合索引时,网上一般的说法会提到:查询时where条件中的列的顺序要和创建...对于mysql的InnoDB引擎来说,组合索引的B+树结构上的叶子节点是按照第一个列的值大小进行排序,譬如对于组合索引(a,b,c),a,b,c...
  • 在网络上有很多MySQL的索引的结构的介绍,...以上图索引为例,组合索引在B+树中是两个字段进行排序的,索引的key是身高和年龄,值是主键id,先按照身高排序,身高一样的按照年龄排序 三、索引的key相同结构是怎么样的
  • 详细介绍了各种高性能的索引使用策略,比如索引排序、索引下推、压缩索引等等,以及常见索引失效的情况。
  • mysql5.7 索引where和orderby排序问题

    千次阅读 2020-03-13 14:23:21
    索引(a,b,c) select * from table where a=1 and b=... 索引排序 select * from table where a=1 and b=2 order by b; 索引排序 select * from table where a=1 and b=2 order by c; 索引排序 select * from t...
  • mysql组合索引的有序性

    千次阅读 2018-08-31 15:28:21
    昨天同事关于军规里的一条mysql索引的问题咨询我,才发现自己也不太了解组合索引的规则。于是来记录一下: 【推荐】如果有order by的场景,请注意利用索引的有序性。order by 最后的字段是组合索引的一部分,并且...
  • MySQL单列索引和组合索引

    千次阅读 2016-04-14 13:21:53
    组合索引,又称复合索引,两个或更多个列上的索引被称作复合索引。对于复合索引,他们都遵循左侧原则,也是就是说一个查询可以只使用复合索引最左侧的一部份。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c ...
  • 组合索引使用情况

    千次阅读 2018-08-02 10:07:56
    组合索引查询的各种场景 兹有 Index (A,B,C) ——组合索引多字段是有序的,并且是个完整的BTree 索引。 下面条件可以用上该组合索引查询: A&gt;5 A=5 AND B&gt;6 A=5 AND B=6 AND C=7 A=5 AND B IN...
  • 其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。当然,除了B+树这种类型的索引之外,还有哈稀索引(hash index)等。 MySQL InnoDB B-Tree索引使用Tips 这里主要...
  • Android ListView实现分组字母索引排序

    千次阅读 2015-04-21 09:25:05
    因为项目需要字母索引排序的效果,GIT上和博客上有很多,但是发现很多DEMO的效果和自己想要的有出入,所以稍微整理了一下。  这篇就是在整理过程中自己写的测试Demo。  先上截图(字符串是随机生成的,部分视觉...
  • MySQL单列索引和组合索引的区别

    千次阅读 2017-02-05 20:44:48
    MySQL单列索引和组合索引究竟有何区别呢?下文形象地对比了MySQL单列索引和组合索引的区别,希望...MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学
  • mysql组合索引与字段顺序

    千次阅读 2019-06-11 17:15:25
    一般来说,可能是某些字段没有创建索引,或者是组合索引中字段的顺序与查询语句中字段的顺序不符。 看下面的例子: 假设有一张订单表(orders),包含order_id和product_id二个字段。 一共有31条数据。符合下面语句的...
  • MYSQL单列索引和组合索引分析

    千次阅读 2018-12-10 19:14:06
    单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。 创建语句如下: /*==============================================================*/ /* Index: application_id */ /*=====...
  • 但是,网上的大多资料都没有提及,组合索引的具体实现。 我个人猜测组合索引也是使用一个 B-tree 来实现,其中关键字同时存储的是多个列的。 B-tree 根据多个列进行排序。这样正好可以很好地解释“最左前缀”...
  • 建立组合索引的字段顺序优化

    千次阅读 2019-01-14 21:39:25
    建立组合索引的字段顺序优化 简介 组合索引我们经常用到,建立组合索引大家也都会,但是如何考虑建立组合索引的顺序是一个值得推敲的事情。 正文 1. 尽量把最常用的字段放在最前面 对于我们需要创建的组合索引,如果...
  • Mysql主键索引、唯一索引、普通索引、全文索引、组合索引的区别
  • mysql创建组合索引

    千次阅读 2017-02-21 15:52:27
    正例: where a=? and b=? order by c; 索引: a_b_c 反例: 索引中有范围查找,那么索引有序性无法利用,如: WHERE a>10 ORDER BY b; 索引 a_b 无法排序
  • 组合索引注意事项

    2017-05-05 17:12:21
    选择索引字段的原则,比如外键字段、数据类型较小的字段、经常用于查询或排序的字段、表关联的字段等等,在此不做赘述。本人在工作中见到过很多人创建的索引,回想自己以前也会有理论知识空洞的体会,总感觉理论知识...
  • 单键索引还是组合索引

    万次阅读 2015-03-17 15:19:05
    转自 ... ... ...8.4.5 索引的利弊与如何判定,是否需要索引 ...相信读者都知道索引能够极大地提高数据检索的效率,让Query 执行得更快,但是可能并不是每一位朋友都清楚索引在极大提高检索效
  • mysql一组合索引

    千次阅读 2019-02-12 16:17:26
    命名规则:表名_字段名 ...对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。 例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组...
  • 背景: 为了提高数据库效率,建索引是家常便饭;那么...
  • MongoDB组合索引的优化

    千次阅读 2018-07-02 09:37:14
    MongoDB中组合索引的最佳建立方法以及索引中字段的最优顺序。并通过explain()输出的结果来验证实际性能,同时还分析了MongoDB的查询优化器的索引选择机制。项目背景预想中的项目是在MongoDB上建立一个类Disqus的...
  • MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样。其实可以这样说说,索引是凌驾于数据存储系统之上的另一层系统,所以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 144,504
精华内容 57,801
关键字:

组合索引排序问题