MySQL Explain命令详解:type列详解及案例分析
在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是数据库学习者,那么本文《MySQL Explain命令详解:type列详解及案例分析》就很适合你!本篇内容主要包括MySQL Explain命令详解:type列详解及案例分析,希望对大家的知识积累有所帮助,助力实战开发!
Explain 命令中的 type 列,显示MySQL查询所使用的 关联类型(Join Types) 或者 访问类型,它表明 MySQL决定如何查找表中符合条件的行。
常见访问类型性能由最差到最优依次为:ALL 。
0、测试环境简述
本文 MySQL 实例版本为 5.7,表存储引擎为 InnoDB
数据库 t 中有两张表 user、user_captcha,每张表中有2W+条数据,下面是两张表的建表语句(表结构只为满足实验要求,没有实际业务逻辑参考价值):
user 表
- id 字段是主键
- email 字段建立了唯一索引
- phone 与 country_code 字段组成联合唯一索引
- birth_year 与 gender 字段组成联合普通索引
- nickname 字段前10个字符建立了普通索引
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nickname` varchar(255) DEFAULT NULL, `country_code` smallint(6) unsigned NOT NULL DEFAULT '0', `phone` varchar(12) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '', `email` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL, `gender` tinyint(4) DEFAULT NULL, `birth_year` smallint(11) unsigned DEFAULT NULL, `created_at` int(11) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `unq_phone_country_code` (`phone`,`country_code`) USING BTREE, UNIQUE KEY `unq_email` (`email`), KEY `idx_birth_year_gender` (`birth_year`,`gender`) USING BTREE, KEY `idx_nickname` (`nickname`(10)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
user_captcha 表
- id 字段是主键
- user_id 字段建立了唯一索引,可以为空
- receiver 字段建立了唯一索引
CREATE TABLE `user_captcha` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) unsigned DEFAULT NULL, `code` char(6) COLLATE utf8_unicode_ci NOT NULL COMMENT '验证码', `retry_times` int(11) NOT NULL COMMENT '重试次数', `last_request_at` int(11) unsigned DEFAULT NULL COMMENT '最后请求时间', `receiver` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL COMMENT '接收者(手机号或邮箱)', `created_at` int(11) NOT NULL, `expired_at` int(11) NOT NULL COMMENT '过期时间', PRIMARY KEY (`id`), UNIQUE KEY `unq_receiver` (`receiver`) USING BTREE, UNIQUE KEY `unique_user` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1. ALL
全表扫描,通常意味着MySQL必须从头到尾扫描整张表,去查找匹配的行的行,性能极差。
但是,如果在查询里使用了 LIMIT n
,虽然 type 依然是 ALL,但是MySQL只需要扫描到符合条件的前 n 行数据,就会停止继续扫描。
- 查询昵称中带 雪 字的用户数据,因为使用了前缀模糊匹配,不能命中索引,会导致全表扫描
mysql> EXPLAIN SELECT * FROM `user` WHERE `nickname` LIKE '%雪%' LIMIT 1 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 22748
filtered: 11.11
Extra: Using where- 查询根据用户id可以被10整除的用户数据。因为在 = 前的索引列上进行了表达式运算,不能命中索引,会全表扫描。
mysql> EXPLAIN SELECT * FROM `user` WHERE id%10=0 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 22293
filtered: 100.00
Extra: Using where
1 row in set, 1 warning (0.01 sec)- 查询手机号是 18888888888 的用户数据,由于数据表中 phone 字段是字符串类型,而查询时使用了数字类型,会触发隐式类型转换,不会命中索引,因此会全表扫描。
mysql> EXPLAIN SELECT * FROM `user` WHERE phone=18888888888 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: ALL
possible_keys: unq_phone_country_code
key: NULL
key_len: NULL
ref: NULL
rows: 22293
filtered: 10.00
Extra: Using where2. index
index 跟 ALL 一样,也会进行全表扫描,只是MySQL会按索引次序进行全表扫描,而不是直接扫描行数据。它的主要优点是避免了排序;最大的缺点是要承担按索引次序读取整个表的开销。若是按随机次序访问行,开销将会非常大。
- 根据出生年分组去重,查询用户数据。
mysql> EXPLAIN SELECT * FROM `user` GROUP BY `birth_year` G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: index
possible_keys: idx_birth_year_gender
key: idx_birth_year_gender
key_len: 5
ref: NULL
rows: 22748
filtered: 100.00
Extra: NULL如果在 Extra 列中看到 Using index
,说明MySQL正在使用覆盖索引,索引的数据中包含了查询所需的所有字段,因此只需要扫描索引树就能够完成查询任务。它比按索引次序全表扫描的开销要少很多,因为索引树的大小通常要远小于全表数据。
- 根据出生年分组,查询不同年份出生的用户个数,这里用到了覆盖索引。
mysql> EXPLAIN SELECT `birth_year`,COUNT(*) FROM `user` GROUP BY `birth_year`G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: index
possible_keys: idx_birth_year_gender
key: idx_birth_year_gender
key_len: 5
ref: NULL
rows: 22748
filtered: 100.00
Extra: Using index- 查询用户的id、性别、出生年数据,由于
idx_birth_year_gender
索引中包含birth_year
和gender
字段,而 InnoDB的所有索引都包含id字段,不需要回表查询其他数据,因此也能用到覆盖索引。
mysql> EXPLAIN SELECT `id`,`birth_year`,`gender` FROM `user` LIMIT 10 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: index
possible_keys: NULL
key: idx_birth_year_gender
key_len: 5
ref: NULL
rows: 22748
filtered: 100.00
Extra: Using index- 查询表数据总条数,查询数据条数时,InnoDB存储引擎会自动选择最短的索引,通过遍历该索引,就可以计算出数据总条数,不需要回表查询其他数据,因此也能用到覆盖索引。
mysql> EXPLAIN SELECT COUNT(*) FROM user G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: index
possible_keys: NULL
key: idx_birth_year_gender
key_len: 5
ref: NULL
rows: 22748
filtered: 100.00
Extra: Using index3. range
范围扫描,就是一个有范围限制的索引扫描,它开始于索引里的某一点,返回匹配这个范围值的行。range 比全索引扫描更高效,因为它用不着遍历全部索引。
范围扫描分为以下两种情况:
- 范围条件查询:在
WHERE
子句里带有BETWEEN
、>
、、
>=
、的查询。
- 多个等值条件查询:使用
IN()
和OR
,以及使用like
进行前缀匹配模糊查询。
- 查询
id >= 1000
且id 的用户数据。
mysql> EXPLAIN SELECT * FROM `user` WHERE `id`>=1000 AND `id`
- 查询 90后 的用户数据。
mysql> EXPLAIN SELECT * FROM `user` WHERE `birth_year` BETWEEN 1990 AND 1999 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: range
possible_keys: idx_birth_year_gender
key: idx_birth_year_gender
key_len: 3
ref: NULL
rows: 150
filtered: 100.00
Extra: Using index condition- 查询昵称以 雪 字开头的用户数据。
mysql> EXPLAIN SELECT * FROM `user` WHERE `nickname` LIKE '雪%' G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: range
possible_keys: idx_nickname
key: idx_nickname
key_len: 43
ref: NULL
rows: 30
filtered: 100.00
Extra: Using where- 分别使用
IN()
和OR
两种方式查询出生年份在 1990,2000,2010 的用户数据。
mysql> EXPLAIN SELECT * FROM `user` WHERE `birth_year` IN (1990,2000,2010) G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: range
possible_keys: idx_birth_year_gender
key: idx_birth_year_gender
key_len: 3
ref: NULL
rows: 41
filtered: 100.00
Extra: Using index condition
mysql> EXPLAIN SELECT * FROM `user` WHERE `birth_year`=1990 OR `birth_year`=2000 OR `birth_year`=2010 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: range
possible_keys: idx_birth_year_gender
key: idx_birth_year_gender
key_len: 3
ref: NULL
rows: 41
filtered: 100.00
Extra: Using index condition4. index_subquery
index_subquery 替换了以下形式的子查询中的 eq_ref 访问类型,其中 key_column 是非唯一索引。
value IN (SELECT key_column FROM single_table WHERE some_expr)
index_subquery 只是一个索引查找函数,它可以完全替换子查询,提高查询效率。
大多数情况下,使用SELECT子查询时,MySQL查询优化器会自动将子查询优化为联表查询,因此 type 不会显示为 index_subquery。
- 在MySQL查询优化器判定可以对 SELECT 子查询进行优化的情况下,使用子查询与联表查询的执行计划是相同的。
mysql> EXPLAIN SELECT code FROM user_captcha LEFT JOIN user ON user.phone=user_captcha.receiver WHERE phone like '1888%' G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: range
possible_keys: unq_phone_country_code
key: unq_phone_country_code
key_len: 14
ref: NULL
rows: 44
filtered: 100.00
Extra: Using where; Using index
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: user_captcha
partitions: NULL
type: eq_ref
possible_keys: unq_receiver
key: unq_receiver
key_len: 257
ref: t.user.phone
rows: 1
filtered: 100.00
Extra: Using index condition
mysql> EXPLAIN SELECT code FROM user_captcha WHERE receiver IN (SELECT phone FROM `user` WHERE phone like '1888%') G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: range
possible_keys: unq_phone_country_code
key: unq_phone_country_code
key_len: 14
ref: NULL
rows: 44
filtered: 100.00
Extra: Using where; Using index; LooseScan
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: user_captcha
partitions: NULL
type: eq_ref
possible_keys: unq_receiver
key: unq_receiver
key_len: 257
ref: t.user.phone
rows: 1
filtered: 100.00
Extra: Using index condition- 我们可以通过在 UPDATE 语句的执行计划中看到 index_subquery。
mysql> EXPLAIN UPDATE user_captcha SET retry_times=1 WHERE receiver IN (SELECT phone FROM `user` WHERE phone like '1888%') G
*************************** 1. row ***************************
id: 1
select_type: UPDATE
table: user_captcha
partitions: NULL
type: index
possible_keys: NULL
key: PRIMARY
key_len: 4
ref: NULL
rows: 22433
filtered: 100.00
Extra: Using where
*************************** 2. row ***************************
id: 2
select_type: DEPENDENT SUBQUERY
table: user
partitions: NULL
type: index_subquery
possible_keys: unq_phone_country_code
key: unq_phone_country_code
key_len: 14
ref: func
rows: 1
filtered: 100.00
Extra: Using where; Using index5. unique_subquery
unique_subquery 跟 index_subquery 类似,它替换了以下形式的子查询中的 eq_ref 访问类型,其中 primary_key 可以是主键索引或唯一索引。
value IN (SELECT primary_key FROM single_table WHERE some_expr)
unique_subquery 只是一个索引查找函数,它可以完全替换子查询,提高查询效率。
- 由于MySQL查询优化器会对 SELECT 子查询进行优化,我们可以在 UPDATE 语句的执行计划中看到 unique_subquery。
mysql> EXPLAIN UPDATE user_captcha SET retry_times=1 WHERE user_id IN (SELECT id FROM `user` WHERE phone like '%1888%') G
*************************** 1. row ***************************
id: 1
select_type: UPDATE
table: user_captcha
partitions: NULL
type: index
possible_keys: NULL
key: PRIMARY
key_len: 4
ref: NULL
rows: 22433
filtered: 100.00
Extra: Using where
*************************** 2. row ***************************
id: 2
select_type: DEPENDENT SUBQUERY
table: user
partitions: NULL
type: unique_subquery
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: func
rows: 1
filtered: 11.11
Extra: Using where6. index_merge
表示出现了索引合并优化,通常是将多个索引字段的范围扫描合并为一个。包括单表中多个索引的交集,并集以及交集之间的并集,但不包括跨多张表和全文索引。
这种优化并非必然发生的,当查询优化器判断优化后查询效率更优时才会进行优化。详情可查看官方文档
- 查询出生年在 1990,2000,2010 年,或 id 的用户数据
mysql> EXPLAIN SELECT * FROM `user` WHERE `birth_year` IN (1990,2000,2010) OR `id`
- 查询手机号以 183 开头或 出生年 大于1990 年的用户数据
mysql> EXPLAIN SELECT * FROM `user` WHERE `phone` like '183%' OR `birth_year`>1990 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: index_merge
possible_keys: unq_phone_country_code,idx_birth_year_gender
key: unq_phone_country_code,idx_birth_year_gender
key_len: 14,3
ref: NULL
rows: 1105
filtered: 100.00
Extra: Using sort_union(unq_phone_country_code,idx_birth_year_gender); Using where- 查询出生年在 1990 年或 id=1000 的用户数据
mysql> EXPLAIN SELECT * FROM `user` WHERE `birth_year`=1990 OR `id`=1000 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: index_merge
possible_keys: PRIMARY,idx_birth_year_gender
key: idx_birth_year_gender,PRIMARY
key_len: 3,4
ref: NULL
rows: 11
filtered: 100.00
Extra: Using sort_union(idx_birth_year_gender,PRIMARY); Using where
1 row in set, 1 warning (0.01 sec)7. ref_or_null
ref_or_null 于 ref 类似,但是MySQL必须对包含 NULL 值的行就行额外搜索。
- 查找昵称是 空字符串 '' 或 NULL 的用户数据
mysql> EXPLAIN SELECT * FROM `user` WHERE `nickname`='' OR `nickname` IS NULL G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: ref_or_null
possible_keys: idx_nickname
key: idx_nickname
key_len: 43
ref: const
rows: 2
filtered: 100.00
Extra: Using where8. fulltext
命中全文索引时 type 为 fulltext。
9. ref
索引访问(有时也叫做索引查找),它返回所有匹配某个单个值的行。然而,它可能会找到多个符合条件的行,因此,它是查找和扫描的混合体。此类索引访问只有当使用非唯一性索引或者唯一性索引的非唯一性前缀时才会发生。把它叫做 ref 是因为索引要跟某个参考值相比较。这个参考值或者是一个常数,或者是来自多表查询前一个表里的结果值。
- 查找出生年在2000年的用户数据。
mysql> EXPLAIN SELECT * FROM `user` WHERE `birth_year`=2000 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: ref
possible_keys: idx_birth_year_gender
key: idx_birth_year_gender
key_len: 3
ref: const
rows: 30
filtered: 100.00
Extra: NULL- 查找电话号码是 18888888888 的用户数据,
phone
与country_count
联合组成唯一索引unq_phone_country_code
,phone
是唯一索引unq_phone_country_code
的非唯一性前缀。
mysql> EXPLAIN SELECT * FROM `user` WHERE `phone`='18888888888'G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: ref
possible_keys: unq_phone_country_code
key: unq_phone_country_code
key_len: 14
ref: const
rows: 1
filtered: 100.00
Extra: NULL10. eq_ref
当进行等值联表查询时,联结字段命中主键索引或唯一的非空索引时,将使用 eq_ref。
(《高性能MySQL(第3版)》一书中说"使用主键或唯一索引查询时会用 eq_ref",经过反复测试,并查阅MySQL5.6、5.7版本的官方文档,实际上使用主键或唯一索引进行等值条件查询时 type 会显示 const,《高性能MySQL(第3版)》这里应该是只适用于5.5之前的版本。)
- 以
user_captcha
表作为主表,LEFT JOINuser
表查询用户数据,因为user表中id字段是主键,所以第二行的user
表的 type 为 eq_ref
mysql> EXPLAIN SELECT * FROM `user_captcha` LEFT JOIN `user` ON `user`.`id`=`user_captcha`.`user_id` G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user_captcha
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 22433
filtered: 100.00
Extra: NULL
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: t.user_captcha.user_id
rows: 1
filtered: 100.00
Extra: Using where
2 rows in set, 1 warning (0.01 sec)- 当使用
user
表作为主表,LEFT JOINuser_captcha
表时,因为user_captcha
表中user_id
字段与device_id
组成联合唯一索引,user_id
并非独立的唯一索引,所以第二行的user_captcha
表的 type 为 ref,而并非 eq_ref
mysql> EXPLAIN SELECT * FROM `user` LEFT JOIN `user_captcha` ON `user`.`id`=`user_captcha`.`user_id` G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 22999
filtered: 100.00
Extra: NULL
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: user_captcha
partitions: NULL
type: ref
possible_keys: unique_user
key: unique_user
key_len: 5
ref: t.user.id
rows: 1
filtered: 100.00
Extra: Using where11. const
MySQL 知道查询最多只能匹配到一条符合条件的记录。因为只有一行,所以优化器可以将这一行中的列中的值视为常量。const 表查询非常快,因为它们只读取一次数据行。
通常使用主键或唯一索引进行等值条件查询时会用 const。
- 使用主键查询用户数据
mysql> EXPLAIN SELECT * FROM `user` WHERE `id`=120 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: const
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: const
rows: 1
filtered: 100.00
Extra: NULL- 使用唯一索引查询用户数据
mysql> EXPLAIN SELECT * FROM `user` WHERE `email`='54222806@qq.com' G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: const
possible_keys: unq_email
key: unq_email
key_len: 258
ref: const
rows: 1
filtered: 100.00
Extra: NULL- 使用联合唯一索引查询用户数据
mysql> EXPLAIN SELECT * FROM `user` WHERE `country_code`=86 AND `phone`='18888888888' G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: const
possible_keys: unq_phone_country_code
key: unq_phone_country_code
key_len: 16
ref: const,const
rows: 1
filtered: 100.00
Extra: NULL12. system
官方文档原文是:
The table has only one row (= system table). This is a special case of the const join type.
该表只有一行(=系统表)。这是 const 关联类型的特例。
- 从系统库mysql的系统表
proxies_priv
里查询数据,这里的数据在Mysql服务启动时候已经加载在内存中,不需要进行磁盘IO。
mysql> EXPLAIN SELECT * FROM `mysql`.`proxies_priv` G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: proxies_priv
partitions: NULL
type: system
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1
filtered: 100.00
Extra: NULL参考:
《高性能MySQL(第3版)》
理论要掌握,实操不能落!以上关于《MySQL Explain命令详解:type列详解及案例分析》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!
Linux中Mysql集群搭建
- 上一篇
- Linux中Mysql集群搭建
- 下一篇
- centos8中快速搭建Java Web开发环境
-
- 震动的山水
- 这篇技术贴太及时了,太全面了,很棒,已收藏,关注作者了!希望作者能多写数据库相关的文章。
- 2023-03-26 22:55:49
-
- 碧蓝的百合
- 这篇文章真是及时雨啊,博主加油!
- 2023-03-25 17:05:50
-
- 甜美的斑马
- 赞 ??,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢老哥分享技术文章!
- 2023-03-02 01:33:43
-
- 踏实的牛排
- 太详细了,已收藏,感谢作者大大的这篇技术贴,我会继续支持!
- 2023-02-24 23:56:53
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 3344次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 3095次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 3049次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 3256次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 3207次使用
-
- Linux系统下如何安装Mysql(centOS7以上不支持Mysql)
- 2023-01-16 100浏览
-
- 在windows上用docker desktop安装StoneDB
- 2023-01-20 100浏览
-
- 总结 mysql 一些小技巧
- 2023-01-21 100浏览
-
- MySQL如何给大表加索引
- 2023-01-26 100浏览
-
- 积分商城简要设计
- 2023-02-17 100浏览

