MySQL性能优化完全指南:20个核心技巧与实战解决方案深度剖析
文章目录
一、MySQL性能优化基础概念
1.1 什么是数据库性能优化
数据库性能优化是指通过调整数据库系统配置、优化SQL查询语句、改进数据库架构设计等手段,提高数据库系统的响应速度、吞吐量和资源利用率的过程。从技术角度看,MySQL性能优化主要包含三个层面:
- 查询优化:优化单个SQL语句的执行效率
- 架构优化:优化数据库的整体结构和配置
- 资源优化:合理分配和管理系统资源
从用户体验角度,性能优化意味着:
- 更快的页面加载速度
- 更高的系统并发处理能力
- 更稳定的服务质量
1.2 性能优化的核心指标
衡量MySQL性能的关键指标包括:
| 指标名称 | 描述 | 理想值 |
|---|---|---|
| QPS (Queries Per Second) | 每秒查询次数,反映数据库处理能力 | 根据业务需求,通常越高越好 |
| TPS (Transactions Per Second) | 每秒事务数,对于OLTP系统尤为重要 | 根据业务需求 |
| 响应时间 | 从发出请求到收到响应的时间 | 95%的请求<100ms |
| 连接时间 | 建立数据库连接所需时间 | <50ms |
| 并发连接数 | 同时处理的连接数量 | 根据服务器配置调整 |
| 缓存命中率 | InnoDB缓冲池命中率 | >98% |
数学表达式上,我们可以用以下公式表示QPS和TPS的关系:
QPS = ∑ i = 1 n Query i Time TPS = ∑ j = 1 m Transaction j Time \text{QPS} = \frac{\sum_{i=1}^{n} \text{Query}_i}{\text{Time}} \\ \text{TPS} = \frac{\sum_{j=1}^{m} \text{Transaction}_j}{\text{Time}} QPS=Time∑i=1nQueryiTPS=Time∑j=1mTransactionj
其中n是查询总数,m是事务总数,Time是统计时间窗口。
1.3 MySQL体系结构回顾
理解MySQL的体系结构是性能优化的基础。MySQL主要包含以下核心组件:
- 连接层:处理客户端连接、授权认证等
- 服务层:包含查询解析、分析、优化、缓存等
- 存储引擎层:负责数据的存储和提取(如InnoDB、MyISAM)
- 文件系统层:实际存储数据的文件
优化时需要针对不同层级采取不同策略。例如:
- 连接层:优化连接池配置
- 服务层:优化查询缓存、SQL语句
- 存储引擎层:优化InnoDB缓冲池
- 文件系统层:优化磁盘I/O
二、查询性能优化技巧
2.1 EXPLAIN命令深度解析
EXPLAIN是分析查询性能最基础且最重要的工具,它可以显示MySQL如何执行SQL语句。
2.1.1 EXPLAIN基础使用
EXPLAIN SELECT * FROM users WHERE age > 25 AND status = 'active';
执行结果示例:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | users | range | age_status | age_status | 5 | NULL | 126 | Using where |
2.1.2 EXPLAIN各列详解
- id:查询标识符,相同id表示同一执行层级,不同id表示子查询,id越大优先级越高
- select_type:
- SIMPLE:简单SELECT(不含UNION或子查询)
- PRIMARY:最外层查询
- SUBQUERY:子查询中的第一个SELECT
- DERIVED:派生表的SELECT(FROM子句中的子查询)
- table:访问的表名
- type(非常重要):
- system:表只有一行
- const:通过主键或唯一索引查询,最多返回一行
- eq_ref:关联查询时,使用主键或唯一索引关联
- ref:使用非唯一索引查找
- range:索引范围扫描
- index:全索引扫描
- ALL:全表扫描(需优化)
- possible_keys:可能使用的索引
- key:实际使用的索引
- key_len:使用的索引长度(字节)
- ref:与索引比较的列或常量
- rows:预估需要检查的行数
- Extra:额外信息
- Using index:覆盖索引
- Using where:使用WHERE过滤
- Using temporary:使用临时表
- Using filesort:额外排序
2.1.3 EXPLAIN实战案例
分析一个复杂查询:
EXPLAIN
SELECT u.name, o.order_count
FROM users u
JOIN (
SELECT user_id, COUNT(*) as order_count
FROM orders
WHERE order_date > '2023-01-01'
GROUP BY user_id
) o ON u.id = o.user_id
WHERE u.status = 'active'
ORDER BY o.order_count DESC;
这个查询中我们可以看到:
- 派生表查询(DERIVED)
- 关联查询(JOIN)
- 分组(GROUP BY)
- 排序(ORDER BY)
通过EXPLAIN分析每个步骤的执行效率,找出可能的性能瓶颈。
2.2 索引优化策略
2.2.1 索引基础与类型
MySQL支持多种索引类型:
- B-Tree索引:最常用,适合全值匹配、范围查询等
- 哈希索引:精确匹配快,不支持范围查询
- 全文索引:用于文本搜索
- 空间索引:用于地理数据
创建索引语法:
-- 单列索引
CREATE INDEX idx_name ON users(name);
-- 多列索引
CREATE INDEX idx_age_status ON users(age, status);
-- 唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);
-- 前缀索引(字符串列)
CREATE INDEX idx_name_prefix ON users(name(10));
2.2.2 索引选择原则
-
高选择性原则:选择区分度高的列建索引。区分度计算公式:
选择性 = 不重复的索引值数量 总记录数 \text{选择性} = \frac{\text{不重复的索引值数量}}{\text{总记录数}} 选择性=总记录数不重复的索引值数量
选择性越接近1越好。
-
最左前缀原则:对于复合索引(a,b,c),可以用于:
- WHERE a=?
- WHERE a=? AND b=?
- WHERE a=? AND b=? AND c=?
但不能用于: - WHERE b=?
- WHERE b=? AND c=?
-
覆盖索引:索引包含所有查询字段,避免回表。
-- 使用覆盖索引 SELECT id, name FROM users WHERE name LIKE '张%'; -- 需要回表 SELECT id, name, email FROM users WHERE name LIKE '张%';
2.2.3 索引优化实战
场景:优化用户订单查询
-- 原始查询
SELECT * FROM orders
WHERE user_id = 100 AND order_date > '2023-01-01'
ORDER BY create_time DESC;
-- 优化方案
-- 1. 创建复合索引
CREATE INDEX idx_user_date_created ON orders(user_id, order_date, create_time);
-- 2. 改写查询(确保索引使用)
SELECT * FROM orders
WHERE user_id = 100 AND order_date > '2023-01-01'
ORDER BY create_time DESC
LIMIT 100;
分析:
- 索引包含所有WHERE和ORDER BY字段
- user_id在前因为它在WHERE中是等值条件
- order_date是范围查询,放在第二
- create_time用于排序
2.2.4 索引失效场景
-
使用函数或表达式:
-- 索引失效 SELECT * FROM users WHERE YEAR(create_time) = 2023; -- 优化后 SELECT * FROM users WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'; -
隐式类型转换:
-- 假设user_id是字符串类型 SELECT * FROM users WHERE user_id = 100; -- 索引失效 SELECT * FROM users WHERE user_id = '100'; -- 使用索引 -
使用OR条件:
-- 索引可能失效 SELECT * FROM users WHERE name = '张三' OR age = 25; -- 优化方案 SELECT * FROM users WHERE name = '张三' UNION ALL SELECT * FROM users WHERE age = 25 AND name != '张三'; -
LIKE以通配符开头:
SELECT * FROM users WHERE name LIKE '%张'; -- 索引失效 SELECT * FROM users WHERE name LIKE '张%'; -- 使用索引
2.3 查询重写优化
2.3.1 避免SELECT *
-- 不推荐
SELECT * FROM users WHERE age > 25;
-- 推荐
SELECT id, name, age FROM users WHERE age > 25;
优点:
- 减少网络传输量
- 更可能使用覆盖索引
- 表结构变更时更安全
2.3.2 LIMIT优化
-- 低效(偏移量大时)
SELECT * FROM users ORDER BY id LIMIT 100000, 20;
-- 优化方案1:使用索引覆盖
SELECT * FROM users WHERE id >= (SELECT id FROM users ORDER BY id LIMIT 100000, 1) LIMIT 20;
-- 优化方案2:记录最后位置
SELECT * FROM users WHERE id > 100000 ORDER BY id LIMIT 20;
2.3.3 JOIN优化
-
小表驱动大表原则:
-- 假设users是小表,orders是大表 SELECT * FROM users u JOIN orders o ON u.id = o.user_id; -
确保关联字段有索引:
-- orders.user_id应有索引 CREATE INDEX idx_user_id ON orders(user_id); -
避免多重嵌套JOIN:
-- 复杂JOIN难以优化 SELECT * FROM a JOIN b ON a.id = b.a_id JOIN c ON b.id = c.b_id; -- 可考虑拆分为多个查询
2.3.4 子查询优化
-- 原始查询
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 1000);
-- 优化为JOIN
SELECT DISTINCT u.* FROM users u JOIN orders o ON u.id = o.user_id WHERE o.amount > 1000;
-- 或者使用EXISTS
SELECT * FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id AND o.amount > 1000);
三、MySQL配置优化
3.1 内存配置优化
3.1.1 InnoDB缓冲池配置
InnoDB缓冲池是MySQL最重要的内存区域,用于缓存表数据和索引。
-- 查看当前配置
SHOW VARIABLES LIKE 'innodb_buffer_pool%';
-- 推荐设置为可用内存的50-70%
-- 在my.cnf中设置
[mysqld]
innodb_buffer_pool_size = 12G # 根据服务器内存调整
innodb_buffer_pool_instances = 8 # 对于大缓冲池,分成多个实例减少争用
缓冲池命中率检查:
-- 计算命中率
SELECT
(1 - (SELECT variable_value FROM performance_schema.global_status WHERE variable_name = 'Innodb_buffer_pool_reads') /
(SELECT variable_value FROM performance_schema.global_status WHERE variable_name = 'Innodb_buffer_pool_read_requests')) * 100
AS buffer_pool_hit_ratio;
理想情况下命中率应>95%。如果低于此值,应考虑增加缓冲池大小。
3.1.2 其他内存配置
# 查询缓存(MySQL 8.0已移除)
# query_cache_size = 0
# 排序缓冲
sort_buffer_size = 4M # 每个连接单独分配,不宜过大
# 连接缓冲
join_buffer_size = 4M # 用于无法使用索引的JOIN操作
# 临时表内存
tmp_table_size = 64M
max_heap_table_size = 64M # 应保持与tmp_table_size相同
# 线程缓存
thread_cache_size = 16 # 减少连接创建开销
3.2 I/O配置优化
3.2.1 日志文件配置
# InnoDB重做日志
innodb_log_file_size = 512M # 通常设置为缓冲池的25%左右
innodb_log_files_in_group = 2 # 通常2-4个文件
innodb_log_buffer_size = 16M # 用于未写入日志文件的缓冲
# 二进制日志(复制和恢复)
binlog_format = ROW # 推荐使用ROW格式
sync_binlog = 1 # 1最安全但性能较低,可设置为100-1000平衡性能和安全
expire_logs_days = 7 # 自动清理旧日志
3.2.2 磁盘I/O策略
# InnoDB I/O配置
innodb_flush_method = O_DIRECT # 避免双重缓冲
innodb_io_capacity = 2000 # 根据磁盘IOPS能力设置
innodb_io_capacity_max = 4000 # 突发时最大IO容量
innodb_flush_neighbors = 0 # SSD磁盘建议关闭
3.3 并发配置优化
# 连接数配置
max_connections = 500 # 根据应用需求调整
back_log = 100 # 等待连接的队列大小
# InnoDB并发
innodb_thread_concurrency = 0 # 0表示不限制
innodb_read_io_threads = 8 # 读线程数
innodb_write_io_threads = 8 # 写线程数
四、数据库架构优化
4.1 表设计优化
4.1.1 数据类型选择
-
整数类型:
- TINYINT(1字节)
- SMALLINT(2字节)
- MEDIUMINT(3字节)
- INT(4字节)
- BIGINT(8字节)
选择能满足需求的最小类型。
-
字符串类型:
- CHAR:定长字符串(如MD5值)
- VARCHAR:变长字符串
- TEXT:大文本
-
时间类型:
- TIMESTAMP:4字节,时区相关
- DATETIME:8字节,时区无关
4.1.2 规范化与反规范化
规范化(减少冗余):
- 优点:数据一致性高,更新容易
- 缺点:需要更多JOIN操作
反规范化(适当冗余):
- 优点:减少JOIN,提高查询性能
- 缺点:更新复杂,可能数据不一致
4.1.3 分区表设计
-- 按范围分区
CREATE TABLE sales (
id INT NOT NULL,
sale_date DATE NOT NULL,
amount DECIMAL(10,2) NOT NULL,
PRIMARY KEY (id, sale_date)
) PARTITION BY RANGE (YEAR(sale_date)) (
PARTITION p2020 VALUES LESS THAN (2021),
PARTITION p2021 VALUES LESS THAN (2022),
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
-- 按列表分区
CREATE TABLE users (
id INT NOT NULL,
region_id INT NOT NULL,
name VARCHAR(100),
PRIMARY KEY (id, region_id)
) PARTITION BY LIST (region_id) (
PARTITION p_east VALUES IN (1, 2, 3),
PARTITION p_west VALUES IN (4, 5, 6),
PARTITION p_other VALUES IN (DEFAULT)
);
4.2 读写分离架构
4.2.1 主从复制配置
-
主库配置(my.cnf):
[mysqld] server-id = 1 log_bin = mysql-bin binlog_format = ROW sync_binlog = 1 -
从库配置:
[mysqld] server-id = 2 relay_log = mysql-relay-bin read_only = ON -
设置复制:
-- 在主库创建复制用户 CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; -- 查看主库状态 SHOW MASTER STATUS; -- 在从库配置复制 CHANGE MASTER TO MASTER_HOST='master_host', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=12345; START SLAVE; -- 检查复制状态 SHOW SLAVE STATUS\G
4.2.2 读写分离实现
可以使用中间件如ProxySQL或应用层实现:
-- 应用层代码示例(伪代码)
function query(sql) {
if (isReadQuery(sql)) {
// 路由到从库
return slaveConnection.query(sql);
} else {
// 路由到主库
return masterConnection.query(sql);
}
}
4.3 分库分表策略
4.3.1 水平分表
-- 用户表按ID范围分表
CREATE TABLE users_0 (
id INT PRIMARY KEY,
name VARCHAR(100),
CHECK (id >= 0 AND id < 100000)
);
CREATE TABLE users_1 (
id INT PRIMARY KEY,
name VARCHAR(100),
CHECK (id >= 100000 AND id < 200000)
);
-- 查询时确定表名
SELECT * FROM users_{id DIV 100000} WHERE id = ?;
4.3.2 垂直分表
-- 将大表拆分为常用字段和不常用字段
CREATE TABLE users_basic (
id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100),
last_login DATETIME
);
CREATE TABLE users_detail (
user_id INT PRIMARY KEY,
address TEXT,
bio TEXT,
preferences JSON,
FOREIGN KEY (user_id) REFERENCES users_basic(id)
);
五、监控与维护
5.1 性能监控工具
5.1.1 Performance Schema
-- 查看最耗时的SQL
SELECT digest_text, count_star, avg_timer_wait/1000000000 as avg_ms
FROM performance_schema.events_statements_summary_by_digest
ORDER BY sum_timer_wait DESC
LIMIT 10;
-- 查看表I/O统计
SELECT * FROM performance_schema.table_io_waits_summary_by_table
WHERE object_schema NOT IN ('mysql', 'performance_schema')
ORDER BY sum_timer_wait DESC;
5.1.2 Sys Schema
-- 查看内存使用
SELECT * FROM sys.memory_global_total;
-- 查看未使用索引
SELECT * FROM sys.schema_unused_indexes;
-- 查看IO统计
SELECT * FROM sys.io_global_by_file_by_bytes;
5.2 慢查询日志分析
# my.cnf配置
slow_query_log = ON
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1 # 超过1秒的查询
log_queries_not_using_indexes = ON
使用pt-query-digest分析慢日志:
pt-query-digest /var/log/mysql/mysql-slow.log > slow_report.txt
5.3 定期维护任务
-
表维护:
ANALYZE TABLE users; # 更新索引统计信息 OPTIMIZE TABLE large_table; # 重建表,整理碎片 -
索引维护:
-- 查找重复索引 SELECT * FROM sys.schema_redundant_indexes; -- 删除无用索引 DROP INDEX idx_name ON table_name; -
数据归档:
-- 将历史数据移动到归档表 INSERT INTO orders_archive SELECT * FROM orders WHERE order_date < DATE_SUB(NOW(), INTERVAL 1 YEAR); DELETE FROM orders WHERE order_date < DATE_SUB(NOW(), INTERVAL 1 YEAR);
六、常见问题解决方案
6.1 连接数过多
-- 查看当前连接
SHOW PROCESSLIST;
-- 查看连接来源
SELECT user, host, count(*) as connections
FROM information_schema.processlist
GROUP BY user, host
ORDER BY connections DESC;
-- 解决方案
1. 优化应用连接池配置
2. 增加max_connections
3. 设置连接超时(wait_timeout)
4. 使用连接池中间件
6.2 锁等待超时
-- 查看当前锁
SELECT * FROM performance_schema.events_waits_current
WHERE event_name LIKE '%lock%';
-- 查看锁等待
SELECT * FROM sys.innodb_lock_waits;
-- 解决方案
1. 优化事务,减少事务大小和持续时间
2. 合理设计索引,减少锁范围
3. 调整隔离级别(如READ COMMITTED)
4. 使用乐观锁替代悲观锁
6.3 CPU使用率高
诊断步骤:
- 使用SHOW PROCESSLIST查看正在执行的查询
- 检查慢查询日志
- 使用EXPLAIN分析问题查询
- 检查是否有全表扫描
解决方案:
- 优化问题查询
- 增加适当索引
- 考虑读写分离
- 升级硬件
6.4 内存不足
诊断:
-- 查看内存使用
SELECT * FROM sys.memory_global_by_current_bytes;
-- InnoDB缓冲池使用
SELECT * FROM sys.innodb_buffer_stats_by_schema;
解决方案:
- 增加innodb_buffer_pool_size
- 优化查询减少内存使用
- 降低sort_buffer_size等连接级内存参数
- 增加服务器内存
七、高级优化技巧
7.1 查询重写与优化器提示
-- 使用FORCE INDEX
SELECT * FROM orders FORCE INDEX(idx_user_date)
WHERE user_id = 100 AND order_date > '2023-01-01';
-- 使用STRAIGHT_JOIN指定JOIN顺序
SELECT STRAIGHT_JOIN a.* FROM small_table a JOIN large_table b ON a.id = b.a_id;
-- 使用优化器提示
SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM large_table;
SELECT /*+ INDEX(users idx_age) */ * FROM users WHERE age > 25;
7.2 批量操作优化
-- 低效:逐行插入
INSERT INTO users (name) VALUES ('张三');
INSERT INTO users (name) VALUES ('李四');
-- 高效:批量插入
INSERT INTO users (name) VALUES ('张三'), ('李四'), ('王五');
-- 批量更新
UPDATE users SET status = 'active' WHERE id IN (1, 2, 3, 4, 5);
-- 使用CASE批量更新不同值
UPDATE users SET
status = CASE id
WHEN 1 THEN 'active'
WHEN 2 THEN 'inactive'
ELSE status
END
WHERE id IN (1, 2);
7.3 临时表与内存表
-- 使用内存临时表
CREATE TEMPORARY TABLE temp_users (
id INT PRIMARY KEY,
name VARCHAR(100)
) ENGINE=MEMORY;
-- 使用临时表优化复杂查询
CREATE TEMPORARY TABLE temp_orders AS
SELECT user_id, SUM(amount) as total FROM orders GROUP BY user_id;
SELECT u.name, t.total
FROM users u JOIN temp_orders t ON u.id = t.user_id
ORDER BY t.total DESC;
八、MySQL 8.0新特性优化
8.1 窗口函数
-- 计算每个用户的订单排名
SELECT
user_id,
order_id,
amount,
RANK() OVER (PARTITION BY user_id ORDER BY amount DESC) as rank_in_user
FROM orders;
-- 移动平均计算
SELECT
date,
amount,
AVG(amount) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as moving_avg
FROM daily_sales;
8.2 通用表表达式(CTE)
-- 使用CTE简化复杂查询
WITH user_orders AS (
SELECT user_id, COUNT(*) as order_count
FROM orders
GROUP BY user_id
),
active_users AS (
SELECT id, name
FROM users
WHERE status = 'active'
)
SELECT a.name, u.order_count
FROM active_users a
JOIN user_orders u ON a.id = u.user_id
ORDER BY u.order_count DESC;
8.3 不可见索引
-- 测试删除索引的影响而不实际删除
ALTER TABLE users ALTER INDEX idx_name INVISIBLE;
-- 如果性能无影响,再实际删除
ALTER TABLE users DROP INDEX idx_name;
九、云数据库优化考量
9.1 云数据库特性利用
- 只读实例:将读查询路由到只读实例
- 自动扩展:根据负载自动调整资源
- 托管服务:利用提供的监控和优化工具
9.2 跨可用区部署
- 配置跨AZ同步复制
- 考虑延迟影响
- 合理设置超时时间
9.3 成本优化
- 合理选择实例规格
- 利用定时降配(非高峰时段降低配置)
- 数据归档减少存储成本
十、优化案例研究
10.1 电商平台订单查询优化
问题:订单查询在促销期间变慢,响应时间超过5秒。
分析:
- 使用EXPLAIN分析发现全表扫描
- 查询条件包括user_id、order_date、status
- 排序字段为create_time
- 返回字段包含所有列
优化方案:
- 创建复合索引:(user_id, order_date, status, create_time)
- 只查询必要字段
- 添加分页限制
优化后查询:
SELECT order_id, create_time, total_amount
FROM orders
WHERE user_id = 100
AND order_date > '2023-01-01'
AND status = 'completed'
ORDER BY create_time DESC
LIMIT 20;
效果:响应时间从5秒降至50毫秒。
10.2 社交网络好友动态查询
问题:好友动态查询随着用户关系增长变慢。
优化方案:
- 使用反范式设计预生成动态时间线
- 实现分页基于游标而非偏移量
- 使用Redis缓存热门动态
10.3 物联网时间序列数据
问题:设备传感器数据量巨大,写入和查询都变慢。
解决方案:
- 按设备ID和时间范围分表
- 使用压缩表减少存储空间
- 对历史数据使用列式存储引擎
- 实现数据降采样(原始数据+聚合数据)
十一、优化检查清单
11.1 日常优化检查项
- 监控慢查询日志
- 检查未使用索引
- 验证缓冲池命中率
- 检查锁等待
- 监控连接数
11.2 新项目优化设计清单
- 选择合适的数据类型
- 设计适当的索引策略
- 规划分库分表策略
- 设计缓存策略
- 规划监控方案
十二、总结与最佳实践
12.1 MySQL优化黄金法则
- 测量第一:优化前先测量性能瓶颈
- 索引为王:合理设计索引解决大多数性能问题
- 查询为本:优化SQL语句是性价比最高的方式
- 配置为辅:适当调整配置参数
- 架构为基:良好的架构设计是性能基础
12.2 持续优化文化
- 建立性能基准
- 实施持续监控
- 定期审查优化
- 建立性能测试流程
- 培养团队优化意识
通过本文的20个核心优化技巧和实战解决方案,您应该能够系统地提升MySQL数据库性能。记住,优化是一个持续的过程,需要根据业务发展和技术演进不断调整策略。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)