Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >故障分析 | TRUNCATE 到底因何而慢?

故障分析 | TRUNCATE 到底因何而慢?

作者头像
爱可生开源社区
发布于 2023-08-18 11:54:58
发布于 2023-08-18 11:54:58
1.9K00
代码可运行
举报
运行总次数:0
代码可运行

作者:李锡超

一个爱笑的江苏苏宁银行 数据库工程师,主要负责数据库日常运维、自动化建设、DMP 平台运维。擅长 MySQL、Python、Oracle,爱好骑行、研究技术。

本文来源:原创投稿

* 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


1问题现象

收到反馈某测试环境执行批量操作时,有 truncate 语句存在于慢查询日志中。担心上线后可能影响数据库,请求 DBA 配合分析。

关键配置

配置项

说明

数据库版本

MySQL 5.7

参数 long_query_time 慢查询阈值,单位为秒

0.1(100 毫秒)

参数 innodb_adaptive_hash_index

ON

问题分析总结

总结下来主要有如下几个问题:

Q1: TRUNCATE 语句是如何执行的?fd 句柄不变化?为什么执行时间长?

TRUNCATE 语句如何执行?

关键堆栈:

关键操作 debug:

为什么执行时间长?

从以上堆栈可以看到,耗时过程主要是 row_drop_table_for_mysqlos_file_delete_func

其中:row_drop_table_for_mysql 主要是调用 btr_drop_ahi_for_table 执行 AHI 的 page 页的删除。os_file_delete_func 主要调用 unlink 执行文件的清理。

句柄为什么不变化?

假如需要 truncate 的表分配的 fd 为 43,truncate 过程中,会先将表 rename。这个时候这个 fd 会被关闭,43 就被释放了。然后执行 create table 操作。一般这个间隙过程很短,因此新建立的表可以使用被释放的 43 了,所以会看到 fd 没有变化。

如果 rename 之后,在内部执行 create table 之前,又打开了新文件,那这时候 fd 43 就会被其它打开的文件持有,truncate 之后表的 fd 也就会发生变化。

注意:MySQL 8.0 是真正使用 rename + create + drop实现的 truncate,但 MySQL 5.7 是通过文件的 truncate 实现的。

Q2: 如何分析 TRUNCATE 慢的问题?

方式一:慢日志?

只能看到慢的结果,无法确认原因。

方式二:执行计划?

不支持 truncate 语句。

方式三:PROFILE

profile 结果来看,对于 truncate 语句,只能看到耗时过程都在System lock 上,无法看到更近一步的原因。

方式四:DEBUG

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 推荐设置
// 其中 T 其实是 MySQL 支持(在 trace 中打印时间)的,但官方文档中缺少了说明。已提交bug说明:Bug #111174

set global debug='d:t:T:i:n:N:o,/tmp/debug_3306.trace.f';
set global debug='';
  • ① 表示 show processlist 的线程 ID
  • ② 执行时间
  • ③ 函数调用层级
  • ④ 函数名称

MySQL 8.0 切换对比

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// TRUNCATE
// 默认规范配置
// innodb_flush_method = on & innodb_flush_method = O_DIRECT
(root@127.1) [eolbimsdb] 08:44:46 15> truncate table t5;
Query OK, 0 rows affected (0.98 sec)

// 设置 innodb_adaptive_hash_index = off
(root@127.1) [eolbimsdb] 08:52:03 5> truncate table t5;
Query OK, 0 rows affected (0.03 sec)

// 设置 innodb_flush_method = fsync
(root@127.1) [eolbimsdb] 09:03:34 28> truncate table t5;
Query OK, 0 rows affected (1.04 sec)

// 设置  innodb_adaptive_hash_index = off & innodb_flush_method = fsync
(root@127.1) [eolbimsdb] 09:20:24 5> truncate table t5;
Query OK, 0 rows affected (0.22 sec)


// DROP
// 默认规范配置
// innodb_flush_method = on & innodb_flush_method = O_DIRECT
(root@127.1) [eolbimsdb] 10:05:41 9> drop table t5;
Query OK, 0 rows affected (0.94 sec)


// 设置 innodb_adaptive_hash_index = off & innodb_flush_method = O_DIRECT
(root@127.1) [eolbimsdb] 09:44:24 5> drop table t5;
Query OK, 0 rows affected (0.01 sec)

// 设置 innodb_flush_method = on & innodb_flush_method = fsync
(root@127.1) [eolbimsdb] 09:32:15 13> drop table t5;
Query OK, 0 rows affected (1.13 sec)

// 设置  innodb_adaptive_hash_index = off & innodb_flush_method = fsync
(root@127.1) [eolbimsdb] 09:25:10 14> drop table t5;
Query OK, 0 rows affected (0.19 sec)

Q3: 能否优化?慢在哪里?post_ddl 如何调用?

从 Q1 的结果中可以看出,执行的主要耗时在 row_drop_table_for_mysqlos_file_delete_func

MySQL 8.0 的优化措施

  1. row_drop_table_for_mysql 慢的问题,可以通过设置 innodb_adaptive_hash_index = off 进行优化;
  2. os_file_delete_func 慢的问题,可以设置 innodb_flush_method = O_DIRECT 或者配置表的 HARD LINK 进行优化。

MySQL 5.7 的优化措施

详见后面 3-Q1、3-Q4 部分。

post_ddl 如何调用?

MySQL 8.0 引入了 scope guard[1] 功能:当定义了 scope guard 之后,会创建 Scope_guard 对象。正常情况下,当执行 return 操作前,会执行 scope guard 定义的逻辑。除非在函数结束前执行 Scope_guard 对象的 commit 操作,文件的删除功能是在 scope guard 的 cleanup_base 阶段调用实现的。

Q4: 生产执行 TRUNCATE 是否存在隐患?

从实现机制来看,主要有以下风险:

IO 压力

当触发 truncate 操作后,需要在短时间由数据库线程将文件 unlinktruncate,如果被处理的文件很大,服务器的 IO 压力可能会影响正常的数据库请求。

内存并发

在执行 truncatedrop 的过程中,由于需要对内存的数据进行清理,特别是对 LRU 和 flush_LRU 进行扫描,并释放对应的数据块。这个过程是需要逐个根据 buffer pool instance 获取 mutex 资源的。如果在业务高峰期,特别是 buffer pool 较大时,可能会影响正常的业务情况。

同时,执行 create drop table 操作时需要 dict_operation_lock 的 X 锁(RW_X_LATCH),而一些其他后台线程,比如 Main Thread 检查 dict cache 时,也需要获取 dict_operation_lock 的 X 锁,因此被阻塞。然后用户线程可能由于获取不到锁而处于挂起状态,当无法立刻获得锁时。更多参考:《Drop Table 对 MySQL 的性能影响分析》[2]

Q5: 不同版本对于 TRUNCATE 的实现是否存在差异?

通过对比 2-Q1 与 3-Q4:

MySQL 8.0truncate 实现方式基本和 drop 实现方式相同,包括主要的耗时位置(都在 row_drop_table_for_mysqlos_file_delete_func)都是相同的。

MySQL 5.7truncatedrop 实现差异较大,整个实现过程几乎是完全独立的代码。truncate 使用 row_truncate_table_for_mysqldrop 使用 row_drop_table_for_mysqltruncate 操作的主要的耗时有 dict_drop_index_treeos_file_truncate

2DROP TABLE 优化失败分析

下面来看一个 MySQL 5.7 测试环境上线 DROP TABLE 优化方案失败问题。

Q1:上线为什么会失败?HARD LINK 为什么不生效?AHI 为什么不生效?

  • 当 MySQL 5.7 使用规范配置启动时,从 debug-trace 过程来看,在row_drop_single_table_tablespacerow_drop_table_from_cache 函数执行期间根本没有耗时,所以实施优化方案后,没有效果;
  • 耗时的过程在 que_eval_sql: query: PROCEDURE DROP_TABLE_PROC ---> dict_drop_index_tree
  • row_drop_single_table_tablespace 的耗时被 MySQL 5.7 配置innodb_flush_method=O_DIRECT 优化了。

Q2:该优化是否适用于 MySQL 8.0?

设置 innodb_flush_method=O_DIRECT 的优化操作,同样适用于 MySQL 8.0。

Q3:MySQL 8.0 如何解决 DROP TABLE 时执行 DROP_TABLE_PROC 慢的问题?

  • WL#9536: InnoDB_New_DD: Support crash-safe DDL;
  • 依赖于自 Version 8.0.3 的 NEW DD;
  • 整个 drop 慢的 que_eval_sqlDROP_TABLE_PROC 被整体砍掉;
  • 包括 dict_drop_index_tree 在内的整个函数,都被砍了;
  • 具体实现机制,参考分析 NEW DD 实现方法。

Q4:MySQL 5.7 DROP TABLE 和 TRUNCATE 在实现机制、优化措施有何区别呢?

  • 执行 truncate 操作的耗时,仍然是在 dict_drop_index_treeos_file_truncate 这两个阶段;
  • os_file_truncate 的耗时:可以通过设置 innodb_flush_method=O_DIRECT 参数进行优化(不可以通过 hard link 进行优化);
  • dict_drop_index_tree 的耗时,暂时没有优化思路。了解更多:InnoDB 文件系统之文件物理结构[3]

Q5:5.7 慢查询为什么有时记录 TRUNCATE 执行慢,有时不记录?

根据源码,MySQL 是否记录慢查询判断时,主要有两个维度:一个是执行时间(不包括 utime_alter_lock);一个是执行扫描的行数,并对特殊的语句(如 call)进行了忽略。对于 truncate 操作而言,无论执行时间是多少,扫描行数都是 0。当配置了 min_examined_row_limit 大于 0 之后,一般 truncate 操作由于不满足该条件,都不会被记录到慢查询。

但是当 truncate 操作位于存储过程中时,在 truncate 操作之前有其它 DML 操作(如 insert select),这时候由于位于同一个 THD 下,在 MySQL 5.7 版本里面 thd->get_examined_row_count() 返回的结果其实是上一个 DML 语句的(这里应该是缺陷)。如果此时 truncate 操作的执行时间又超过了 long_query_time,那么此时这个 truncate 语句就会被记录慢查询。

同时,在 MySQL 8.0 针对 call 的语句,将不再单独记录 DML 的语句。而是记录为统一的 call 语句里面。需要看存储过程里面的语句执行情况,可以用 show profiles 查看。

慢查询记录堆栈

测试存储过程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DROP PROCEDURE truncate_test;
DELIMITER //
CREATE PROCEDURE truncate_test()
BEGIN
  insert into t1 select * from t1_bak;
  truncate table t1;
END
//
DELIMITER ;

call truncate_test();

mysql> call truncate_test();
Query OK, 0 rows affected (1 min 59.58 sec)
# Time: 2023-06-08T00:28:30.969993+08:00
# User@Host: root[root] @ localhost []  Id:     2
# Schema: db2  Last_errno: 0  Killed: 0
# Query_time: 119.177518  Lock_time: 0.000233  Rows_sent: 0  Rows_examined: 131072  Rows_affected: 131072
# Bytes_sent: 0
# Stored_routine: db2.truncate_test
use db2;
SET timestamp=1686155310;
insert into t1 select * from t1_bak;
# Time: 2023-06-08T00:28:31.375873+08:00
# User@Host: root[root] @ localhost []  Id:     2
# Schema: db2  Last_errno: 0  Killed: 0
# Query_time: 0.405734  Lock_time: 0.003310  Rows_sent: 0  Rows_examined: 131072  Rows_affected: 0
# Bytes_sent: 0
# Stored_routine: db2.truncate_test
SET timestamp=1686155311;
truncate table t1;

与 MySQL 8.0 对比

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> call truncate_test();
Query OK, 0 rows affected (2 min 28.51 sec)

# Time: 2023-06-07T17:18:39.215632Z
# User@Host: root[root] @ localhost []  Id:     8
# Query_time: 148.516478  Lock_time: 0.000372 Rows_sent: 0  Rows_examined: 172032
use testdb;
SET timestamp=1686158318;
call truncate_test();

MySQL 8.0 如何跟踪?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> call truncate_test();
Query OK, 0 rows affected (2 min 24.84 sec)

mysql> 
mysql> 
mysql> show profiles;
+----------+--------------+-----------------------------------------+
| Query_ID | Duration     | Query                                   |
+----------+--------------+-----------------------------------------+
|        1 | 144.55113600 | insert into ltb2 select * from ltb3_bak |
|        2 |   0.29312375 | truncate table ltb2                     |
+----------+--------------+-----------------------------------------+
2 rows in set, 1 warning (0.00 sec)

以上包括 truncate 执行慢的分析,如针对细节有任何疑问和建议,欢迎留言交流。

参考资料

[1]

跟着 MySQL 8.0 学 C++:scope_guard: https://www.bookstack.cn/read/aliyun-rds-core/20cbcfdcbd68888c.md

[2]

Drop Table 对 MySQL 的性能影响分析: https://www.cnblogs.com/CtripDBA/p/11465315.html

[3]

InnoDB 文件系统之文件物理结构: http://mysql.taobao.org/monthly/2016/02/01/

本文关键字:#MySQL# #InnoDB# #truncate# #源码#

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爱可生开源社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
语音直播系统源码的功能跟组成
随着互联网技术和时代的发展,直播已经融入各行各业,成为现在人们生活密不可分的一部分,娱乐直播、会议直播、行业直播等等。根据不同用户的不同需求,直播也衍生出了多种产品类型而语音直播源码开发就是其中之一。
bojokj6961
2020/05/22
9650
语音直播系统源码开发的多种场景模式解决方案
语音聊天基本是社交软件必备的功能,语音相比文字图片更丰富,比视频又更简便,是天然的社交工具。除了单纯的1对1语音或视频聊天,在实时音视频技术支持下,很多 APP 已经延伸出非常多的玩法。目前比较火的语音直播系统源码又分为语音电台、语音游戏、私人聊天、多人聊天、KTV 聊天等细分的场景,延伸出去还有更多的形态。
布谷安妮
2020/04/02
1.3K0
语音直播系统源码开发的多种场景模式解决方案
多平台布局语音直播系统开发,语音社交APP或成新风口?
因为当下疫情的影响,导致线下举办的活动、课程、分享会、工作等都无法正常的运行,这无疑也成为了许多企业机构如今要面临的难题之一,到底是延期举行,还是直接取消?最好解决办法,可能就是直播。从2016-2020年中国在线语音直播用户规模来看,语音直播的用户群体逐年扩大。2017年中国在线语音直播用户突破一亿,达到1.12亿,而2019年中国在线语音直播用户规模已达到了1.97亿,预计2020年将突破2亿,达到2.34亿,语音直播系统开发成为了最受欢迎的内容传播形式之一。语音直播,无疑是音频市场这块大蛋糕中最被看好的一部分。
布谷安妮
2020/03/13
6330
多平台布局语音直播系统开发,语音社交APP或成新风口?
关于语音直播源码开发都有哪些模式和功能组成?
随着互联网技术和时代的发展,视频直播已经融入各行各业,成为人们生活的一部分,娱乐直播、会议直播、行业直播等等,互动视频直播市场在不断的扩大。根据不同的用户需求,直播也衍生出了多种产品类型,语音直播源码开发就是其中之一。
布谷安妮
2020/05/14
8600
关于语音直播源码开发都有哪些模式和功能组成?
实现一款简单的语音直播系统源码哪些步骤?
快节奏的生活下,人们想要扩大自己的交际圈,需要情感的宣泄也需要隐私保护,在这种情况下,语音聊天有了市场。相比于直播视频类的社交软件来说,语音直播系统源码有着更多的优势,没有了外貌等因素的干扰,通过声音洗涤心灵。
布谷安妮
2020/04/27
8970
实现一款简单的语音直播系统源码哪些步骤?
PHP直播源码,直播系统源代码功能有哪些?
PHP直播源码究竟是什么?其实所谓的PHP直播源码就是用PHP语言开发的直播系统源代码。
布谷鸟小刘
2021/08/18
3K0
优质内容可以让小众化的语音直播系统源码越走越远
相比曾经热火朝天的移动视频直播,语音直播其实一直相对更加垂直和细分,虽然目标用户极具粘性和更精准,但视频直播的“全民化”概念对资本来说吸引力更大,因此这也导致前两天资本方对语音直播的热情远低于对视频直播的追捧。因此,两者的对比,更像是内容领域的左右之争,局定的关键因素是用户的内容需求。视频直播由于其形式特点而导致了粗俗内容泛滥,使得平台沦为庸俗。而语音直播系统源码一般依托于音乐、二次元等文化,相较而言更为专业甚至是小众,但是其用户粘性和活跃度却比一般直播平台更强。而当视频直播因为内容受阻时,语音直播的内容优势也就越发明显。
布谷安妮
2020/04/11
6980
优质内容可以让小众化的语音直播系统源码越走越远
一对一直播系统源码开发的特性以及不断融合的功能
一对一直播系统源码开发功能一对一直播是相对一对多直播而存在,直播形式最早是PC时代的秀场、游戏竞技,并移植到移动互联网上。一对多直播,简单来说就是播主直播吸引粉丝来观看打赏,人气最高的播主同时观看人数能达到千万级别。相比之下,一对一直播顾名思义,是通过技术手段限制,只允许一个播主对接一个观客,双方因形式上的不同有着很大的差异。
布谷安妮
2020/01/04
4530
一对一直播系统源码开发的特性以及不断融合的功能
分析不同应用场景中语音直播系统源码开发需要满足的功能
在音视频直播行业,语音聊天在不同形式的直播软件中担当了不同的角色,因此视频通话SDK也成为软件开发过程中必不可少的一部分。随着直播市场需求的变化,在今年更多的行业中人开始为用户提供了语音聊天功能,语音聊天系统源码的开发也掀起热潮。
用户2954023423
2019/12/11
1.1K0
分析不同应用场景中语音直播系统源码开发需要满足的功能
语音直播系统源码直播间场功能开发
以视频直播、短视频为行业元年的 2019 年,吸引了众多产品的入局,但随着同类产品渐多,流量抢夺也愈发激烈。相比真人视频形态的直播方式,语音直播系统源码因为不需要露脸、不需要颜值,一定程度上则为用户降低了直播的门槛,这一优势也将会吸引更多的用户成为主播,而收听直播的用户也可以不再需要只停留在直播间内,在操作体验上将更加方便用户可以边听语音直播边做其他事。
布谷安妮
2020/05/19
1.2K0
语音直播系统源码直播间场功能开发
直播服务平台为直播系统源码的功能展示提供了不可或缺的作用
直播系统源码涉及的内容较为多,像音视频编解码、流媒体服务器传送、美颜作用,及其各种插口难题等。如果不是技术专业的技术性支撑点,保持起来会较为难。而这在其中网络层作用的保持都是不可或缺的。面对服务平台客户,稍一不小心会促使作用越来越很可有可无。那么从直播间开发设计视角看来,什么服务平台作用是不可或缺的呢?
布谷安妮
2020/07/27
7340
直播服务平台为直播系统源码的功能展示提供了不可或缺的作用
语音直播系统开发聆听有质量的声音,语音社交迎来新发展
语音直播现今网络娱乐社交方式层出不穷,而以语音直播为代表的新娱乐社交模式是当下较火的新玩法。QuestMobile春季大报告数据就显示,语音社交可能成为继图文社交、视频社交之后的下一个载体。
布谷安妮
2019/11/22
9720
语音直播系统开发聆听有质量的声音,语音社交迎来新发展
语音直播系统开发:多人语音聊天社交的主要功能模式
如果你对于直播还停留在视频直播的印象上,那么你已经落后了,语音直播系统开发已悄然崛起。语音直播系统开发与其它直播也是一样的原理,但比其它直播多了一丝神秘感,它是通过声音来直播,观众只能听到主播声音却看不到主播的脸,有些人觉得看不到脸不过瘾,但对于声控来说,语音直播却是实实在在的福利。
布谷安妮
2020/06/19
2.7K0
语音直播系统开发:多人语音聊天社交的主要功能模式
语音聊天室APP源码开发全解析:从技术架构到运营策略
安装Center OS 7.9,我们自己的服务器使用的是7.9建议相同系统,非强制
山东布谷科技_孙哥
2025/05/21
1290
语音聊天室APP源码开发全解析:从技术架构到运营策略
直播带货系统开发,购物直播发展的新模式
2019年可以说是直播带货爆发的一年。2019年,淘宝直播“618”截至15点30分成交规模为130亿元。根据QuestMobile《2019双11洞察报告》,手机淘宝App内观看直播的用户规模为4133万,同比增长130.5%。而双11淘宝直播成交规模为200亿元,其中有超过10个亿元直播间,超过100个千万元直播间。
布谷安妮
2019/11/26
1.1K0
直播带货系统开发,购物直播发展的新模式
2万场演出取消,快手抖音也救不了李诞们?
线下娱乐、演出全面停滞,“本来就不富裕的脱口秀行业”危机四伏。 “我的朋友圈已经看到倒闭好几家了”,3月1日,在抖音与达人“多余和毛毛姐”连麦时,李诞打趣说,“现在就靠直播了”、“最近打算好好当一名主播”。 对于仰赖线下的演出行业来说,疫情这只“黑天鹅”降临得很突然。大多数线下演出相关公司,正处于一个艰难的“春天”。 中国演出行业协会近日发布数据称,据不完全统计,3月份,全国20余省市,近8000场次演出(包含剧场和大型演出)被取消或延期。市场“暂停键”下,3月份直接票房损失超过10亿元。今年2月
腾讯大讲堂
2020/03/12
8700
多人语音APP源码,多人语音源码制作开发的多元性
语音聊天室平台源码覆盖社交、娱乐、直播、电商等多种泛互联网行业应用场景。语音聊天室平台源码可按需搭建直播系统,尤其是语音直播,是当下比较流行的直播产品,语音直播与其他直播不同点在于语音直播是通过声音传递,而无需出现在画面里,并且听众也不需要占用时间,可以边听直播边做其他,更加解放了双手双眼。
布谷鸟小刘
2021/03/12
1.1K0
视频直播源码技术知识分享:连麦功能(一)
在讲今天的视频直播源码技术知识之前,我想为大家另外说一个知识引出今天的话题,这个知识就是传统直播与现代视频直播的区别:传统直播通常是指通过电视、广播等媒体,将活动、演出等活动在现场传递给观众的方式;而现代网络直播是指通过网络、移动应用等平台将多种内容传递给观众,包括新闻、音乐演出、直播带货等活动。而不管是那种直播方式都有一个重要的环节,那就是与粉丝观众进行互动,而传统直播的互动方式需要台上活动人员做出动作,观众接收动作进行回应,包括语言与肢体动作,而语言进行互动需要台上人员或是工作人员拿话筒去进行互动的观众以便于让台上演出人员和台下都能听清互动内容;现代视频直播互动方式则更丰富,比如直播聊天区观众去发言,主播看到观众发言进行评论或者回答;又比如观众送礼物、点赞,主播进行感谢。而我今天要讲的不同于这两种现代视频直播互动方式,是指主播与观众进行类似于电话聊天,进行实时视频或者语音聊天。说到这里,差不多引出了我们今天要分享的功能知识,可能也有很多人猜到这个功能是什么了,没错,下面就进入我们今天要分享的功能知识:视频直播源码技术连麦功能!
山东布谷科技小魏
2023/06/21
4410
视频直播源码技术知识分享:连麦功能(一)
情绪用心听 | 语音直播设计探索
情绪就像嵌在基因中的开关,一旦开启,就会直接影响人类的行为。很多时候我们会发现,用户喜欢的不是产品本身,而是产品所属的场景,以及场景带给他们的情绪。 PART 01 情绪是促成转化的关键 新的时代对产品有新的要求。在产品的数量和品质都得到极大提升的前提下,心理满足跃居前列。好的产品让人心理满足,其实就是情绪满足。在对的时间带给用户对的情绪,可以有效地促进用户做出正确的决策与反应。 人的情绪是非常丰富的,按照大的类别可以分为积极情绪与消极情绪,按照强度可以分为高唤醒情绪和低唤醒情绪。情绪会产生行为,
腾讯ISUX
2020/12/24
8620
声网SDK携手荔枝FM打造语音直播,支持万人同时连麦
目前,荔枝FM拥有600 万日活跃用户, 200 万播客,以及5000万期原创音频节目,播客数量、内容时长、内容数量均位居全网第一。 尽管荔枝FM强调语音直播并不是一次转型,但做直播的确为平台上原有的
BestSDK
2018/03/01
2.8K0
声网SDK携手荔枝FM打造语音直播,支持万人同时连麦
推荐阅读
相关推荐
语音直播系统源码的功能跟组成
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验