精华内容
下载资源
问答
  • 一、覆盖索引 1.1 概念 索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引。 1.2...

    1、覆盖索引

    1.1 概念

    索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引。

    1.2 判断标准

    使用explain,可以通过输出的extra列来判断,对于一个索引覆盖查询,显示为using index,MySQL查询优化器在执行查询前会决定是否有索引覆盖查询

    1.3 注意

    不是所有类型的索引都可以成为覆盖索引。覆盖索引必须要存储索引的列,而哈希索引、空间索引和全文索引等都不存储索引列的值,所以MySQL只能使用B+Tree索引做覆盖索引
    不同的存储引擎实现覆盖索引都是不同的,并不是所有的存储引擎都支持它们

    1.4 优点

    覆盖索引是一种非常强大的工具,能大大提高查询性能,只需要读取索引而不用读取数据有以下一些优点
    1、索引项通常比记录要小,所以MySQL访问更少的数据
    2、索引都按值的大小顺序存储,相对于随机访问记录,需要更少的I/O
    3、大多数据引擎能更好的缓存索引,比如MyISAM只缓存索引
    4、覆盖索引对于InnoDB表尤其有用,因为InnoDB使用聚集索引组织数据,如果二级索引中包含查询所需的数据,就不再需要在聚集索引中查找了

    2、最左前缀原则

    mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先,如:
    字段有3列,a,b,c,建立索引:idx_a_b_c
    则生效的查询条件有:

    1. a =x
    2. a =x and b=y 或者(b =y and a=x,即顺序不影响,SQL优化器会自动处理,以下同理)
    3. a =x and c =y
    4. a=x and b=y and c=z

    3、索引下推

    “索引条件下推”,称为 Index Condition Pushdown (ICP)是mysql中一个常用的优化,尤其是当mysql需要从一张表里检索数据时。 如果没有ICP,存储引擎将会根据WHERE子句的条件遍历整个表单数据,然后返回给mysql服务器。启用ICP,如果可以通过使用索引的列来满足WHERE条件,MySQL服务器将WHERE条件的这部分推送到存储引擎。然后,存储引擎通过使用索引来确定推送的条件,并且通过这样的方式从表中读取行。 ICP可以减少存储引擎必须访问基础表的次数以及MySQL服务器必须访问存储引擎的次数。

    不使用ICP的查询SQL流程图
    在这里插入图片描述

    过程解释
    ①:MySQL Server发出读取数据的命令,这是在执行器中执行如下代码段,通过函数指针和handle接口调用存储引擎的索引读或全表表读。此处进行的是索引读。
    if (in_first_read)
    {
    in_first_read= false;
    error= (*qep_tab->read_first_record)(qep_tab); //设定合适的读取函数,如设定索引读函数/全表扫描函数
    }
    else
    error= info->read_record(info);

    ②、③:进入存储引擎,读取索引树,在索引树上查找,把满足条件的(经过查找,红色的满足)从表记录中读出(步骤④,通常有IO),从存储引擎返回⑤标识的结果。此处,不仅要在索引行进行索引读取(通常是内存中,速度快。步骤③),还要进行进行步骤④,通常有IO。

    ⑥:从存储引擎返回查找到的多条元组给MySQL Server,MySQL Server在⑦得到较多的元组。

    ⑦–⑧:⑦到⑧依据WHERE子句条件进行过滤,得到满足条件的元组。注意在MySQL Server层得到较多元组,然后才过滤,最终得到的是少量的、符合条件的元组。

    使用ICP的查询SQL流程图
    在这里插入图片描述
    过程解释
    ①:MySQL Server发出读取数据的命令,过程同图一。

    ②、③:进入存储引擎,读取索引树,在索引树上查找,把满足已经下推的条件的(经过查找,红色的满足)从表记录中读出(步骤④,通常有IO),从存储引擎返回⑤标识的结果。此处,不仅要在索引行进行索引读取(通常是内存中,速度快。步骤③),还要在③这个阶段依据下推的条件进行进行判断,不满足条件的,不去读取表中的数据,直接在索引树上进行下一个索引项的判断,直到有满足条件的,才进行步骤④,这样,较没有ICP的方式,IO量减少。

    ⑥:从存储引擎返回查找到的少量元组给MySQL Server,MySQL Server在⑦得到少量的元组。因此比较图一无ICP的方式,返回给MySQL Server层的即是少量的、符合条件的元组。

    另外,图中的部件层次关系,不再进行解释。

    展开全文
  • 上一节我们讲解了聚集索引和非聚集索引的区别(索引知识系列一:聚集索引与非索引详解 ),我们知道非聚集索引在查询过程中有回表的过程,这就造成了效率的下降。那如何不用回表或者减少回表以提高查询速度呢?这...

    一、前言

    上一节我们讲解了聚集索引和非聚集索引的区别(索引知识系列一:聚集索引与非索引详解 ),我们知道非聚集索引在查询过程中有回表的过程,这就造成了效率的下降。那如何不用回表或者减少回表以提高查询速度呢?这就是本章要讲的内容。

    二、联合索引

    联合索引(也叫组合索引、复合索引、多列索引)是指对表上的多个列进行索引。联合索引的创建方法跟单个索引的创建方法一样,不同之处仅在于有多个索引列。

    开讲之前我们先弄一张学生表,表数据如下:
    在这里插入图片描述
    下面我们给出一个需求:查询表中以字母"L"开头的姓名及年龄。

    1、常规的写法(回表查询)

    SELECT name,age FROM `t_user` where name like 'l%' ;
    

    这种写法,明显效率是低下的,我们用explain 分析一下:
    在这里插入图片描述
    由图中可以看出,在数据库中进行了全表扫描。下面我们看一下数据库中的执行过程。

    第一步:全表扫描数据,找出以“l”开头的主键id.
    第二步:将所有查询出来的数据每一个都回表,根据id来查询出想要的数据。
    

    2.优化写法(索引覆盖)
    因为我们要查询name和age。所以,我们对name和age建立了联合索引,建立后的索引图如下:
    在这里插入图片描述
    从图中我们可以看出,叶子节点中的键值都是按顺序存储的并且都包含了名字和年龄,即(“Ann”,36)、(“HanMeimei”,17)、(“Kate”,17)、(“LiLei”,18)、(“Lili”,16)、(“Lisa”,19)、(“Lucy”,17)、(“WeiHua”,32)、(“ZhangWei”,18)、(“ZhangWei”,25)。

    索引会先根据 name 排序,如果 name 相同,再根据 age 进行排序。

    我们对name和age建立索引后,当我们查询name和age二个字段时,直接会从索引中查出来而不需要回表查询,这种方式就是索引覆盖。执行步骤是这样的:

    第一步:使用联合索引(name,age)查询以“l”开头的数据
    第二步:在索引中取出name和age.
    

    这种方式是不是高效多了,你要是还不信,我们用explain看一下,如下图:

    EXPLAIN SELECT name,age FROM `t_user` where name like 'l%' ;
    

    在这里插入图片描述
    从图中我们看的出,使用了(name,age)索引。

    2.1 联合索引最左匹配原则

    联合索引在使用的时候一定要注意顺序,一定要注意符合最左匹配原则。

    最左匹配原则:在通过联合索引检索数据时,从索引中最左边的列开始,一直向右匹配,如果遇到范围查询(>、<、between、like等),就停止后边的匹配。

    这个定义不太好理解,我解释一下:

    假如对字段 (a, b, c) 建立联合索引,现在有这样一条查询语句:

    where a > xxx and b=yyy and c=zzz
    where a like 'xxx%' and b=yyy and c=zzz
    

    在这个条件语句中,只有a用到了索引,后面的b,c就不会用到索引。这就是“如果遇到范围查询(>、<、between、like等),就停止后边的匹配。”的意思。

    我们还是假如对字段 (a, b, c) 建立联合索引,

    1.如下查询语句可以使用到索引:

    where a = xxx
    where a = xxx and b = xxx
    where a = xxx and b = xxx and c = xxx
    where a like 'xxx%'
    where a > xxx
    where a = xxx order by b
    where a = xxx and b = xxx order by c group by a
    

    2.如下查询条件也会使用索引:

    where b = xxx and a = xxx
    where a = xxx and c = xxx and b = xxx
    

    虽然b和a的顺序换了,但是mysql中的优化器会帮助我们调整顺序。

    3.如下查询条件只用到联合索引的一部分:

    where a = xxx and c = xxx   可以用到 a 列的索引,用不到 c 列索引。
    where a like 'xxx%' and b = xxx 可以用到 a 列的索引,用不到 b 列的索引。
    where a > xxx and b = xxx 可以用到 a 列的索引,用不到 b 列的索引。
    

    4.如下查询条件完全用不到索引

    where b = xxx
    where c = xxx
    where a like '%xxx'			-- 不满足最左前缀
    where d = xxx order by a	-- 出现非排序使用到的索引列 d 
    where a + 1 = xxx	-- 使用函数、运算表达式及类型隐式转换等
    

    如何选择合适的联合索引

    1.where a = xxx and b = xxx and c = xxx 如果我们的查询是这样的,建索引时,就可以考虑将选择性高的列放在索引的最前列,选择性低的放后边。

    2.如果是 where a > xxx and b = xxx 或 where a like ‘xxx%’ and b = xxx 这样的语句,可以对 (b, a) 建立索引。

    3.如果是 where a = xxx order by b 这样的语句,可以对 (a, b) 建立索引。

    三、索引覆盖

    索引覆盖在上面我们已经介绍了。由上面的介绍我们知道,建立了联合索引后,直接在索引中就可以得到查询结果,从而不需要回表查询聚簇索引中的行数据信息。

    索引覆盖可以带来很多的好处:

    • 辅助索引不包含行数据的所有信息,故其大小远小于聚簇索引,因此可以减少大量的IO操作。
    • 索引覆盖只需要扫描一次索引树,不需要回表扫描聚簇索引树,所以性能比回表查询要高。
    • 索引中列值是按顺序存储的,索引覆盖能避免范围查询回表带来的大量随机IO操作。 判断一条语句是否用到索引覆盖:

    这个我们需要用explain查看一下。
    在这里插入图片描述
    Using index 就表示使用到了索引 , 并且所取的数据完全在索引中就能拿到,也就是用到了索引覆盖。

    四、索引下推

    索引下推是索引下推是 MySQL 5.6 及以上版本上推出的,用于对查询进行优化。

    索引下推是把本应该在 server 层进行筛选的条件,下推到存储引擎层来进行筛选判断,这样能有效减少回表。

    举例说明:

    首先使用联合索引(name,age),现在有这样一个查询语句:

    select *  from t_user where name like 'L%' and age = 17;
    

    这条语句从最左匹配原则上来说是不符合的,原因在于只有name用的索引,但是age并没有用到。

    不用索引下推的执行过程:

    第一步:利用索引找出name带'L'的数据行:LiLei、Lili、Lisa、Lucy 这四条索引数据
    第二步:再根据这四条索引数据中的 id 值,逐一进行回表扫描,从聚簇索引中找到相应的行数据,将找到的行数据返回给 server 层。
    第三步:在server层判断age = 17,进行筛选,最终只留下 Lucy 用户的数据信息。
    

    使用索引下推的执行过程:

    第一步:利用索引找出name带'L'的数据行:LiLei、Lili、Lisa、Lucy 这四条索引数据
    第二步:根据 age = 17 这个条件,对四条索引数据进行判断筛选,最终只留下 Lucy 用户的数据信息。
    (注意:这一步不是直接进行回表操作,而是根据 age = 17 这个条件,对四条索引数据进行判断筛选)
    第三步:将符合条件的索引对应的 id 进行回表扫描,最终将找到的行数据返回给 server 层。
    

    比较二者的第二步我们发现,索引下推的方式极大的减少了回表次数。

    索引下推需要注意的情况:

    下推的前提是索引中有 age 列信息,如果是其它条件,如 gender = 0,这个即使下推下来也没用

    开启索引下推:

    索引下推是 MySQL 5.6 及以上版本上推出的,用于对查询进行优化。默认情况下,索引下推处于启用状态。我们可以使用如下命令来开启或关闭。

    set optimizer_switch='index_condition_pushdown=off'; 	-- 关闭索引下推
    set optimizer_switch='index_condition_pushdown=on';		-- 开启索引下
    

    五、结尾

    好了,本章就讲到这里吧,下一章,我们对所有的知识进行一下总结。

    另外大家帮忙关注我,每天更新优质内容。关注我有大量学习资料和学习视频赠送。
    在这里插入图片描述
    扫二维码关注公众号【Java程序员的奋斗路】可领取如下学习资料:
    1.1T视频教程(大约有100多个视频):涵盖Javaweb前后端教学视频、机器学习/人工智能教学视频、Linux系统教程视频、雅思考试视频教程,android.等
    2.项目源码:20个JavaWeb项目源码

    展开全文
  • 覆盖索引 在之前《mysql索引初识》这篇文章中提到过,mysql的innodb引擎通过搜索树方式实现索引,索引类型分为主键索引二级索引(非主键索引),主键索引树中,叶子结点保存着主键即对应行的全部数据;而二级索引...

    覆盖索引

    在之前《mysql索引初识》这篇文章中提到过,mysql的innodb引擎通过搜索树方式实现索引,索引类型分为主键索引和二级索引(非主键索引),主键索引树中,叶子结点保存着主键即对应行的全部数据;而二级索引树中,叶子结点保存着索引值和主键值,当使用二级索引进行查询时,需要进行回表操作。假如我们现在有如下表结构

    CREATE TABLE `user_table` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `username` varchar(255) NOT NULL,
      `password` varchar(255) DEFAULT NULL,
      `age` int(11) unsigned Not NULL,
      PRIMARY KEY (`id`),
      key (`username`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8
    

    执行语句(A) select id from user_table where username = 'lzs'时,因为username索引树的叶子结点上保存有username和id的值,所以通过username索引树查找到id后,我们就已经得到所需的数据了,这时候就不需要再去主键索引上继续查找了。
    执行语句(B) select password from user_table where username = 'lzs'时,流程如下

    1、username索引树上找到username=lzs对应的主键id
    2、通过回表在主键索引树上找到满足条件的数据

    由上面可知,当sql语句的所求查询字段(select列)和查询条件字段(where子句)全都包含在一个索引中,可以直接使用索引查询而不需要回表。这就是覆盖索引,通过使用覆盖索引,可以减少搜索树的次数,是常用的性能优化手段。
    例如上面的语句B是一个高频查询的语句,我们可以建立(username,password)的联合索引,这样,查询的时候就不需要再去回表操作了,可以提高查询效率。当然,添加索引是有维护代价的,所以添加时也要权衡一下。

    前缀索引

    mysql的b+树索引遵循“最左前缀”原则,继续以上面的例子来说明,为了提高语句B的执行速度,我们添加了一个联合索引(username,password),特别注意这个联合索引的顺序,如果我们颠倒下顺序改成(password,username),这样查询能使用这个索引吗?答案是不能的!这是最左前缀的第一层含义:联合索引的多个字段中,只有当查询条件为联合索引的一个字段时,查询才能使用该索引。
    现在,假设我们有一下三种查询情景:
    1、查出用户名的第一个字是“张”开头的人的密码。即查询条件子句为"where username like '张%'"
    2、查处用户名中含有“张”字的人的密码。即查询条件子句为"where username like '%张%'"
    3、查出用户名以“张”字结尾的人的密码。即查询条件子句为"where username like '%张'"

    以上三种情况下,只有第1种能够使用(username,password)联合索引来加快查询速度。这就是最左前缀的第二层含义:索引可以用于查询条件字段为索引字段,根据字段值最左若干个字符进行的模糊查询。

    维护索引需要代价,所以有时候我们可以利用“最左前缀”原则减少索引数量,上面的(username,password)索引,也可用于根据username查询age的情况。当然,使用这个索引去查询age的时候是需要进行回表的,当这个需求(根据username查询age)也是高频请求时,我们可以创建(username,password,age)联合索引,这样,我们需要维护的索引数量不变。

    创建索引时,我们也要考虑空间代价,使用较少的空间来创建索引
    假设我们现在不需要通过username查询password了,相反,经常需要通过username查询age或通过age查询username,这时候,删掉(username,password)索引后,我们需要创建新的索引,我们有两种选择
    1、(username,age)联合索引+age字段索引
    2、(age,username)联合索引+username单字段索引
    一般来说,username字段比age字段大的多,所以,我们应选择第一种,索引占用空间较小。

    索引下推

    对于user_table表,我们现在有(username,age)联合索引
    如果现在有一个需求,查出名称中以“张”开头且年龄小于等于10的用户信息,语句C如下:"select * from user_table where username like '张%' and age > 10".
    语句C有两种执行可能:
    1、根据(username,age)联合索引查询所有满足名称以“张”开头的索引,然后回表查询出相应的全行数据,然后再筛选出满足年龄小于等于10的用户数据。过程如下图。

     

    图片来自课程文章

     

    2、根据(username,age)联合索引查询所有满足名称以“张”开头的索引,然后直接再筛选出年龄小于等于10的索引,之后再回表查询全行数据。过程如下图。

     

    图片来自课程文章


    明显的,第二种方式需要回表查询的全行数据比较少,这就是mysql的索引下推。mysql默认启用索引下推,我们也可以通过修改系统变量optimizer_switch的index_condition_pushdown标志来控制

    SET optimizer_switch = 'index_condition_pushdown=off';
    
    • 注意点:
      1、innodb引擎的表,索引下推只能用于二级索引。

      就像之前提到的,innodb的主键索引树叶子结点上保存的是全行数据,所以这个时候索引下推并不会起到减少查询全行数据的效果。

      2、索引下推一般可用于所求查询字段(select列)不是/不全是联合索引的字段,查询条件为多条件查询且查询条件子句(where/order by)字段全是联合索引。

      假设表t有联合索引(a,b),下面语句可以使用索引下推提高效率
      select * from t where a > 2 and b > 10;

    展开全文
  • 1、回表 回表是针对普通索引来说的。比如员工表主键为id,name为普通索引。 select * from emp where name = '张三' 索引的执行过程为首先利用索引...2、覆盖索引 select id from emp where name=1 查找的列正好是

    1、回表

    回表是针对普通索引来说的。比如员工表主键为id,name为普通索引。

    select * from emp where name = '张三'

    索引的执行过程为首先利用索引name到b+tree索引的叶子节点找到主键索引id,主键索引id,在到b+tree上查找相应的数据。

    简单来说就是name的索引在B+tree上保存的数据是主键id。而主键id对应的b+tree的叶子节点保存的才是行数据。

    2、覆盖索引

    select id from emp where name=1

    查找的列正好是主键,就不需要去b+tree上查找,可直接返回

    3、最左匹配

    首先索引必须是组合索引。

    索引(name,age)select * from emp where age =1 不会走索引

    select * from emp where name='张三'  走索引

    因此合理的索引应该建立两个一个是(name,age)一个是age

    4、索引下推

    select * from emp where name =1 and age= 18

    是指在数据返回server的时候,数据引擎就讲name =1 和 age= 18的数据进行了过滤。在版本5.7之前的数据引擎先过滤掉name =1的数据返回,在server处过滤age=18的数据。相比较之前的返回,返回数据少,减少io

    展开全文
  • 1、覆盖索引:如果查询条件使用的是普通索引(或是联合索引的最左原则字段),查询结果是联合索引的字段或是主键,不用回表操作,直接返回结果,减少IO磁盘读写读取正行数据 2、最左前缀:联合索引的最左 N 个字段...
  • 索引下推(减少回表次数) 存储引擎与底层实现的数据结构 数据结构 - 索引怎么选择合适的数据结构?中分析过能作为索引的数据结构主要有散列表(Hash表)、红黑树、跳表、B+树(B树)以及有序数组,并且分析了它们...
  • 通俗的讲就是,如果索引的列在 select 所需获得的列中(因为在 mysql 中索引是根据索引列的值进行排序的,所以索引节点中存在该列中的部分值)或者根据一次索引查询就能获得记录就不需要回表,如果 select 所需获得...
  • 覆盖索引 在之前《mysql索引初识》这篇文章中提到过,mysql的innodb引擎通过搜索树方式实现索引,索引类型分为主键索引二级索引(非主键索引),主键索引树中,叶子结点保存着主键即对应行的全部数据;而二级索引...
  • 简单易懂的MySQL覆盖索引、前缀索引、索引下推

    千次阅读 多人点赞 2021-07-17 20:08:04
    文章目录前言聚集索引/非聚集索引 前言 聚集索引/非聚集索引
  • 今天看到一篇关于数据库优化和索引写的非常好的文章,分享一下.文章转载至:https://www.cnblogs.com/Leo_wl/p/13093705.html 一、前言 最近小农在找工作,因为今年疫情的特殊原因,导致工作不是特别好找,所以一旦...
  • MySQL回表、索引覆盖索引下推

    千次阅读 2020-06-09 00:55:00
    创建一张表,并创建一个自增主键索引和一个组合索引 1 2 3 4 5 6 7 8 9 10 CREATE TABLE index_opt_test ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(11) DEFAULT NULL, title varchar(11) DEFAULT NULL...
  • 索引覆盖 最左前缀 索引下推 索引覆盖 总结问题 什么是索引覆盖? 怎么用到索引覆盖 索引覆盖的情况,using index ; using index using where select * from T where k betwee 3 and 5 这条语句的执行流程是...
  • Mysql联合索引的使用索引下推覆盖索引概念 建立一张user表,id、name、age、address。建立联合索引(name,age)。 理解索引下推覆盖索引的概念首先要理解,联合索引的普通索引的区别。 比如(name, age) ...
  • 索引失效like 以%开头,索引失效组合索引,不是使用第一列索引,索引失效数据类型出现隐式转化,索引失效其它情况不推荐使用索引的情况覆盖索引组合索引最左匹配原则注意组合索引数据结构索引下推
  • 匹配原则、索引下推 1.创建一张表, 并插入记录 create table user( -> id int not null auto_increment, -> name char(16) not null, -> age int not null, -> primary key(id), # id 为主键并设置...
  • 回表: 假设现为name列建立索引,此时最后面的节点存放的是主键。...覆盖索引: select id from t_user;(此时就是覆盖索引) 因为叶子节点就存在id主键,不需要再从主键的B+树里获取数据,因此就没了回表的过...
  • 3. 索引下推优化? 总结: 最左原则在like中也可以加速检索。 Q: 这个问题蛮有意思的,在什么时候建立了联合索引(a,b)但是却需要单独建立一个冗余索引a呢? Q: 一个字段只有0/1怎么加快搜索? Q: 加入索引的...
  • 什么是“索引下推”?这种方法带来了什么好处? 通过两个alter 语句重建索引k,以及通过两个alter语句重建主键索引是否合理? round1:覆盖索引 查询数据时如何减少回表的次数? 回答这个问题前,我们要知道什么是回...
  • MySQL中的索引下推

    2021-02-03 03:17:31
    前段时间看了一下数据库相关知识,出现了索引下推这个名词,有必要记录下来作为知识储备。索引下推用一句话总结是:索引下推是数据库检索数据过程中为减少回表次数而做的优化。首先介绍下什么是数据库回表,回表是一...
  • 我们也可以同时以多个列的大小作为排序规则,也就是同时为多个列建立索引,比方说我们想让B+树按照c2c3列的大小进行排序,这个包含两层含义: 先把各个记录页按照c2列进行排序。 在记录的c2列相同的情况,...
  • 因为idx_name_age索引的叶子节点存的值为主键值,name值age值,所以从idx_name_age索引上就能获取到所需要的列值,不需要回表,即索引覆盖 索引下推 当执行如下语句的时候 select * from student where name like...
  • innodb的索引下推

    万次阅读 2020-08-25 16:32:18
    索引下推,是mysql优化多列索引查询的一种方案,叫做索引下推不如翻译为索引条件下更合适(Index Condition Pushdown)简称ICP,因为他实际上是把where中的查询索引条件,下给了存储引擎 本文涉及到的内容有: ...
  • 索引类型索引类型分为主键索引和非主键索引。(一定要牢记,是怎么存储数据的)主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。非主键索引的叶子节点内容是主键的值。...
  • 什么是聚簇索引:将数据和索引储存在一起,节点储存索引,叶子节点储存数据 普通索引:节点储存普通索引,叶子节点储存聚簇索引 聚簇索引的选取: 用主键作为聚簇索引 如果没有主键,那么选取第一个具有唯一...
  • 2 索引覆盖 要查询的数据就是索引 3最左匹配 1 2 4 会用到索引,3不会 4 索引下推 原来有server 层对数据进行过滤,索引下推以后,变成存储引擎层进行数据过滤了,数据库默认是开启的。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,341
精华内容 12,936
关键字:

索引下推和覆盖索引