“高效索引技巧:索引的分类,MySQL索引的使用,最左匹配原则,回表查询,如何避免回表,索引下推,创建索引注意事项“

索引

Mysql索引的分类

1、普通索引 和 唯一索引

普通索引:MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值
唯一索引:要求索引列的值必须唯一,但允许有空值
如果是组合索引,则列值的组合必须唯一
主键索引是一种特殊的唯一索引,不允许有空值

2、单列索引 和 组合索引

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

3、全文索引

全文索引的类型为fulltext
在定义索引的 列上支持值的全文查找,允许在这些索引列中插入 重复值和空值
全文索引可以在char、varchar 和 text 类型的列上创建

4、空间索引

空间索引 是对 空间数据类型 的字段 建立的索引
MySQL中的空间数据类型有4种,分别是 Geometry、Point、Linestring 和 Polygon
MySQL 使用 Spatial 关键字进行扩展,使得能够用创建正规索引类似的语法创建空间索引
创建空间索引的列,不允许为空值,且只能在 MyISAM 的表中创建。

5、前缀索引

在 char、varchar 和 text 类型的 列 上创建索引时,可以指定索引 列的长度

MySQL索引的使用

1. 普通索引 添加INDEX

ALTER TABLE table_name ADD INDEX index_name ( column )

2. 主键索引 添加PRIMARY KEY

ALTER TABLE table_name ADD PRIMARY KEY ( column )

3. 唯一索引 添加UNIQUE

ALTER TABLE table_name ADD UNIQUE ( column )

4. 全文索引 添加FULLTEXT

ALTER TABLE table_name ADD FULLTEXT ( column )

5. 添加多列索引

ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 )

6. 删除索引

DROP index index_name on table_name;``

7. 查看索引

SHOW INDEX FROM table_name;

最左匹配原则

最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。
全列匹配时:
student表:

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `gid` int(11) NOT NULL,
  `cid` int(11) DEFAULT NULL,
  `uid` int(11) DEFAULT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uni_Gid_Cid_SId` (`gid`,`cid`,`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

结论:修改查询列顺序,发现结果一样。是因为MySQL会通过优化器,自动优化索引顺序。

#ALTER TABLE index user_index on user(name,sex,age)
#可以使用复合索引:索引中包含的最左侧字段,只是顺序不正确,在执行的时候可以动态调整为最前左缀,下列执行计划type为ref
select * from user where sex = ? and age = ? and name = ?
select * from user where age = ? and name = ?

#不可以使用复合索引:因为缺少左侧字段
select * from user where sex = ? and age = ? 
select * from user where age = ?
select * from user where sex = ? 
#当缺少左侧字段时,不使用*,使用具体需要的复合索引字段时 依旧会走索引 此时执行计划的type为index
select name,sex,age from user where sex = ? and age = ?

最左缀原则可以通过跳跃扫描的方式打破简单整理一下这方面的知识
这个是在 8.0 进行的优化
MySQL8.0版本开始增加了索引跳跃扫描的功能,当第一列索引的唯一值较少时,即使where条件没有第一列索引,查询的时候也可以用到联合索引。 比如我们使用的联合索引是 bcd 但是b中字段比较少 我们在使用联合索引的时候没有 使用 b 但是依然可以使用联合索引 MySQL联合索引有时候遵循最左前缀匹配原则,有时候不遵循。

回表查询

这先要从InnoDB的索引实现说起,InnoDB有两大类索引:

  • 聚集索引(clustered index)
  • 普通索引(secondary index)

InnoDB聚集索引和普通索引的差异:

InnoDB聚集索引的叶子节点存储了行记录,因此, InnoDB必须要有,且只有一个聚集索引

  1. 如果表定义了PK,则PK就是聚集索引
  2. 如果表没有定义PK,则第一个not NULL unique列是聚集索引;
  3. 否则,InnoDB会创建一个隐藏的row-id作为聚集索引;
    InnoDB普通索引的叶子节点存储主键值。

聚集索引和普通索引数据结构都是一颗 b+树,其特点是所有数据都存放在叶子节点中,并且叶子节点之间有指针指向。

举个栗子,不妨设有表:
t(id PK, name KEY, sex, flag);
id是聚集索引,name是普通索引。
表中有四条记录:

1, shenjian, m, A
3, zhangsan, m, A
5, lisi, m, A
9, wangwu, f, B

该聚集索引和普通索引如图:
[图片]

当通过普通索引去查找数据时,如果有除该索引外的其他列字段,则会去聚集索引处查找
select * from t where name='lisi'; # 该语句执行流程如下图
在这里插入图片描述

这就是所谓的回表查询,先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。

如何避免回表

可以使用覆盖索引,举个例子:现有User表

CREATE TABLE `user`
(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name`  int(11)     DEFAULT NULL,
  `sex`  char(3)     DEFAULT NULL,
  `address`  varchar(10) DEFAULT NULL,
  `hobby`  varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  KEY `i_name` (`name`)
) ENGINE = InnoDB;

有一个场景,需要经常查询name和sex
select id,name,sex from user where name = ‘zhangsan’;
这个语句在业务上经常需要用到,而user表中的其他字段使用率远远小于这几个字段。在这个情况下,如果我们在建立name字段的索引时,不是使用单一索引,而是使用 联合索引(name,sex)。这样的话再执行这个查询语句,根据这个辅助索引(name,sex)查询到的结果就包括了我们所需要的查询结果的所有字段的完整数据。

索引下推

这个是在MySQL 5.6 之后提供的特性
假设 我我们需要查询 select * from table1 where b like ‘3%’ and c = 3.
索引字段为index(b,c)
5.6 之前

  • 先通过 联合索引 查询到 开头为 3 的数据 然后拿到主键(上图中青色块为主键)
  • 然后通过主键去主键索引里面去回表查询 二级索引里面查询出来几个 3 开头的就回表几次

5.6 之后

  • 先通过 二级索引 查询到开头为 3 的数据 然后 再找到 c = 3 的数据进行过滤 之后拿到主键
  • 通过主键进行回表查询
    上面都会进行回表查询但是 5.6 之前没有完全去利用 二级缓存进行数据过滤 如果 3 开头的数据非常多 那就要一直回表 但是 5.6 之后去利用后续索引字段进行查询
    怎么说呢 就是为什么索引下推要和联合索引进行使用 普通所以没有 索引下推就是充分利用 联合索引的字段进过滤 尽量减少需要回表的数据 来增加查询效率 感觉思路是很简单的

如何避免索引失效

  • 使用组合索引时,遵循 最左匹配 原则
  • 不在索引列上进行任何操作,如:计算、函数、类型转换
  • 尽量使用覆盖索引
  • 索引列 尽量不使用 不等于(!= / <>)条件、通配符开头的模糊查询(like %abc)、or 作为连接条件
  • 字符串加单引号(不加可能会发生索引列的隐式转换,导致索引失效)

explain各列作用

在这里插入图片描述
在这里插入图片描述

(1)id:反映的是表的读取顺序或查询中执行select子句的顺序。
① id相同,执行顺序是由上至下的。
② id不同,如果是子查询,id序号会递增,id值越大优先级越高,越先被执行。
③ id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行。

(2)select_type:表示select的类型,主要用于区别普通查询、联合查询、子查询等复杂查询。
① simple:简单的select查询,查询中不包含子查询或union。
② primary:查询中若包含任何复杂的子部分,最外层查询标记为primary。
③ subquery:select或where列表中的子查询。
④ derived(衍生):在from列表中包含的子查询,MySQL会递归执行这些子查询,把结果放在临时表里。
⑤ union:若第二个select出现在union后,则被标记为union;若union包含在from子句的子查询中,外层select将被标记为derived。
⑥ union result:union后的结果集。

(3)table:显示这一步所访问数据库中表名称(显示这一行的数据是关于哪张表的),有时不是真实的表名字,可能是第几步执行的结果的简称。

(4)type:对表的访问方式,表示MySQL在表中找到所需行的方式,又称“访问类型”。常见的访问类型有ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)。
① ALL:Full Table Scan,MySQL将遍历全表以找到匹配的行。
② index::Full Index Scan,index与ALL的区别为index类型只遍历索引树。
③ range:索引范围扫描,返回一批只检索给定范围的行,使用一个索引来选择行,一般就是在where语句中出现between、< 、>、in等的查询。这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引。
④ ref:非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而它可能会找到多个符合条件的行,所以应该属于查找和扫描的混合体。
⑤ eq_ref:类似ref,区别在于使用的索引是唯一索引,对于每个索引键,表中只有一条记录与之匹配,常见于主键或唯一索引扫描。简单来说,就是多表连接中使用primary key或者unique key作为关联条件。
⑥ const、system:当MySQL对查询某部分进行优化并转换为一个常量时,使用这些类型访问。如果查询条件用到常量,那么通过索引一次就能找到,常在使用primary key或unique的索引中出现。system是const类型的特例,当查询的表只有一行的情况下使用。
⑦ NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

(5)possible_keys:指出MySQL能使用哪个索引在该表中找到行,查询涉及的字段上若存在索引,则该索引将被列出,但不一定会被查询使用。

(6)key:显示MySQL实际决定使用的索引,如果没有选择索引,则显示是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX或者IGNORE INDEX。查询中若使用了覆盖索引(select后要查询的字段刚好和创建的索引字段完全相同),则该索引仅出现在key列表中。

(7)key_len:显示索引中使用的字节数。

(8)ref:表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。

(9)rows:显示MySQL根据表统计信息以及索引选用的情况,估算找到所需的记录要读取的行数。

(10)Extra:该列包含MySQL解决查询的说明和描述,包含不适合在其他列中显示但是对执行计划非常重要的额外信息。
① Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,发生在对表的全部请求列都是同一个索引部分的时候,表示MySQL服务器将在存储引擎检索行后再进行过滤。
② Using temporary:表示MySQL需要使用临时表来存储结果集,MySQL在对查询结果排序时使用临时表,常见于排序(order by)和分组查询(group by)。
③ Using filesort:当Query中包含order by操作而且无法利用索引完成的排序操作称为“文件排序”,创建索引时会对数据先进行排序,出现using filesort一般是因为order by后的条件导致索引失效,最好进行优化。
④ Using join buffer:表明使用了连接缓存,比如说在查询的时候,多表join的次数非常多,就将配置文件中缓冲区的join buffer调大一些。如果出现了这个值,应该注意,根据查询的具体情况可能需要添加索引来改进。
⑤ Using index:只使用索引树中的信息,而不需要进一步搜索读取实际的行来检索表中的列信息。相应的select操作中使用了覆盖索引,避免访问了表的数据行,效率好。覆盖索引:select后的数据列只从索引就能取得,不必读取数据行,且与所建索引的个数(查询列小于等于索引个数)、顺序一致。如果要用覆盖索引,就要注意select的列只取需要用到的列,不用select *,同时如果将所有字段一起做索引会导致索引文件过大,性能会下降。
⑥ Using Index Condition:表示进行了ICP优化。

首先关注查询类型type列,如果出现all关键字,代表全表扫描,没有用到任何index;再看key列,如果key列是NULL,代表没有使用索引;然后看rows列,该列数值越大意味着需要扫描的行数越多,相应耗时越长;最后看Extra列,要避免出现Using filesort或Using temporary这样的字眼,这是很影响性能的。

创建索引注意事项

1、限制表上的索引数目。对一个存在大量更新操作的表,所建索引的数目一般不要超过3个,最多不要超过5个。索引虽说提高了访问速度,但太多索引会影响数据的更新操作。
2、避免在取值朝一个方向增长的字段(例如:日期类型的字段)上,建立索引;对复合索引,避免将这种类型的字段放置在最前面。由于字段的取值总是朝一个方向增长,新记录总是存放在索引的最后一个叶页中,从而不断地引起该叶页的访问竞争、新叶页的分配、中间分支页的拆分。此外,如果所建索引是聚集索引,表中数据按照索引的排列顺序存放,所有的插入操作都集中在最后一个数据页上进行,从而引起插入“热点”。
3、对复合索引,按照字段在查询条件中出现的频度建立索引。在复合索引中,记录首先按照第一个字段排序。对于在第一个字段上取值相同的记录,系统再按照第二个字段的取值排序,以此类推。因此只有复合索引的第一个字段出现在查询条件中,该索引才可能被使用。因此将应用频度高的字段,放置在复合索引的前面,会使系统最大可能地使用此索引,发挥索引的作用
4、删除不再使用,或者很少被使用的索引。表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再被需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。
5、对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求;
6、不要在有大量相同取值的字段上,建立索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度;
7、对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少;
8、当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
附录 2 SQL Server 数据库命名与编码规范 一.数据库对象命名基本规范 1. 总体命名规范 名称的长度不超过 32 个字符。 名称采用英文单词、英文单词缩写和数字,单词之间用"_"分隔。 说明:除非用户提供文档化的行业标准(例如,国标或部颁标准),否则不得违反本规 范。 数据库对象名称首字母必须小写。 不得采用"_"作为名称的起始字母和终止字母。 名称必须望文知意。 名称不得与数据库管理系统保留字冲突。 不要在对象名的字符之间留空格。 2. 数据库数据库名定义为系统名+模块名,或直接采用系统名。 数据库名全部采用小写。 3. 数据库文件 数据文件命名采用数据库名+_+文件类型+[文件序号].文件后缀,文件序号为 1、2、 3…9 等数值,当数据库中某一文件类型的文件有多个时加上文件序号以区别。只有一个时 可不加。 文件后缀:主数据文件为.mdf,其它数据文件为.ndf,日志文件为.ldf。 文件名全部采用小写。 4. 表 表命名要遵循以下原则: 采用"系统名+_+t_+模块名+_+表义名"格式构成。 若数据库中只含有单个模块,命名可采用"系统名+t_+表义名"格式构成。 整个表名的长度不要超过 30 个字符。 系统名、模块名均采用小写字符。 模块名或表义名均以其英文单词命名,且字符间不加分割符;表义名中单词的首 字符大写,其它字符小写,多个单词间也不加任何分割符,单词全部采用单数形 式。 表别名命名规则:取表义名的前 3 个字符加最后一个字符。如果存在冲突,适当 增加字符(如取表义名的前 4 个字符加最后一个字符等)。 关联表命名为 Re_表 A_表 B,Re 是 Relative 的缩写,表 A 和表 B 均采用其表义名 或缩写形式。 数据库设计规范 数据库中不论是表名还是字段名,都一律用英文,不准出现其它语言; 为了不增加数据库当中的表名的长度, 一般不允许出现如 Form 或者 Table 的字样, 如:记录表:应为 Record,而不是 RecordTable 数据库当中的表名的命名,不允许出现空格,假如有几个单词出现的话,每个单 词之间用 " _" 隔开如人事信息表: 应为 Human_Info, 而不是 Human Info; 每个单词的第一个字母必须大写;如果太长,为了不增加编程的难度可采用缩写 的方式,每个单词可取三到四个字母表示,也可根据实际情况,实际习惯进行缩 写 5. 属性(列或字段) 属性命名遵循以下原则: 采用有意义的列名,为实际含义的英文单词,且字符间不加任何分割符。 属性名前不要加表名等作为前缀。 属性后不加任何类型标识作为后缀。 不要使用"ID"等与系统保留关键字冲突的单词作为列名。 6. 主键 任何表都必须定义主键。 表主键命名为:"pk+_+表名(或缩写)+_+主键标识"。 7. 外键 表外键命名为:"fk+_+表名(或缩写)+_主表名(或缩写)+_+主键标识"。 8. 索引 索引的命名为:"表名(或缩写)+_+列名+_idx"。 其中多单词组成的属性列列名取前几个单词首字符,加末单词组成。 9. Default 标识 由"df+_+<default 标识名>"组成。 10. Rule 标识 由"ru+_+<Rule 标识名>"组成。 11. 自定义数据类型 自定义数据类型由"ud+_+<自定义数据类型标识>+_+<数据类型>"组成。 12. 触发器 AFTER 型触发器: 系统名+tr_+<表名>_+<i,u,d 的任意组合>, 其中 i, u, d 分别表示 insert、 update 和 delete。 INSTEAD OF 型触发器: 系统名+ti_+<表名>+_+<i,u,d 的任意组合>, 其中 i, u, d 分别表示 insert、 update 和 delete。 13. 视图 视图命名以系统名+v_+模块名作为前缀,其他命名规则和表的命名类似。 14. 存储过程 存储过程命名由"系统名+sp+_+存储过程标识(缩写)"组成。 存储过程标识要以实际含义的英文单词构成,并用下划线分割各个组成部分。 15. 函数 函数命名由"系统名+f+_+函数标识"组成。 16. 变量名 参数变量命名采用"i (o 或 io)+_+ 名称"形式, 前缀 i 或 o 表示输入还是输出参数。 过程变量命名采用"l+_+名称"形式。 变量名采用小写,若属于词组形式,用下划线分隔每个单词。 17. 角色 全部使用小写字符命名。 由"系统名称+_+role+_+名词(或缩写)或名词短语(或缩写)"组成。 18. 用户 全部使用小写字符命名。 由"系统名称+_+user+_+名词(或缩写)或名词短语(或缩写)"组成。 二.Transact-SQL 编程基本规范 1. 一般性注释 注释可以
一、约束:作用是保证数据的完整性和一致性 not null 表示该字段数据不能为空 default 表示该字段的默认值 unique 唯一(列唯一,组合唯一) primary key 主键 一张列表中只允许出现一个主键(not null + unique) auto-increment 自增长 foregin key 外键 建立两个表之间的联系 语法 constraint fk_dep foreign key(关联列名) references 被关联表(被关联列) on delete cascade 同步删除 on update cascade 同步更新 二、Mysql基本介绍 操作文件夹(库): 增加一个库:create database db1 charset utf8; 查看所有库: show databases; 查看特定库: show create database db1; 删库跑路: drop database db1; 操作文件(表): 切换进数据库:use db1; 查看当前所在文件夹;select database( ); 增加表:create table t1(id int,name char(6)); 查看特定表:show create table t1; 查看所有表:show tables;或者desc t1; 改: alter table t1 modify name char(10);name字段改为10字节; alter table t1 modify name NAME char(10);name字段名改成NAME 复制表 即复制表数据也复制表结构:create table t1 select * from db1.t1; 只复制表结构create table a1 like db1.t1; 清空表 delete from t1;但是这种方法会保留自增的ID truncate table t1;这种方法不会保留自增ID 操作文件内容 增加内容:insert into (id,name) values(1,'aa'),(2,'bb'),(3,'cc'); 查看内容:select * from db1.t1; 删除内容:delete from t1 where id =1; 查看用户权限:select * from mysql.user where user='root'\G; 三、SQL数据类型 SQL之中没有bool值,tinyint[1]表示true;tinyint[0]表示fasle. int数据类型后面存储的是显示宽度,而不是存储宽度,其他的数据类型则表示的是存储宽度 now()sql中的内置函数,根据数据类型生成相对应的时间模式 char( )定长字符串,存储速度快,但是浪费空间 varchar( )变长字符串,存储速度慢,可是节省空间 enum() 表示枚举 多选一 set( )表示集合 多选多 七、索引 索引的作用:约束和加速查找 无索引的时候一般会 从前至后一条条查找 有索引的时候:创建索引的本质就是创造额外的文件,查询时先去额外的文件找,定好位置,再去原始表直接查询,提高查询速度,但是增删改的速度依然慢,创建索引后必须命中索引才有效 索引分类 1、普通索引:加速查询 加入索引:create index 索引名 on 表名(列名) 删除索引: drop index 索引名 on 表名 查看索引:show index from 表名 2、唯一索引:加速查找和唯一约束(可含null) 加入索引:create unique index 索引名 on 表名(列名) 删除:drop index 索引名 on 表名 3、主键索引 加入索引:alter table 表名 add primary key(列名) 删除索引:alter table 表名 drop primary key(列名)和alter table 表名 modify 列名 int,drop primary key 4、组合索引:将多个列组合成一个索引 创建组合索引:create iindex 索引名 on 表名(列1,列2) 在使用组合索引时,若组合索引为(name,email),单独索引email时不走索引,这称为最前缀匹配原则最左匹配原则中,mysql会一直向右匹配知道遇到(< > between like)这一类的范围查询时停止 explain + sql查询语句,用于查询sql执行信息参数 在使用关键字‘like’查询时:like ‘n%’ 走索引;但是like ‘%n%’不走索引,即有且仅只有后面带上%时走索引 使用函数时索引不生效
根据引用和引用,MySQL底层使用B树来存储索引,对于InnoDB而言,主键索和行记录是存储在一起的,被称为聚集索引。除了聚集索引,其他索引被称为非聚集索引。当我们在联合索引中按照最左匹配原则进行查询时,只有最边的字段开始匹配时,才能走索引。也就是说,如果联合索引是(a, b, c),那么我们在查询时需要先根据字段a进行匹配,如果条件中的字段不符合从到右的顺序,将无法走索引。这也解释了为什么需要遵守最左匹配原则,因为只有最列有序才能保证右边的索引列有序。,虽然有些情况下不符合最左匹配原则的条件可能会走索引,但这并不是规定中的行为。在使用EXPLAIN语句进行分析时,可能会发现有些不符合最左匹配原则查询语句也使用索引。这可能是因为MySQL优化器做了一些特殊的优化,但这并不意味着不符合最左匹配原则查询一定会走索引。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MySQL索引最左匹配原则](https://blog.csdn.net/zhouchen1998/article/details/124672991)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我代码没错

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值