精华内容
下载资源
问答
  • 在MySQL中,如果创建了复合索引(name, salary, dept),就相当于创建了(name, salary, dept)、(name, salary)、(name)三个索引,这被称为复合索引前导列特性,因此在创建复合索引时应将最常用作查询条件的列放在最...

    复合索引前导列特性

    在MySQL中,如果创建了复合索引(name, salary, dept),就相当于创建了(name, salary, dept)、(name, salary)、(name)三个索引,这被称为复合索引前导列特性,因此在创建复合索引时应将最常用作查询条件的列放在最左边,依次递减。

    • 未使用索引
    SELECT * FROM employee WHERE salary = 8800;
    SELECT * FROM employee WHERE dept = '部门A';
    SELECT * FROM employee WHERE salary = 8800 and dept = '部门A';
    
    • 使用索引
    SELECT * FROM employee WHERE name = '刘峰';
    SELECT * FROM employee WHERE name = '刘峰' and salary = 8800;
    SELECT * FROM employee WHERE name = '刘峰' and salary = 8800 and dept = '部门A';
    

    覆盖索引

    覆盖索引又称之为索引覆盖,即select的数据列只从索引中就能得到,不必读取数据行,也就是只需扫描索引就可以得到查询结果。

    • 关于覆盖索引的几点说明:

    1.使用覆盖索引,只需从索引中就能检索到需要的数据,而不要再扫描数据表。
    2.索引的体量往往比数据表小很多,因此只读取索引速度会非常快,也会极大减少数据访问量。
    3.MySQL的查询优化器会在执行查询前判断,是否有一个索引可以覆盖所有的查询列。
    4.并非所有类型的索引都可以作为覆盖索引,覆盖索引必须要存储索引列的值。像哈希索引、空间索引、全文索引等并不会真正存储索引列的值。

    当一个查询使用了覆盖索引,在查询分析器EXPLAIN的Extra列可以看到“Using index”。

    例子

    1. 连接数据库,使用student数据库并显示其所有的数据表
    USE student;
    SHOW TABLES;
    

    效果图:
    在这里插入图片描述
    2. 查看employee数据表

    SELECT * FROM employee;
    

    效果图:
    在这里插入图片描述
    3. 查看employee的索引

    SHOW INDEX FROM employee\G;
    

    效果图:
    在这里插入图片描述
    4. 使用查询分析器分析查询命令

    EXPLAIN SELECT * FROM employee WHERE name = '刘峰'\G;
    

    在这里插入图片描述
    5. 创建复合索引

    CREATE INDEX idx_name_salary_dept ON employee(name, salary, dept);
    

    效果图:
    在这里插入图片描述
    6. 执行与第4步一样的命令,进行比较

    EXPLAIN SELECT * FROM employee WHERE name = '刘峰'\G;
    

    效果图:
    在这里插入图片描述
    7. 增加一个条件,与上一步比较

    EXPLAIN SELECT * FROM employee WHERE name = '刘峰' and salary = 8800\G;
    

    效果图:
    在这里插入图片描述
    8. 更换条件, 与上一步比较

    EXPLAIN SELECT * FROM employee WHERE dept = '部门A'\G;
    

    效果图:
    在这里插入图片描述
    9. 显示employee数据表的索引(共4条索引,此处只列一条)

    SHOW INDEX FROM employee\G;
    

    效果图:
    在这里插入图片描述
    10. 查询id=13的记录

    SELECT * FROM employee WHERE id = 13;
    

    效果图:
    在这里插入图片描述
    11. 使用查询分析器分析第10步的命令

    EXPLAIN SELECT * FROM employee WHERE id = 13\G;
    

    效果图:
    在这里插入图片描述
    12. 修改第10步的命令,再次分析

    EXPLAIN SELECT id FROM employee WHERE id = 13\G;
    

    效果图:
    在这里插入图片描述
    13. 去掉where子句的条件

    EXPLAIN SELECT name dept FROM employee\G;
    

    效果图:
    在这里插入图片描述
    14. 增加为2个、3个字段

    EXPLAIN SELECT name, salary, dept FROM employee\G;
    

    效果图:
    在这里插入图片描述

    在这里插入图片描述

    1. 增加为4个字段
    EXPLAIN SELECT name, sex, salary, dept FROM employee\G;
    

    效果图:
    在这里插入图片描述
    注:本文是博主MySQL学习的总结,不支持任何商用,转载请注明出处!如果你也对MySQL学习有一定的兴趣和理解,欢迎随时找博主交流~

    展开全文
  • 目录 存储引擎与底层实现的数据结构 InnoDB主键索引和二级索引 ...Mysql的索引与存储引擎相关,但是Mysql内常用的存储引擎有InnoDB、MyiSAM、Memory,在Mysql5.5版本后,InnoDB已经作为默认的存储引擎,...

    目录

    存储引擎与底层实现的数据结构

    InnoDB主键索引和二级索引

    复合索引(一棵B+树过滤过个条件)

    覆盖索引(不用回标)

    索引下推(减少回表次数)

    前缀索引(长字符串索引优化)


    存储引擎与底层实现的数据结构

         数据结构 - 索引怎么选择合适的数据结构?中分析过能作为索引的数据结构主要有散列表(Hash表)、红黑树、跳表、B+树(B树)以及有序数组,并且分析了它们适合场景。Mysql的索引与存储引擎相关,但是Mysql内常用的存储引擎有InnoDB、MyiSAM、Memory,在Mysql5.5版本后,InnoDB已经作为默认的存储引擎,并且很多互联网公司基本都要求只能使用InnoDB存储引擎。Memory作为临时表的默认存储引擎,所以研究的重点基本就是InnodDB和Memory引擎,也就是基本关注B+树和散列表的数据结构索引。他们底层支持的数据结构如下图:

        InnoDB存储引擎本身只支持B+树,之前分析过B+树比较适合磁盘存储。B+树是多路平衡搜索树,最佳实践N值为1200左右,树高为4时就可存储 1200的3次方,此时已经存储了17亿数据了。由于第一层数据总是在内存中,那么相当于17亿数据,最多查询磁盘3次,如果第二层刚好也在内存中,那么对多查询2次磁盘。也就是说InnoDB的最底层数据结构是B+树,B+树可能存储在内存中可能存储在磁盘中,存储的单元是数据页(操作系统数据缓存页),即数据缓存页是内存和磁盘的链接点。              磁盘 -> 数据页 -> 内存 

        而查询数据所在的行到达在内存中还是在磁盘中,由服务器所在的 InnoDB缓存页大小决定,Buffer Pool由 my.cnf配置中的参数控制:

         innodb_buffer_pool_size:引擎的缓存池大小,一般为物理内存的 60% - 80%;

         innodb_buffer_pool_instances:IBP(InnoDB Buffer Pool)的个数,Linux系统,如果 innodb_buffer_pool_size 大小超过 1GB,innodb_buffer_pool_instances 值就默认为 8;否则,默认为 1;

        缓存的大小有限,那么只能将数据命中率最高的放入缓存中,Mysql使用的LRU缓存淘汰算法。LRU可以理解成一个链表,链表的节点就是数据缓存页,刚被访问过的放到链表一头,最老被访问过的放到一头,当有新的数据缓存页被访问加入时,从最老的一头淘汰。但是链表本身删除节点的时间复杂度是O(1),但是访问时间复杂度是O(N),性能很低。怎么才能提高访问性能呢? 一般会使用散列表进行访问,即整个LRU由散列表+双向链表组成,类似于Java中的LinkedHashMap的数据结构。

        由于磁盘局部性原理,访问数据页时有预读数据页的功能,即我们从磁盘中获取到了多余的数据页,加入LRU的话就是浪费存储空间。还有我们可能会(处理报表等sql)对一个历史数据表进行整表分页全表查询一遍,那么也会对LRU照成冲击,可能需要很长的时间才能让缓存命中率恢复。针对预读数据页和冷数据扫描的情况,Mysql对LRU进行了改造,将LRU链分成 5/8的young区和 3/8的old区。当数据需要淘汰时直接从old区的末尾开始,而当新访问数据页时先判断在缓存中是否存在,如果不存在则直接将数据添加到old区,否则当满足下面配置时才会真正移动到young区域:    innodb_old_blocks_time:mysql缓存页使用的LRU,old区升级为young区的时间判断。默认值1000,单位毫秒;

        而对于数据库而言,数据页或者数据行本身的存储结构如下图  表空间 -> 段(叶子点段、非叶子点段、回滚段)-> 区 -> 页 -> 行

        表空间:数据库由一个或者多个表空间组成;表是一个逻辑容器,表空间存储的对象是段,在一个表空间中有一个或者多个段,但是一个段只能属于一个表空间,如上图。

        段:段由一个或者多个区组成,段不要求区与区之间相邻,当创建数据库或者索引时就会创建相应的段。

        区:在InnoDB中,一个区会分配64个连续的页。

        页:默认大小是16KB

     

    InnoDB主键索引和二级索引

        InnoDB索引由B+树构成,B+树由非叶子节点和叶子节点组成。非叶子节点不存储数据,而叶子节点存储数据。InnoDB中主键索引叶子节点存储的是整个表的行数据信息,称为聚簇索引,而非主键索引(也叫二级索引)的叶子节点存储的是主键的值(内存地址、指针)。

        如果我们在表上为非主键创建索引时,相当于是维护了一棵二级索引的B+树,经过优化器判断后知道要查找该二级索引B+树。该B+树的非叶子节点存储的是索引字段的值,叶子节点存储的是主键索引B+树的值,查询过程就是两棵B+树(两次时间复杂度为O(logN)的查询过程)。二级索引的根据主键id到主键索引上的查询过程叫做回表

        如果是根据主键id查询那么就是直接查询主键B+树,时间复杂度是O(logN)。

        如果查询的字段没有索引,那么就是在主键的B+树上,进行树的遍历匹配值过程,时间复杂度是O(N)。

     

    复合索引(一棵B+树过滤过个条件)

        覆盖索引就是将一个表的多个字段创建同一个索引,即在B+树上非叶子节点上存储的就是多个有序字段的值。有序就是最左原则,也是面试的高频点。创建语句:

    ALTER TABLE 表名称 ADD INDEX idx_索引名称 (字段1, 字段2, 字段N);

       关于复合索引经常的面试题就是(最左原则),那是因为在B+树上,每个节点都是基于创建索引时的有序字段,只要理解了复合索引的B+树就理解的最左:

       在表中创建了一个复合索引 A,B,C,下面哪些查询条件可以使用索引(如 where A = ? and B = ?and C = ?):

       A,B,C  可以走索引

       AB       可以走索引

       A          可以走索引

       BC       不能走索引

       AC       不能走索引

       CBA     可以走索引,因为在优化器阶段,可以将查询条件顺序调整为:ABC

     

    覆盖索引(不用回标)

       上面的使用二级索引再查询主键索引时涉及到了回标的操作,如果查询的条数比较很多,查询的字段也比较多,那么回标操作的代价就比较大。如果查询的字段以及在二级索引中(二级索引中包含了主键ID),那么就没有必要进行回表,称为覆盖索引。所以一般要求我们在写select语句时不要使用select * ,因为这种情况肯定是不能走覆盖索引的。并且覆盖索引往往伴随着复合索引,因为我们一般查询的字段不止 单索引字段和主键。

     

    索引下推(减少回表次数)

        比如一张表有 name 和 age 两个字段的复合索引,当我们执行查询条件 where name = “XXX” and age = ‘XX’ and ... 时,在Mysql 5.6的版本中,在复合索引的中匹配到了 name字段值后,则会直接到主键索引上去根据age字段值进行过滤。而在Mysql 5.6之后,在满足了name字段的值后,会继续在复合索引上根据age 字段的值进行过滤,满足条件再回表,减少回表的次数,称为 索引下推(Index Condition PushDown)

    前缀索引(长字符串索引优化)

        添加索引时使用 alter table t add index indexName(字段名),默认为全字段索引。但是如果索引的字段为字符串,并且字符长度非常大,比如长度为 100等,那么建立的全字段索引将是一棵非常庞大的B+树。此时,如果字符串的区分度非常大,比如字符串前N位就可以排除大部分的数据,那么我们就可以为该字段建立一个前缀索引。 如:alter table t add index indexName(email(8))

        只是创建前缀索引,如果该字段的字符串只有 5位,而索引的是前 8位,前缀索引本身也不知道是不是真正的全字段信息了,那么就会执行回表操作(即回表操作一定会执行),获取整个字段的信息。所以,使用了前缀索引,一定不可能是覆盖索引。

        由于数据是变动的,并且我们自己根据业务不能完全推断出建立多长的前缀索引是最优的,那么我们根据自己能接受的最大区分度,比如 5%,执行查询操作如下:

    select 
        count(distinct left(email,4))as L4,
        count(distinct left(email,5))as L5,
        count(distinct left(email,6))as L6,
        count(distinct left(email,7))as L7,
    from t;

    前缀索引的优化操作:

    1)、倒序

        如果前面的区分度不够大,而后面的区分度比较大,此时我们可以 对该字段进行排序的存、查询操作,比如身份证前面的区分度很低。reverse的过程可以在数据库中处理,也可以在java中先处理好

    insert into t(。。。id_card)values(。。。reverse(id_card字段值));

    select * from t  where id_card = reverse(id_card字段值);

    2)、增加hash字段

        利用散列函数,增加一个hash值 字段,只是需要去均衡增加字段的代价和长字符串索引的代价【如果字符串本身非常长,又要基于精确查询】。

    alter table t add id_card_crc int unsigned, add index(id_card_crc);

    select field_list from t where id_card_crc=crc32('id_card字段值') and id_card='id_card字段值'   // 使用crc函数处理值的插入、查询

     

        以上两种对前缀索引的改造方案,都只支持精确查找,好处就是节约了空间,节省了扫描的行数。

        从占用的额外空间来看,倒序存储方式在主键索引上,不会消耗额外的存储空间,而 hash 字段方法需要增加一个字段。当然,倒序存储方式使用 4 个字节的前缀长度应该是不够的,如果再长一点,这个消耗跟额外这个 hash 字段也差不多抵消了。在 CPU 消耗方面,倒序方式每次写和读的时候,都需要额外调用一次 reverse 函数,而 hash 字段的方式需要额外调用一次 crc32() 函数。如果只从这两个函数的计算复杂度来看的话,reverse 函数额外消耗的 CPU 资源会更小些。从查询效率上看,使用 hash 字段方式的查询性能相对更稳定一些。因为 crc32 算出来的值虽然有冲突的概率,但是概率非常小,可以认为每次查询的平均扫描行数接近 1。而倒序存储方式毕竟还是用的前缀索引的方式,也就是说还是会增加扫描行数。

     

     

    展开全文
  • mysql复合索引、普通索引学习总结复合索引 复合索引 CREATE TABLE `my_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_name` varchar(13) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '名称', `user_...

    mysql复合索引、普通索引

    复合索引

    CREATE TABLE `my_test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `user_name` varchar(13) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '名称',
      `user_phone` varchar(13) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户手机号',
      `user_age` varchar(13) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户年龄',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    
    --- 建立复合索引
    
    ALTER TABLE `cdqypt`.`my_test` ADD KEY `idx_phone_name_age` (`user_phone`, `user_name`, `user_age`); 
    

    关于复合索引
    Mysql从左到右的使用索引中的字段,一个查询可以索引的一部分或多部分,但只能是最左侧部分开始。例如索引ADD KEY idx_phone_name_age (user_phone, user_name, user_age),从左边开始那么就只有5种情况(user_phone), (user_phone,user_name),(user_phone,user_age),(user_phone,user_age,user_name),( user_phone,user_name,user_age)

    索引成功的情况

    EXPLAIN SELECT * FROM `my_test` t1 WHERE t1.`user_phone` = '15555555555';
    EXPLAIN SELECT * FROM `my_test` t1 WHERE t1.`user_phone` = '15555555555' AND t1.`user_age` = 7;
    EXPLAIN SELECT * FROM `my_test` t1 WHERE t1.`user_phone` = '15555555555' AND t1.`user_name` = '小王';
    EXPLAIN SELECT * FROM `my_test` t1 WHERE t1.`user_phone` = '15555555555' AND t1.`user_name` = '小王' AND t1.`user_age`=7;
    EXPLAIN SELECT * FROM `my_test` t1 WHERE t1.`user_phone` = '15555555555' AND t1.`user_age` = 7 AND t1.`user_name` = '小王';
    

    索引失败的情况

    EXPLAIN SELECT * FROM `my_test` t1 WHERE t1.`user_age` = 7 AND t1.`user_name` = '小王';
    EXPLAIN SELECT * FROM `my_test` t1 WHERE  t1.`user_name` = '小王' AND t1.`user_age` = 7 ;
    

    覆盖索引

    当sql语句的所求查询字段(select列)和查询条件字段(where子句)全都包含在一个索引中 (联合索引),可以直接使用索引查询而不需要回表。这就是覆盖索引,通过使用覆盖索引,可以减少搜索树的次数,这就是覆盖索引

    EXPLAIN SELECT `id`, `user_name`, `user_phone`, `user_age`, `grade` FROM `my_test`
    

    在这里插入图片描述
    我们发现type是all,key也是null

    EXPLAIN SELECT `user_name`, `user_phone`, `user_age` FROM `my_test` 
    

    在这里插入图片描述
    同样是查询全表,但是此刻type是index,key也用上了索引,还有发现之前的extra是null,这时已经变为了Using index,而出现Using index说明我们的sql成功的用上了覆盖索引

     EXPLAIN SELECT `user_name`, `user_phone`, `user_age` FROM `my_test` WHERE grade='111' 
    

    在这里插入图片描述
    虽然是select 查询全部用上了索引字段,但是where条件并没有使用索引字段,导致查询type还是all

    EXPLAIN SELECT `user_name`, `user_phone`, `user_age` FROM `my_test` WHERE user_age=111
    

    在这里插入图片描述
    虽然复合索引的左边是user_phone,所以我们这里的user_age=111这里是不会触发索引,但是我们发现key还是用上了索引,这是因为select的字段和where的字段都在索引列里,符合覆盖索引的条件
    最后页出现了Using index,说明的确是触发了覆盖索引

    普通索引

    删除复合索引,建立idx_phone索引

    ALTER TABLE `cdqypt`.`my_test` DROP INDEX `idx_phone_name_age`; 
    ALTER TABLE `cdqypt`.`my_test` ADD KEY `idx_phone` (`user_phone`); 
    
    EXPLAIN SELECT `user_name`, `user_phone`, `user_age` FROM `my_test` WHERE user_phone ='17777777777'
    

    在这里插入图片描述我们在where后面跟上索引发现能成功的触发索引,但注意如何发生了隐式的类型装换,那么就会导致索引失效

    EXPLAIN SELECT `user_name`, `user_phone`, `user_age` FROM `my_test` WHERE user_phone =17777777777
    

    在这里插入图片描述
    我们发现type变成了null,key也是null了,是因为我们的user_phone是varchar类型,我们where的时候是int类型的177…,这时候mysql会去执行类型装换导致索引失效

    唯一索引

    删除普通索引,创建唯一索引

    ALTER TABLE `cdqypt`.`my_test` DROP INDEX `idx_phone`; 
    ALTER TABLE `cdqypt`.`my_test` ADD UNIQUE INDEX `idx_user_phone` (`user_phone`); 
    

    在这里插入图片描述

    查看表数据,这时候我们再去插入一个user_phone=17777777777的用户试试看

    INSERT INTO `my_test` ( `user_name`, `user_phone`, `user_age`, `grade` ) VALUES ( '小米', '17777777777', 18, '高三' ); 
    

    在这里插入图片描述
    我们发现这是时报错了,是因为user_phone字段已经有17777777777这个号码了,因为得唯一所以就没办法再插入了,我们可以试试其他字段

    INSERT INTO `my_test` ( `user_name`, `user_phone`, `user_age`, `grade` ) VALUES ( '小吴', '17777777778', 18, '高三' );
    
    

    这是我们再来一个小吴
    在这里插入图片描述
    很轻松的就插入成功了,同时也有2个小吴同学了
    在这里插入图片描述

    在许多场合,创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。

    展开全文
  • 今天一位小伙伴问我关于SQL查询效率以及索引的东西。 我说只要尽量命中索引即可。特别是聚集索引。思前想后,好像总有什么...两个或更多列上的索引就被称作复合索引。 最近在做某酒店的项目。拿这个举个例子: Order表
    今天一位小伙伴问我关于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)
                                                                                                                                    --一般查询订单会同时将联系人查询出来



    展开全文
  • 创建一个复合索引 使用explain语句进行查询解释:只使用了name索引 explain语句进行查询解释:也是只使用了name索引 explain语句进行解释查询:复合前导列特性,没有使用dept索引 覆盖索引 什么是覆盖索引?...
  • 1.复合索引 要想理解复合索引就需要理解复合索引的B+树存储结构: 错误的b+树存储结构如下:
  • 「数据库」和「数据库索引」这两个东西是在服务器端开发领域应用最为广泛的两个概念,熟练使用数据库和数据库索引是开发人员在行业内生存的必备技能 使用索引很简单,只要能写创建表的语句,就肯定能写创建索引的...
  • 复合索引

    2013-05-22 17:33:40
    复合索引 概要 什么是单一索引,什么又是复合索引呢? 何时新建复合索引复合索引又需要注意些什么呢...复合索引的创建方法创建单一索引的方法完全一样。但复合索引在数据库操作期间所需的开销更小,可以代替多个...
  • SQL server 覆盖索引复合索引的区别

    千次阅读 2019-07-22 10:55:03
    覆盖索引 所谓的包含列就是包含在非聚集索引中,并且不是索引列中的列。或者说的更通俗一点就是:把一些底层数据表的数据列包含在非聚集索引的索引页中,而这些数据列又不是索引列,那么这些列就是包含列。同时,...
  • 单支索引与复合索引

    2021-01-05 18:56:02
    复合索引: 用户可以在多个列上建立索引,这种索引叫做复合索引。 同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为1-2列的索引,宽索引也就是索引列超过2列的索引; 设计索引的一个重要原则就是能用窄索引不用宽...
  • mysql复合索引与普通索引总结

    千次阅读 2015-09-07 02:10:19
    mysql复合索引、普通索引总结  2013-11-18 14:03:13| 分类: mysql | 标签: |举报 |字号大中小 订阅         用微信 “扫一扫” 将文章分享到朋友圈。  
  • MSSQL SERVER 覆盖索引复合索引的区别 ,如题,求大神指点 执行计划里面,出现的都是 INDEX SEEK。有点迷茫
  • 用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引); 复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引; 同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为1-2列的索引,宽索引也就是索引...
  • mysql复合索引

    千次阅读 2019-01-20 21:31:23
    问题:MYSQL INNodb建立复合索引 a,b,c;那么 查询条件 where a =xxx and c= xxx 能用到索引嘛? 回答:可以。 概念: 单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上; 用户可以在多个列上建立...
  • 复合索引生效

    2015-04-14 21:24:36
    [size=medium][color=blue]SQL Server的复合索引学习【转载】 概要 什么是单一索引,什么又是复合索引呢? 何时新建复合索引复合索引又需要注意些什么呢?本篇文章主要是对网上一些讨论的总结。 一.概念 ...
  • 教你创建Oracle复合索引(精)

    万次阅读 2018-11-13 20:43:39
    什么是复合索引复合索引顾名思义,区别于单列索引,是由两个或多个列一起构成的索引。其在B树上的数据结构是什么样?如下图,是一个包含两列的复合索引。 如果你观察仔细,还会发现它的叶子节点是ASC递增排序的...
  • 覆盖索引

    2019-08-08 16:41:20
    覆盖索引 覆盖索引(covering index)指只需要从辅助索引中就可以得到查询记录,而不需要查询聚集索引中的记录。使用覆盖索引的一个好处是辅助索引不包含整行记录的所有信息,故其大小远小于聚集索引,因此可以减少...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,968
精华内容 10,387
关键字:

复合索引与覆盖索引