精华内容
下载资源
问答
  • Mysql 复合键索引性能

    2014-10-10 23:05:00
    数据库的常见的索引一般单个字段,如果多个字段的组合,那么就组成了复合索引。对于组合索引,如果 对其中一字段做为条件查询,会出现什么情况呢? 一、例子 mysql> show create table watchdog\G ****...

         数据库的常见的索引一般是单个字段,如果多个字段的组合,那么就组成了复合索引。对于组合索引,如果

    对其中一字段做为条件查询,会出现什么情况呢?

     

    一、例子

    mysql> show create table watchdog\G
    *************************** 1. row ***************************
       Table: watchdog
       Create Table: CREATE TABLE `watchdog` (
           `index1` int(11) NOT NULL DEFAULT '0',
           `index2` int(11) NOT NULL DEFAULT '0',
           `dog` int(11) NOT NULL DEFAULT '9',
            PRIMARY KEY (`index1`,`index2`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    
        1 row in set (0.00 sec)

    创建了以上数据表,索引是复合索引(index1, index2),针对以两种情况:

    <1>
    select index1, index2 
    from watchdog 
    where index1 > 4000008 and index1 < 4200007; 
    <2>
    select index1, index2 
    from watchdog 
    where index2 > 4000009 and index2 < 4200007;

    诚然,大多数人可能认为这两个情况索引都是一样的,至少我自己这么认为。

    二、验证

    对以上的两情况实验结果

    <1>
     ...
    | 4200001 | 4200002 |
    | 4200002 | 4200003 |
    | 4200003 | 4200004 |
    | 4200004 | 4200005 |
    | 4200005 | 4200006 |
    | 4200006 | 4200007 |
    +---------+---------+
    
    199997 rows in set (0.09 sec)
    <2>
    ...
    | 4200002 | 4200003 |
    | 4200003 | 4200004 |
    | 4200004 | 4200005 |
    | 4200005 | 4200006 |
    +---------+---------+
    
    199997 rows in set (1.68 sec)

    两种情况的性能消耗时间相距甚远。其原因为何?

    三、结果

    查明原因,MySQL的复制索引在Where条件下有三种情形:

    <1>没有用到复合索引

    <2>只用到第一个索引

    <3>用到全部的索引

    所以,针对以上实验第二情况所使用到的第二个索引,起不了索引作用。

    文档:

    http://stackoverflow.com/questions/26255039/mysql-column-order-in-composite-key/26255121

    http://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html

    Note: explain命令虽可以解析sql语句,但具体还是要再斟酌一下。

    转载于:https://www.cnblogs.com/zhuangzebo/p/4018065.html

    展开全文
  • Propel 2的行为,它提供组合... 那是什么? 考虑使用一个表,该表具有一个自动递增的id字段,一个外键和一个组合的id字段,它们的行为与自动递增的字段相同,但是对于每个新的外部id值都从零开始。 例子: <
  • 上面我创建的群聊,欢迎新朋友...所以对于这个类型的复合设备,只要端点大小足够,其他没什么变动的,无非修改下报告描述符 因为都HID设备,也不需要额外的端点 关于报告描述符,我这不多解释,可以参考http...

    上面是我的微信和QQ群,欢迎新朋友的加入。

    最近研究USB复合设备

    主要是把键盘和电脑音量控制两个东西给合并成一个设备

    首先要知道的一点的是,不论是键盘、鼠标、或者这个标准的HID用户控制设备,本质都是HID设备

    所以对于这个类型的复合设备,只要端点大小足够,其他没什么变动的,无非是修改下报告描述符

    因为都是HID设备,也不需要额外的端点

    关于报告描述符,我这不多解释,可以参考https://www.cnblogs.com/AlwaysOnLines/p/4552840.htm

    目录

    1.HID定义的设备类

    2.关于报告ID

    3.修改端点大小

    4.报告描述符

    5.查看设备

    6.测试


    1.HID定义的设备类

    上面是HID定义的一些设备功能

    2.关于报告ID

     Report ID放在信息包中报表数据之前,设备可以支持多个相同类型的报表,每一个报表包含不同的数据与其特有的ID。
                            在报表描述符中,Report ID项目作用于其后续所有的项目,直到遇到下一个Report ID为止。如果报表描述符中没有Report ID项目,默认的ID值是0,描述符不能定义一个为0的Report ID,输入报表、输出报表与特征报表可以分享同一个Report ID。
                            在Set_Report和Get_Report请求传输中,主机在设置事务的wValue字段的低字节中指定一个Report ID。在中断传输中如果接口支持一个以上的Report ID,Report ID必须是传送报表中的第一个字节。如果接口只支持数值为0的默认Report ID,此Report ID不应该在中断传输中随着报表一起传送。

    3.修改端点大小

    #define HID_EPIN_ADDR                 0x81
    #define HID_EPIN_SIZE                 0x40
    #define HID_EPOUT_ADDR                0x01
    #define HID_EPOUT_SIZE                0x40

    键盘只有8个字节,但是因为是复合设备,传输的时候要考虑报告ID的数据,会多出一个字节

    4.报告描述符

    __ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =
    {
    0x05, 0x01,// USAGE_PAGE (Generic Desktop)
    0x09, 0x06,// USAGE (Keyboard)
    0xa1, 0x01,// COLLECTION (Application)
    0x85, 0x01, //Report ID (1)  
    0x05, 0x07,// USAGE_PAGE (Keyboard)
    0x19, 0xe0,// USAGE_MINIMUM (Keyboard LeftControl)
    0x29, 0xe7,// USAGE_MAXIMUM (Keyboard Right GUI)
    0x15, 0x00,// LOGICAL_MINIMUM (0)
    0x25, 0x01,// LOGICAL_MAXIMUM (1)
    0x75, 0x01,// REPORT_SIZE (1)
    0x95, 0x08,// REPORT_COUNT (8)
    0x81, 0x02,// INPUT (Data,Var,Abs)
    0x95, 0x01,// REPORT_COUNT (1)
    0x75, 0x08,// REPORT_SIZE (8)
    0x81, 0x03,// INPUT (Cnst,Var,Abs)
    0x95, 0x05,// REPORT_COUNT (5)
    0x75, 0x01,// REPORT_SIZE (1)
    0x05, 0x08,// USAGE_PAGE (LEDs)
    0x19, 0x01,// USAGE_MINIMUM (Num Lock)
    0x29, 0x05,// USAGE_MAXIMUM (Kana)
    0x91, 0x02,// OUTPUT (Data,Var,Abs)
    0x95, 0x01,// REPORT_COUNT (1)
    0x75, 0x03,// REPORT_SIZE (3)
    0x91, 0x03,// OUTPUT (Cnst,Var,Abs)
    0x95, 0x06,// REPORT_COUNT (6)
    0x75, 0x08,// REPORT_SIZE (8)
    0x15, 0x00,// LOGICAL_MINIMUM (0)
    0x25, 0xFF,// LOGICAL_MAXIMUM (255)
    0x05, 0x07,// USAGE_PAGE (Keyboard)
    0x19, 0x00,// USAGE_MINIMUM (Reserved (no event indicated))
    0x29, 0x65,// USAGE_MAXIMUM (Keyboard Application)
    0x81, 0x00,// INPUT (Data,Ary,Abs)
    0xc0,
    
    0x05, 0x0c,  
    0x09, 0x01,
    0xa1, 0x01,  
    0x85, 0x03, //Report ID (1)  
    0xa1, 0x00, 
    0x09, 0xe9, 
    0x09, 0xea, 
    0x09, 0xe2,   
    0x09, 0xcd,
    0x35, 0x00,  
    0x45, 0x07, 
    0x15, 0x00,
    0x25, 0x01,
    0x75, 0x01,
    0x95, 0x04, 
    0x81, 0x02, 
    0x75, 0x01,
    0x95, 0x04, 
    0x81, 0x01, 
    0xc0, 
    0xc0
    
    }; 

    如上是修改之后的报告描述符

    5.查看设备

    可以看到同时存在了两个设备,一个键盘,一个控制设备

    6.测试

    键盘功能和音量调节都能使用

    展开全文
  • 思前想后,好像总有什么不对! 于是又做了一番资料查询,发现索引不是那么简单,即使命中索引也没那么简单。 突然有些感慨,当个DBA不容易啊。 1.复合索引 先说说复合索引,相信大家都知道。两个或更多列上的...
    今天一位小伙伴问我关于SQL查询效率以及索引的东西。
    我说只要尽量命中索引即可。特别是聚集索引。思前想后,好像总有什么不对!
    于是又做了一番资料查询,发现索引不是那么简单,即使是命中索引也是没那么简单。
    突然有些感慨,当个DBA不容易啊。

    1.复合索引
    先说说复合索引,相信大家都知道。两个或更多列上的索引就被称作复合索引。
    最近在做某酒店的项目。拿这个举个例子:
    Order表名,
    其中包含列:GuestSrcCode(客源代码),HotelID(酒店编号)  
                                                                     tips:客源代码只有几种情况(散客,会员,中介,团队),酒店编号有很多
      a.列顺序
      在创建复合索引时,顺序是需要仔细斟酌的。
      a.1:当创建一个客源代码--酒店编号的索引时
     create index non_clu_GuestSrcAndHotelID on [order] (GuestSrcCode,HotelID)
    我们查询如下sql   这里我们尽量将查询少量的数据(避免书签查找),便于看出列顺序的问题
    sql1: select * from [Order] where GuestSrcCode='GS04'
    执行计划如下:

    sql2: select * from [Order] where HotelID='023023'
    执行计划如下:

    可以看到当条件只有HotelID时,没有用到上面我们建的索引。
    a.1:当创建一个酒店编号--客源代码的索引时(反过来)
    sql1: select * from [Order] where GuestSrcCode='GS04'
    执行计划如下:

    sql2: select * from [Order] where HotelID='023023'
    执行计划如下:

    可以看到当条件只有GuestSrcCode时,没有用到上面我们建的索引。
     同样的例子做过好多,结果大概了解了。
    列顺序总结:
    创建复合索引时,主要是看第一列的,比如abc和acb是效果是差不多的。
    如何看出将哪一个用作第一列。。。你就把这第一列当成单索引建立好了。。。

      b.书签查找
     很多时间我们会发现,咱们条件里使用了某索引,但是查看执行计划,还是使用的是聚集索引扫描。。。。
     这时候一般都是发生的书签查找。
     当在索引统计信息(索引表中)中发现查找的数据的很多时,
                        Sql查询优化器就会放弃使用该索引,而去使用聚集索引扫描。

    这时候可以使用覆盖索引来避免。
    eg: create index non_clu_GuestSrcAndHotelID on [order] (GuestSrcCode,HotelID)include(ContactName)
                                                                                                                                    --一般查询订单会同时将联系人查询出来



    展开全文
  • 复合索引

    2018-05-27 23:31:23
    概要什么是单一索引,什么是复合索引呢? 何时新建复合索引,复合索引又需要注意些什么呢?本篇文章主要对网上一些讨论的总结。一.概念单一索引指索引列为一列的情况,即新建索引的语句只实施在一列上。用户可以...

    概要


    什么是单一索引,什么又是复合索引呢? 何时新建复合索引,复合索引又需要注意些什么呢?本篇文章主要是对网上一些讨论的总结。

    一.概念

    单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上。

    用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引)。复合索引的创建方法与创建单一索引的方法完全一样。但复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引。当表的行数远远大于索引键的数目时,使用这种方式可以明显加快表的查询速度。

    同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为1-2列的索引,如果不特殊说明的话一般是指单一索引。宽索引也就是索引列超过2列的索引。

    设计索引的一个重要原则就是能用窄索引不用宽索引,因为窄索引往往比组合索引更有效。拥有更多的窄索引,将给优化程序提供更多的选择余地,这通常有助于提高性能。

    二.使用

    创建索引 

    create index idx1 on table1(col1,col2,col3)  

    查询

    select * from table1 where col1= A and col2= B and col3 = C

    这时候查询优化器,不在扫描表了,而是直接的从索引中拿数据,因为索引中有这些数据,这叫覆盖式查询,这样的查询速度非常快。   

    三.注意事项

    1.何时是用复合索引

    在where条件中字段用索引,如果用多字段就用复合索引。一般在select的字段不要建什么索引(如果是要查询select col1 ,col2, col3 from mytable,就不需要上面的索引了)。根据where条件建索引是极其重要的一个原则。注意不要过多用索引,否则对表更新的效率有很大的影响,因为在操作表的时候要化大量时间花在创建索引中.

    2.对于复合索引,在查询使用时,最好将条件顺序按找索引的顺序,这样效率最高。如:  

    IDX1:create   index   idx1   on   table1(col2,col3,col5)  

    select   *   from   table1   where   col2=A   and   col3=B   and   col5=D  

    如果是"select   *   from   table1   where   col3=B   and   col2=A   and   col5=D"

    或者是"select   *   from   table1   where   col3=B"将不会使用索引,或者效果不明显

    3.复合索引会替代单一索引么?

    很多人认为只要把任何字段加进聚集索引,就能提高查询速度,也有人感到迷惑:如果把复合的聚集索引字段分开查询,那么查询速度会减慢吗?带着这个问题,我们来看一下以下的查询速度(结果集都是25万条数据):(日期列fariqi首先排在复合聚集索引的起始列,用户名neibuyonghu排在后列)

    IDX1:create   index   idx1   on   Tgongwen(fariqi,neibuyonghu)  

    (1)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>'2004-5-5'

    查询速度:2513毫秒

    (2)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>'2004-5-5' and neibuyonghu='办公室'

    查询速度:2516毫秒

    (3)select gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu='办公室'

    查询速度:60280毫秒

    从以上试验中,我们可以看到如果仅用聚集索引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询速度是几乎一样的,甚至比用上全部的复合索引列还要略快(在查询结果集数目一样的情况下);而如果仅用复合聚集索引的非起始列作为查询条件的话,这个索引是不起任何作用的。当然,语句1、2的查询速度一样是因为查询的条目数一样,如果复合索引的所有列都用上,而且查询结果少的话,这样就会形成“索引覆盖”,因而性能可以达到最优。同时,请记住:无论您是否经常使用聚合索引的其他列,但其前导列一定要是使用最频繁的列。

    [参考: 查询优化及分页算法方案 http://blog.csdn.net/chiefsailor/archive/2007/05/28/1628339.aspx]


    4.需要在同一列上同时建单一索引和复合索引么?

    试验: sysbase   5.0   表table1   字段:col1,col2,col3  

    试验步骤:  

    (1)建立索引idx1   on   col1  

      执行select   *   from   table1   where   col1=A     使用idx1  

      执行select   *   from   table1   where   col1=A   and   col2=B   也使用idx1  

    (2)删除索引idx1,然后建立idx2   on   (col1,col2)复合索引  执行以上两个查询,也都使用idx2  

    (3)如果两个索引idx1,idx2都存在  

      并不是   where   col1='A'用idx1;where   col1=A   and   col2=B  用idx2。  

      其查询优化器使用其中一个以前常用索引。要么都用idx1,要么都用idx2.  

    由此可见,

    (1)对一张表来说,如果有一个复合索引 on   (col1,col2),就没有必要同时建立一个单索引 on col1。

    (2)如果查询条件需要,可以在已有单索引 on col1的情况下,添加复合索引on   (col1,col2),对于效率有一定的提高。

    (3)同时建立多字段(包含5、6个字段)的复合索引没有特别多的好处,相对而言,建立多个窄字段(仅包含一个,或顶多2个字段)的索引可以达到更好的效率和灵活性。

    5. 一定需要覆盖性查询么?

    覆盖性查询:select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖。

    通常最好不要采用一个强调完全覆盖查询的策略。如果Select子句中的所有列都被一个非群集索引覆盖,优化程序会识别出这一点,并提供很好的性能。不过,这通常会导致索引过宽,并会过度依赖于优化程序使用该策略的可能性。通常,是用数量更多的窄索引,这对于大量查询来说可以提供更好的性能。

    总结:

    1.尽量使用窄索引。即时是在使用覆盖性查询的时候

    2.索引过多反而会降低数据库的性能

    3.除非在使用or条件时,需要在or之间的每个条件上使用单一索引,否则窄索引的复合索引和单一索引是没有明显区别的

    4.注意索引的使用顺序和建立顺序。无论您是否经常使用聚合索引的其他列,但其前导列一定要是使用最频繁的列。

    出处:http://www.cnblogs.com/wenly/articles/1240321.html




    展开全文
  • MongoDB复合索引详解

    2019-10-06 15:47:30
    什么是复合索引? 复合索引,即Compound Index,指的将多个组合到一起创建索引,这样可以加速匹配多个的查询。不妨通过一个简单的示例理解复合索引。 students集合如下: db.students.find()....
  • Objective-C 复合

    2015-08-25 16:39:00
    什么是复合?有什么优点?什么时候用复合什么是依赖关系?如何解决? 复合就是将一些个体组件组合起来形成一个整体。(一个类定义另一个类作为实例变量) 优点: 1.将其他对象引用到新创建的对象中,形成新的...
  • SQL Server的复合索引学习

    千次阅读 2017-10-11 16:26:05
    概要什么是单一索引,什么是复合索引呢? 何时新建复合索引,复合索引又需要注意些什么呢?本篇文章主要对网上一些讨论的总结。一.概念单一索引指索引列为一列的情况,即新建索引的语句只实施在一列上。用户可以...
  • 文件系统就是输入路径 然后返回文件内容 如果我们需要查找某个文件里面的某个值 我们就要打开文件进行扫描。 ...这个系统建立在文件系统之上,输入key 输出value,key当然可以是复合 ...
  • 基于springboot的ShardingSphere5.X的分库分表的解决方案之复合分片算法的实现之分库的实现(七) 在前面我们都使用...1、什么是复合分片算法 ​ 对应 ComplexKeysShardingAlgorithm,用于处理使用多作为
  • 概要什么是单一索引,什么是复合索引呢? 何时新建复合索引,复合索引又需要注意些什么呢?本篇文章主要对网上一些讨论的总结。一.概念单一索引指索引列为一列的情况,即新建索引的语句只实施在一列上。用户可以...
  • 概要什么是单一索引,什么是复合索引呢? 何时新建复合索引,复合索引又需要注意些什么呢?本篇文章主要对网上一些讨论的总结。一.概念单一索引指索引列为一列的情况,即新建索引的语句只实施在一列上。用户可以...
  • 什么是单一索引,什么是复合索引呢? 何时新建复合索引,复合索引又需要注意些什么呢?本篇文章主要对网上一些讨论的总结。一.概念单一索引指索引列为一列的情况,即新建索引的语句只实施在一列上。用户可以在多...
  • 复合控件封装在公共容器内的 Windows 窗体控件的集合。这种控件有时称为“用户控件”。包含的控件称为“构成控件”。 用户控件 复合控件包含与每个包含的 Windows 窗体控件相关联的所有固有功能,允许您有选择地...
  • SQL Server学习之复合索引

    千次阅读 2007-06-19 09:51:00
    概要什么是单一索引,什么是复合索引呢? 何时新建复合索引,复合索引又需要注意些什么呢?本篇文章主要对网上一些讨论的总结。一.概念单一索引指索引列为一列的情况,即新建索引的语句只实施在一列上。用户可以...
  •  环氧树脂复合基材单、双面板  (CEM1&CEM3)  电视、显示器、电源供应器、高级音响、电话机、游乐器、汽车用电子产品、鼠标、电子记事本  玻纤布环氧树脂单、双面板  (FR4 )  适配卡、计算机外设设备、...
  • 什么需要复合: 某一个复杂的类,需要由多个不同的部分组成,比如电脑需要由主机键盘显示器组成,这时候就可以用到复合,将部分作为主体的实例变量 复合和继承 继承“is A”关系;复合是“has A”关系。 ...
  • 一、组合设备的概念 一般来说,都一个usb口接一个usb设备,并在pc端实现单一的...像上面说的这种只有一个usb接口,却集成了多个usb设备功能的设备,一般有两种实现方式:一种Compound Device,就是复合设备;另一

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 189
精华内容 75
关键字:

复合键是什么