-
当我们需要在 MySQL 中高效地执行查询操作时,索引就变得非常重要了。索引是一种数据结构,它可以加速数据库查询操作的速度。在本文中,我们将讨论 MySQL 索引的基础知识,包括什么是索引,为什么需要索引以及如何创建和使用索引。什么是索引?索引是一种数据结构,用于加速数据库中的查询操作。索引通常是由一个或多个列组成的数据结构,这些列存储了表中的数据值以及指向存储该数据值的物理位置的指针。通过使用索引,MySQL 可以快速定位需要查询的数据,而不必扫描整个表格。在 MySQL 中,可以使用不同类型的索引,包括B树索引、哈希索引、全文索引等。其中,B树索引是最常见的一种索引类型。为什么需要索引?索引可以提高数据库的查询性能。如果没有索引,当需要查找表中的某一行时,MySQL 必须扫描整个表格以查找所需的行,这可能会花费大量的时间,尤其是在大型数据集上。使用索引可以帮助 MySQL 更快地查找数据,因为它们允许 MySQL 跳过不需要的行,只扫描那些与查询条件匹配的行。这意味着,使用索引可以极大地提高查询的效率,减少查询所需的时间和资源。如何创建索引?在 MySQL 中,可以使用 CREATE INDEX 语句来创建索引。以下是一个基本的 CREATE INDEX 语句的示例:CREATE INDEX index_name ON table_name (column_name);在这个例子中,index_name 是要创建的索引的名称,table_name 是要创建索引的表格的名称,而 column_name 是要为其创建索引的列的名称。可以根据需要在单个索引中包含多个列。更为详细的建立索引的语句普通索引新建表中create table t_dept( index index_no(no) )在已建表中添加索引create index index_name on t_dept(name);以修改表的方式添加索引alter table t_dept add index index_name(name);前缀索引新建表中create table t_dept( index index_no(no(2 )) )在已建表中添加索引create index index_name on t_dept(name(2));以修改表的方式添加索引alter table t_dept add index index_name(name(2));如果前缀区分度太小可以采用倒叙存储(比如说一个县的身份证号前5位都一样,这时可以采用倒叙存储)新建hash字段唯一索引新建表create table t_dept( unique index index_no(no) )在已建表中添加索引create unique index index_name on t_dept(name);以修改表的方式添加alter table t_dept add unique index index_name(name);联合索引新建表create table t_dept( key index_no_name(no,name) )在已建表中添加索引create index index_name on t_dept(name,no)以修改表的方式添加索引alter table t_dept add index index_name_no(name,no);
-
前言在数字化时代,数据被认为是企业最宝贵的资产之一。然而,当数据量急剧增长时,传统的数据库架构可能显得力不从心。分库分表作为一种优化手段,不仅仅是技术的迭代,更是对系统性能和扩展性的深刻思考。让我们一起揭开分库分表的神秘面纱,探讨这一技术背后的逻辑和价值。为什么分库分表是必要的分库分表是数据库架构中的一种设计模式,主要是为了应对数据量的快速增长、单一数据库的性能瓶颈以及避免数据倾斜和热点问题。让我详细解释一下:数据量的快速增长: 随着业务的发展,数据量通常会迅速增长。单一数据库处理大量数据可能导致查询和事务性能下降,因为数据库引擎需要处理更多的数据。通过分库分表,可以将数据分散存储在不同的数据库或表中,从而减轻单一数据库的负担,提高整体性能。单一数据库的性能瓶颈: 单一数据库服务器有其性能限制,无法无限制地扩展。当数据库服务器的性能达到极限时,无法通过简单的升级硬件来解决问题。通过分库分表,可以在多个数据库服务器上分布数据和负载,从而水平扩展系统,提高整体性能。避免数据倾斜和热点问题: 在某些情况下,特定的数据可能会被频繁访问,导致数据倾斜和热点问题。这会使得部分数据库或表的负载较大,而其他部分相对空闲。通过分库分表,可以将数据均匀分布,避免热点问题,提高系统的平衡性和稳定性。总体而言,分库分表是为了更好地应对大规模数据和高并发访问的挑战,使系统能够水平扩展,提高性能、稳定性和可扩展性。在实施分库分表的过程中,对代码的实现要有详细的注释,以便团队成员能够理解和维护这种复杂的架构。分库分表的基本概念和原理分库分表的基本概念和原理:分库: 将数据存储在不同的数据库实例中。每个数据库实例独立运行,有独立的连接池和资源。这种划分通常基于业务功能、租户、地理位置等因素。分表: 将同一表中的数据按照某种规则划分存储到不同的物理表中。这样的切分可以基于数据的某个特定字段,如时间范围、用户ID等。水平切分与垂直切分的区别:水平切分: 水平切分是按照某种规则将数据行分散到不同的数据库表或实例中。主要解决数据量大的问题,每个数据库/表只存储部分数据,使得单个数据库/表的数据量较小,提高查询和写入性能。垂直切分: 垂直切分是将同一表中的不同列拆分到不同的表中。这种切分可以根据列的使用频率、业务逻辑等因素进行。垂直切分的优势在于可以将经常使用的列和不经常使用的列分开存储,提高查询效率。分库分表的常见策略和算法:按范围分片: 将数据按照某个范围划分到不同的库或表中,例如按时间范围、数字范围等。这适用于按时间进行数据归档或按业务区域划分的场景。按哈希分片: 使用哈希算法将数据分片到不同的库或表中,确保数据分布均匀。这种方法通常用于解决热点问题,但可能导致查询时需要在多个分片上执行。按业务规则分片: 根据业务规则将数据分片,例如按用户ID、订单ID等关键业务字段。这种策略通常需要考虑业务逻辑和查询模式。一主多从: 一个主库负责写操作,多个从库用于读操作,通过主从复制实现数据同步。这种方式提高了读写分离性能,但可能引入一定的数据同步延迟。分布式事务处理: 在分库分表的环境下,确保跨库事务的一致性可能需要采用分布式事务的方案,如两阶段提交或基于消息队列的异步处理。实施分库分表需要综合考虑业务需求、数据分布、查询模式等因素,选择合适的策略和算法。同时,在代码实现过程中,需要加入注释,清晰地说明分库分表的设计思路和具体实现方式。性能提升和负载均衡性能提升和负载均衡是分布式系统中关键的概念,尤其在分库分表的情境下更为重要。下面是关于性能提升和负载均衡的一些方法:数据访问的并行性提高:并发连接池: 使用并发连接池管理数据库连接,允许多个数据库连接同时执行查询和更新操作,从而提高数据访问的并行性。异步处理: 使用异步编程模型,如异步IO或异步框架,能够在等待IO操作的同时执行其他任务,从而提高系统的吞吐量和响应速度。缓存机制: 使用缓存来减轻数据库的压力。缓存可以存储频繁访问的数据,减少对数据库的请求次数,提高响应速度。降低单库负载,提高系统响应速度:读写分离: 将读操作和写操作分别分配到不同的数据库实例,通过主从复制等机制保持数据一致性。这可以降低单一数据库的负载,提高系统的整体性能。负载均衡: 使用负载均衡器将请求分发到多个数据库实例上,确保每个数据库实例的负载相对均衡。负载均衡器可以基于轮询、最小连接数等策略进行请求分发。实现负载均衡和高可用性:负载均衡器: 部署负载均衡器,它可以分发用户请求到多个服务器上,确保各服务器的负载相对均衡。常见的负载均衡器有Nginx、HAProxy等。分布式架构: 采用分布式架构,将系统拆分成多个服务或模块,通过负载均衡分发请求。每个服务可以独立部署和扩展,提高系统的可伸缩性。故障转移和备份: 设置故障转移机制,当某个节点或服务不可用时,请求可以被自动切换到其他可用节点。同时,备份关键数据和配置,确保在发生故障时能够迅速恢复服务。监控和自动化: 使用监控系统实时监测系统性能和健康状况。自动化工具可以在检测到故障或性能下降时进行自动响应,提高系统的稳定性和可用性。在实施这些策略时,务必在代码中添加详细的注释,以便团队成员理解和维护系统的架构和配置。
-
有了关系型数据库为什么还需要NOSQL
-
在Java工程中配置Log4j2以统一管理openGauss(或其他数据库)的控制台输出日志,通常需要以下几个步骤:1. 引入Log4j2依赖首先,确保你的Java项目中已经包含了Log4j2的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖:<dependencies> <!-- Log4j2 Core --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>你的Log4j2版本</version> </dependency> <!-- Log4j2 API --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>你的Log4j2版本</version> </dependency> <!-- 如果需要异步日志记录 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <artifactId>log4j-jul</artifactId> <!-- Java Util Logging Bridge --> <version>你的Log4j2版本</version> </dependency> </dependencies>请替换你的Log4j2版本为实际的Log4j2版本号。2. 配置Log4j2创建一个log4j2.xml配置文件,通常放在src/main/resources目录下。这个文件将定义Log4j2的行为,包括日志的级别、输出格式和目标位置(如控制台、文件等)。以下是一个简单的log4j2.xml示例,用于将日志输出到控制台:<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> <!-- 为openGauss相关的日志设置单独的Logger(可选) --> <Logger name="com.yourpackage.openGauss" level="debug" additivity="false"> <AppenderRef ref="Console"/> </Logger> </Loggers> </Configuration>在这个配置中,%d{yyyy-MM-dd HH:mm:ss}是日期时间格式,%-5p是日志级别,%c{1}是日志记录器的名称,%L是日志输出的行号,%m是日志消息,%n是换行符。注意,<Logger>标签中的name属性应该设置为你的openGauss相关代码的包名或类名前缀,以便只捕获这些日志。3. 在Java代码中使用Log4j2在你的Java代码中,使用Log4j2的API来记录日志。例如:import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class OpenGaussClient { private static final Logger logger = LogManager.getLogger(OpenGaussClient.class); public static void main(String[] args) { logger.info("连接到openGauss数据库..."); // 数据库连接代码... logger.debug("数据库连接成功"); // 其他代码... } }4. 配置openGauss JDBC驱动确保你的项目中包含了openGauss的JDBC驱动,并在数据库连接代码中正确配置数据库URL、用户名和密码。5. 运行并验证运行你的Java应用程序,并观察控制台输出。你应该能够看到Log4j2记录的日志,包括openGauss相关的日志信息。注意事项确保Log4j2的配置文件(如log4j2.xml)在正确的位置(通常是src/main/resources)。如果你的应用程序是Web应用程序,你可能需要将Log4j2的配置文件放在WEB-INF/classes目录下。如果你的项目中使用了其他日志框架(如Logback、Log4j 1.x等),确保它们不会与Log4j2冲突。通常,你需要在项目的依赖管理中排除这些日志框架的依赖。根据你的需求调整Log4j2的配置,例如设置不同的日志级别、添加文件Appender等。
-
MongoDB和MySQL都是广泛使用的数据库管理系统,它们各有优缺点,适用于不同的应用场景。以下是对两者优缺点的详细分析:MongoDB的优点文档型存储:MongoDB使用文档型数据模型,以类似JSON的BSON格式存储数据。这种格式使得MongoDB非常适合处理具有复杂结构和不断变化需求的数据。灵活性:MongoDB的文档结构可以动态变化,适应快速开发和迭代场景。这减少了复杂表结构的约束,使得数据库操作更加直观和简单。高性能:MongoDB在插入非结构化数据时速度非常快,不需要进行数据的转换和映射。此外,MongoDB的写入性能特别出色,特别是在处理大量数据时。分布式架构支持:MongoDB支持自动分片,可以在多台机器之间进行数据拆分,实现水平扩展,提高存储容量和服务能力。丰富的查询功能:MongoDB提供了强大的索引机制和类似于SQL的查询语法,可以灵活地进行复杂的查询和聚合操作。MongoDB的缺点事务处理能力较弱:虽然从版本4.0开始引入了多文档事务,但与传统关系型数据库相比,MongoDB的事务处理能力仍然较弱。内存使用较高:MongoDB的内存映射存储引擎在提高性能的同时,也导致了较高的内存使用。如果服务器内存有限,可能会出现内存不足的情况。最终一致性模型:MongoDB采用最终一致性模型,在数据更新后,不同节点之间的数据可能不会立即保持一致。这对于一些对数据一致性要求极高的应用场景可能不太适用。管理复杂性:与传统关系型数据库相比,MongoDB缺乏标准化的管理工具。在数据库的配置、监控、备份恢复等方面,操作相对复杂。MySQL的优点关系型数据库:MySQL是关系型数据库,数据存储在预定义的表格中,每个表格有固定的列和数据类型。这种结构化的数据存储方式使得MySQL在处理复杂的关系数据和事务时表现出色。高性能:MySQL支持索引、缓存、并发控制等多种优化技术,能够处理大量数据,并保证高吞吐量和低延迟。易于使用:MySQL的语法简单易懂,学习成本低。同时,它提供了丰富的文档和社区支持,方便用户快速上手。稳定性和可靠性:MySQL可以在多个服务器上进行主从复制,提高了系统的可靠性和容灾性。此外,MySQL还支持集群等技术,实现高可用性和容错性。开源免费:MySQL是开源软件,可以免费使用,这使得它成为开发者和小型企业的首选数据库解决方案。MySQL的缺点不适合非结构化数据:MySQL不擅长存储非结构化数据,如多媒体文件等。对于这类数据,使用MongoDB等文档型数据库可能更为合适。扩展性受限:虽然MySQL支持水平和垂直扩展,但在面对横向扩展需求时,需要进行手动分片和管理多个数据库节点,增加了系统的复杂度和维护成本。安全性问题:MySQL的安全性相对较弱,容易受到SQL注入等攻击。需要开发者采取额外的安全措施来保护数据安全。综上所述,MongoDB和MySQL各有优缺点,选择哪种数据库取决于具体的应用场景和需求。如果需要处理大量非结构化数据、需要高并发和高可扩展性,MongoDB可能是更好的选择;如果需要高事务处理率、强数据一致性和完整性,MySQL可能更适合。
-
在数据处理能力上,MySQL和MongoDB存在显著的差异。以下是对两者数据处理能力的详细对比:一、数据模型与灵活性MySQL:MySQL是关系型数据库,数据存储在预定义的表格中,每个表格有固定的列和数据类型。这种结构化的数据存储方式使得MySQL在处理复杂的关系数据和事务时表现出色,但数据模型相对固定,不够灵活。MongoDB:MongoDB是文档型数据库,数据存储为类似JSON的文档,每个文档可以有不同的结构和字段。这种灵活性使得MongoDB非常适合存储和管理非结构化或半结构化数据,能够轻松应对数据结构频繁变化的应用场景。二、查询性能与功能MySQL:MySQL支持丰富的查询功能,包括索引、缓存、并发控制等多种优化技术,能够处理大量数据,并保证高吞吐量和低延迟。使用SQL作为主要查询语言,SQL语言在数据查询和连接操作方面非常强大,具有广泛的应用和支持。还提供了丰富的数据库功能,如触发器、存储过程、视图等,可以方便地实现复杂的业务逻辑。MongoDB:MongoDB支持丰富的查询功能,包括索引、聚合、地理空间查询等,可以满足各种查询需求。使用一种类似于SQL的查询语言(称为MQL),可以灵活地进行复杂的查询和聚合操作。支持全文搜索和文本索引,以及多种类型的索引(如单字段索引、复合索引、多键索引等),以满足不同的查询需求。三、扩展性与存储容量MySQL:支持主从复制、集群等技术,实现高可用性和容错性。扩展性支持垂直扩展(提升硬件性能)和水平扩展(分区和复制),但在面对横向扩展需求时,需要进行手动分片和管理多个数据库节点,增加了系统的复杂度和维护成本。MongoDB:支持自动分片,可以在多台机器之间进行数据拆分,实现水平扩展,提高存储容量和服务能力。通过副本集和自动故障转移机制,保证数据的高可靠性和服务的高可用性。具有良好的扩展性,可以轻松应对大数据量和高并发的应用场景。四、事务处理与数据一致性MySQL:支持完整的事务处理,包括原子性、一致性、隔离性和持久性(ACID特性)。通过严格的事务机制来保证数据的一致性和完整性,非常适合需要高事务处理率、强数据一致性和完整性的应用场景。MongoDB:在4.0版本之后支持多文档事务,但相比MySQL,事务处理能力较弱。默认配置下,数据一致性级别为最终一致性,写入操作不保证立即反映在所有节点上,可能存在一定的延迟。对于某些应用场景,尤其是对一致性要求较高的系统,可能需要通过手动配置或使用特定的写入策略来实现更高级别的一致性。综上所述,MySQL和MongoDB在数据处理能力上各有优势。MySQL适合需要高事务处理率、强数据一致性和完整性的应用场景,如金融、电子商务等;而MongoDB则更适合数据量大、数据结构多变、数据类型复杂,需要高并发和高可扩展性的应用场景,如互联网应用、物联网应用、大数据分析等。在选择数据库时,需要根据具体的应用场景和需求进行权衡和选择。
-
大家好一年马上结束了给大家带来11月份的干货合集,本次涉及springboot,springmvc,Python,MySQL,Redis,HarmonyOS等多类知识,希望可以帮助到大家。 1.使用SQL实现按每小时统计数据【转】 https://bbs.huaweicloud.com/forum/thread-0296168347647671062-1-1.html 2.MySQL获取数据库内所有表格数据总数的示例代码【转】 https://bbs.huaweicloud.com/forum/thread-02109168347516352050-1-1.html 3.Redis主从复制的实现示例【转】 https://bbs.huaweicloud.com/forum/thread-0296168346418210061-1-1.html 4.MySQL启动方式之systemctl与mysqld的对比详解【转】 https://bbs.huaweicloud.com/forum/thread-0296168346377082060-1-1.html 5.全面解析MySQL常见问题的排查与解决方法【转】 https://bbs.huaweicloud.com/forum/thread-0276168346339971051-1-1.html 6.Python代码调试Debug的实用技巧分享【转】 https://bbs.huaweicloud.com/forum/thread-0241168345445980044-1-1.html 7.Bash脚本实现实时监测登录【转】 https://bbs.huaweicloud.com/forum/thread-0241168345292684043-1-1.html 8.使用Python删除Word中表格的方法【转】 https://bbs.huaweicloud.com/forum/thread-02109168344979927049-1-1.html 9.基于Go语言实现压缩文件处理【转】 https://bbs.huaweicloud.com/forum/thread-0276168344745791050-1-1.html 10.Python实现批量图片去重【转】 https://bbs.huaweicloud.com/forum/thread-02112168344680315056-1-1.html 11.python实现二维列表的列表生成式【转】 https://bbs.huaweicloud.com/forum/thread-0296168340813812059-1-1.html 12.基于Python实现IP代理池【转】 https://bbs.huaweicloud.com/forum/thread-0276168340692413049-1-1.html 13.Gin框架中异步任务的实现【转】 https://bbs.huaweicloud.com/forum/thread-0296168340516828058-1-1.html 14.使用Go语言中的Context取消协程执行的操作代码【转】 https://bbs.huaweicloud.com/forum/thread-02109168340403402048-1-1.html 15.使用Python实现获取Apollo配置【转】 https://bbs.huaweicloud.com/forum/thread-02112168340011491055-1-1.html 16.【HarmonyOS】抖动动画方案 https://bbs.huaweicloud.com/forum/thread-02119168246419995040-1-1.html 17.【HarmonyOS】九宫格拼图游戏 https://bbs.huaweicloud.com/forum/thread-02112168246323162046-1-1.html 18.【HarmonyOS】Web组件同步与异步数据获取 https://bbs.huaweicloud.com/forum/thread-02109168246260516045-1-1.html 19.【HarmonyOS】图片下载加载方案 https://bbs.huaweicloud.com/forum/thread-02112168246161439045-1-1.html 20.【HarmonyOS】动画旋转方式比较 https://bbs.huaweicloud.com/forum/thread-0241168246072330040-1-1.html 21.Linux下的基本指令-转载 https://bbs.huaweicloud.com/forum/thread-02108167416586006015-1-1.html 22.Linux:认识文件系统-转载 https://bbs.huaweicloud.com/forum/thread-02115167416457957013-1-1.html 23.【JAVA】Spring MVC 详解-转载 https://bbs.huaweicloud.com/forum/thread-02108167416063721014-1-1.html 24.【Spring】MVC-转载 https://bbs.huaweicloud.com/forum/thread-0229167415942031022-1-1.html 25.【Spring篇】Spring中的Bean管理-转载 https://bbs.huaweicloud.com/forum/thread-02115167415823291012-1-1.html
-
在 MySQL 中,要获取数据库内所有表格的数据总数,可以编写一个查询脚本来遍历每个表并计算其行数。你可以使用 INFORMATION_SCHEMA 数据库,它包含了关于数据库元数据的表格,如 TABLES 和 COLUMNS。以下是一个示例脚本,展示了如何使用 SQL 查询和存储过程来获取所有表格的数据总数:使用 SQL 查询和脚本查询所有表的行数(直接方法,适合命令行工具)如果你只是临时需要这些信息,并且你的数据库表数量不多,可以直接在命令行工具中运行以下查询:12345678SELECT table_name AS 'Table', table_rows AS 'Rows'FROM information_schema.tablesWHERE table_schema = 'your_database_name' AND table_type = 'BASE TABLE';将 your_database_name 替换为你的实际数据库名称。table_rows 列提供了每个表的行数估算值(对于 InnoDB 表,这可能是一个估算值,而不是精确值)。使用存储过程(适合更复杂的场景)如果你只想获取所有表的总行数,可以使用以下查询:123SELECT SUM(table_rows) FROM information_schema.tables WHERE table_schema = 'your_database_name';这将返回数据库中所有表的行数总和。使用存储过程(适合更复杂的场景)如果你需要更灵活或者更复杂的处理,可以创建一个存储过程来遍历所有表并计算其行数。以下是一个示例存储过程:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556DELIMITER // -- 设置新的语句结束符为"//",以便在存储过程中使用";"而不结束整个存储过程的定义。 CREATE PROCEDURE CountAllTableRows() -- 创建一个名为CountAllTableRows的存储过程。BEGIN -- 变量声明部分 DECLARE done INT DEFAULT FALSE; -- 声明一个名为done的整型变量,用于标记游标是否读取完毕,初始值为FALSE。 DECLARE tbl_name VARCHAR(255); -- 声明一个名为tbl_name的字符串变量,用于存储当前处理的表名。 DECLARE row_count INT DEFAULT 0; -- 声明一个名为row_count的整型变量,用于临时存储行数(但在这个过程中并未使用到)。 -- 游标声明部分 DECLARE cur CURSOR FOR -- 声明一个名为cur的游标。 SELECT table_name -- 游标查询的SQL语句,从information_schema.tables中选择表名。 FROM information_schema.tables WHERE table_schema = 'your_database_name' -- 限定查询的数据库名(需要替换为实际的数据库名)。 AND table_type = 'BASE TABLE'; -- 只选择基本表(排除视图等)。 -- 继续处理游标结束时的处理器 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 当游标读取不到数据时,设置done为TRUE。 -- 临时表声明部分 CREATE TEMPORARY TABLE IF NOT EXISTS temp_row_counts ( -- 创建一个名为temp_row_counts的临时表(如果不存在)。 table_name VARCHAR(255), -- 存储表名。 row_count BIGINT -- 存储行数,使用BIGINT以支持大表。 ); -- 打开游标 OPEN cur; -- 读取循环 read_loop: LOOP -- 定义一个名为read_loop的循环。 FETCH cur INTO tbl_name; -- 从游标中读取一个表名到tbl_name变量。 IF done THEN -- 判断是否读取完毕。 LEAVE read_loop; -- 如果读取完毕,则离开循环。 END IF; -- 获取当前表的行数 SET @s = CONCAT('SELECT COUNT(*) INTO @cnt FROM ', tbl_name); -- 拼接动态SQL语句。 PREPARE stmt FROM @s; -- 准备执行动态SQL语句。 EXECUTE stmt; -- 执行动态SQL语句,结果存储在@cnt变量中。 DEALLOCATE PREPARE stmt; -- 释放动态SQL语句。 -- 将行数插入临时表 INSERT INTO temp_row_counts (table_name, row_count) VALUES (tbl_name, @cnt); -- 将表名和行数插入临时表。 END LOOP; -- 关闭游标 CLOSE cur; -- 从临时表中选择结果 SELECT * FROM temp_row_counts; -- 查询并显示临时表中的所有记录。 -- 删除临时表 DROP TEMPORARY TABLE IF EXISTS temp_row_counts; -- 删除临时表(如果存在)。END // -- 存储过程定义结束。 DELIMITER ; -- 将语句结束符重置为默认的";"。然后,你可以通过调用存储过程来获取所有表的行数:1CALL CountAllTableRows();注意事项:在实际使用存储过程之前,需要将 ‘your_database_name’ 替换为实际的数据库名称。存储过程中使用了动态SQL(通过 PREPARE 和 EXECUTE 语句),这是因为在存储过程中直接执行包含变量作为表名的SQL语句是不被允许的。临时表 temp_row_counts 用于存储每个表的行数,以便在存储过程结束时能够一次性查询并显示所有结果。使用 BIGINT 类型来存储行数,以支持可能非常大的表。敲黑板性能:对于非常大的数据库,这些方法可能非常耗时和占用资源。估算值:对于 InnoDB 表,table_rows 列可能是一个估算值,而不是精确值。如果需要精确值,必须执行 COUNT(*) 查询。权限:确保你的数据库用户有足够的权限访问 INFORMATION_SCHEMA 并执行所需的查询。
-
一、介绍最近有个这样的需求,一张有大量数据元素的表,这里就暂且举例为 student 表,现在要按照学生的首字母来进行检索学生信息。比如用户输入“ZS”,获得的学生列表的姓名第一个字拼音以“Z”开头,第二个字以“S”开头。我想这个应该大家都明白什么需求,对于这个需求我之前项目中没有遇到过,至于有没有一些搜索系统或者第三方解决这个问题,我不太清楚,下面是我就这个需求进行的实现,也为以后自己遇到类似需求做参考。二、分析以首字母来查询有两种情况:1、可以增加表字段,即将student表中添加一个firstwords字段来记录学生名的首字母,这样就可以直接拿此字段进行模糊匹配检索(name:“张三”,firstwords:"ZS")。2、不能增加表字段,工作中很多表或者数据库都是客户的或者是长时间不动的表,基本不建议修改的情况,无法增加首字母的相关字段,此时就需要用代码来实现此需求。这里只介绍第二种情况的实现,第一种情况太简单就不说了。三、实现刚开始我看需求时,我上网各种查询,发现很多方法都不能用或者说我用不好吧,不过通过阅读网上各种方法,我自己总结了一个搜索方式,测试过没发现什么问题。我们知道数据库查询时可以排序查询,比如ASC关键字排序,那么汉子是通过什么排序呢,最后通过网上查阅资料,如果存储汉字的字段编码使用的是GBK字符集的话,其采用的是拼音排序的方法,UTF-8的字符集目前我没去研究,虽然mysql存储数据基本都是utf-8,但可以在查询的时候转为GBK,一样可以查询,下面是A—Z的字符集对应汉子的范围 static { wordsMap = new HashMap<>(); wordsMap.put("a","45217,45252");wordsMap.put("b","45253,45760");wordsMap.put("c","45761,46317"); wordsMap.put("d","46318,46825");wordsMap.put("e","46826,47009");wordsMap.put("f","47010,47296"); wordsMap.put("g","47297,47613");wordsMap.put("h","47614,48118");wordsMap.put("j","48119,49061"); wordsMap.put("k","49062,49323");wordsMap.put("l","49324,49895");wordsMap.put("m","49896,50370"); wordsMap.put("n","50371,50613");wordsMap.put("o","50614,50621");wordsMap.put("p","50622,50905"); wordsMap.put("q","50906,51386");wordsMap.put("r","51387,51445");wordsMap.put("s","51446,52217"); wordsMap.put("t","52218,52697");wordsMap.put("w","52698,52979");wordsMap.put("x","52980,53640"); wordsMap.put("y","53689,54480");wordsMap.put("z","54481,55289"); }这是段代码,代码意思为每个首字母对应汉子的包含范围,比如:首字母为“a”的汉子ASC编码范围都在45217和45252之间,有了这个信息基本上也就可以完成该需求了,下面是需求实现的代码FisrtWordsSqlUtils 这个Utils类是用来存储汉子范围和拼接sql语句用的 package com.oracle; import java.util.HashMap; import java.util.Map; /** * @author WYH */ public class FisrtWordsSqlUtils { //依次从小到大排序 private static Map<String,String> wordsMap; static { wordsMap = new HashMap<>(); wordsMap.put("a","45217,45252");wordsMap.put("b","45253,45760");wordsMap.put("c","45761,46317"); wordsMap.put("d","46318,46825");wordsMap.put("e","46826,47009");wordsMap.put("f","47010,47296"); wordsMap.put("g","47297,47613");wordsMap.put("h","47614,48118");wordsMap.put("j","48119,49061"); wordsMap.put("k","49062,49323");wordsMap.put("l","49324,49895");wordsMap.put("m","49896,50370"); wordsMap.put("n","50371,50613");wordsMap.put("o","50614,50621");wordsMap.put("p","50622,50905"); wordsMap.put("q","50906,51386");wordsMap.put("r","51387,51445");wordsMap.put("s","51446,52217"); wordsMap.put("t","52218,52697");wordsMap.put("w","52698,52979");wordsMap.put("x","52980,53640"); wordsMap.put("y","53689,54480");wordsMap.put("z","54481,55289"); } /** * 拼接sql * @param str */ public static String getSql(String str){ String wordsStr = str.toLowerCase(); //排除该三个首字母,因为中文就没有以他们开头的拼音 if(str.contains("i")||str.contains("u")||str.contains("v")){ System.out.println("暂无数据"); return null; } StringBuffer sb = new StringBuffer(); for (int i = 0; i < wordsStr.length(); i++) { String c = wordsStr.charAt(i)+""; String wordsASC = wordsMap.get(c); String[] asc = wordsASC.split(","); int ASC01 = Integer.parseInt(asc[0]); int ASC02 = Integer.parseInt(asc[1]); if(i!=wordsStr.length()-1){ sb.append("CONV(HEX(SUBSTRING(CONVERT(name USING gbk ), "+(i+1)+",1)), 16, 10) BETWEEN "+ASC01+" AND "+ASC02 + " and "); }else{ sb.append("CONV(HEX(SUBSTRING(CONVERT(name USING gbk ), "+(i+1)+",1)), 16, 10) BETWEEN "+ASC01+" AND "+ASC02); } } return sb.toString(); } } sql拼接代码中:“CONV,HEX,SUBSTRING,CONVERT”这几个是数据库的一些函数,整体意思先转GBK编码,然后截取某个位置字母,然后转16进制的字符集,然后再由16进制转10进制,最终得到的就是像那个hashmap集合里面的那一串数字。后面的between and 语句就不解释了,这个不知道估计这篇文章也不会看的太不懂。上面的sql语句已经可以得到,下面是mysql数据库原生连接的方法 /** * @author WYH */ public class MySqlConnectUtil { public static Map<String,Object> getResultMap(String dbUser, String dbPwd, String orclUrl, String tableName,String mySql){ Map<String,Object> resultMap = new HashMap<>(); Connection con=null; PreparedStatement pre=null; ResultSet resultSet=null; try{ Class.forName("com.mysql.jdbc.Driver"); con= DriverManager.getConnection(orclUrl,dbUser,dbPwd); String sql="select * from "+tableName +" where " + mySql; System.out.println(sql); pre=con.prepareStatement(sql); resultSet=pre.executeQuery(); resultMap = getResultMap(resultSet); }catch(Exception ex){ ex.printStackTrace(); System.out.println("未能返回结果"); }finally{ JdbcUtil.release(con,pre,resultSet); } return resultMap; } private static Map<String,Object> getResultMap(ResultSet resultSet) throws SQLException { Map<String,Object> reusltMap = new HashMap<>(); List<Map> maps = new ArrayList<>(); ResultSetMetaData rsmd = resultSet.getMetaData(); while(resultSet.next()){ int columnCount = rsmd.getColumnCount(); Map map = new HashMap(); for (int i = 1; i <= columnCount; i++) { Object object = resultSet.getObject(i); String columnName = rsmd.getColumnName(i); String columnTypeName = rsmd.getColumnTypeName(i).toLowerCase(); if(columnTypeName.equals("date")&&columnTypeName.equals("time")&&columnTypeName.equals("timestamp")){ Date date = (Date) object; long time = date.getTime(); map.put(columnName,time+""); }else { map.put(columnName, object); } } maps.add(map); } reusltMap.put("data",maps); return reusltMap; } } 这个是连接数据库的工具类,手写的原生的,如果项目中使用第三方的如mybatis等可以不用,这里我写这个也是为了测试使用,逻辑上看的更清晰一点。下面是最终测试的方法/** * @author WYH */ public class TestFirstWordsSearcher { public static void main(String[] args) { String userName = "root"; String password = "root"; String oracleUrl = "jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf-8"; String tableName = "student"; try { String sql = FisrtWordsSqlUtils.getSql("LS"); Map<String, Object> reusltMap =MySqlConnectUtil.getResultMap(userName,password,oracleUrl,tableName,sql); String s = JSON.toJSONString(reusltMap); System.out.println(s); } catch (Exception e) { e.printStackTrace(); } } }
-
前言MySQL 是当今最流行的开源关系型数据库之一,其性能、可靠性和易用性让它广泛应用于各种场景。然而,对于初学者和运维人员来说,如何正确启动 MySQL 服务可能并不是一件简单的事情。尤其是当面临不同的启动方式时,如何选择最适合的方式往往会令人困惑。本文将聚焦两种常用的 MySQL 启动方式:通过 systemctl 启动和直接使用 mysqld 启动,详细分析它们的应用场景、优缺点,并给出对比和建议。1. 使用 systemctl 启动 MySQL1.1 什么是 systemctlsystemctl 是 Linux 系统中管理系统服务和控制进程的工具,基于 systemd 服务管理框架开发。它提供了统一的服务管理接口,包括启动、停止、重启服务以及设置开机自启动等功能。MySQL 服务可以通过 systemctl 管理,这种方式通常适用于系统中已将 MySQL 安装为服务(例如通过软件包管理器安装)。1.2 systemctl 启动 MySQL 的方法以下是常见的 systemctl 启动 MySQL 的命令:1234567891011启动 MySQL 服务sudo systemctl start mysqld 停止 MySQL 服务sudo systemctl stop mysqld 重启 MySQL 服务sudo systemctl restart mysqld 查看 MySQL 服务状态sudo systemctl status mysqld这些命令需要管理员权限(通常通过 sudo 提升权限)。1.3 应用场景使用 systemctl 启动 MySQL 服务的典型场景包括:生产环境中的服务管理在生产环境中,服务的稳定性和自动化管理是核心需求。使用 systemctl 可以轻松实现 MySQL 服务的开机自启动,并通过统一的接口管理其他系统服务。需要标准化管理的服务器如果服务器中运行着多个服务,例如 Web 服务、缓存服务和 MySQL 数据库,systemctl 提供了一致的管理方式,便于运维。多用户环境在团队协作的环境中,systemctl 的统一管理方式让团队成员更容易上手并保持一致性。1.4 优缺点优点易用性强systemctl 命令简单且直观,减少了管理复杂性。支持开机自启动可以通过命令配置 MySQL 服务在系统启动时自动运行:1sudo systemctl enable mysqld日志管理便捷通过 journalctl 查看 MySQL 的运行日志:统一管理使用统一的接口管理系统中所有服务,提升运维效率。缺点灵活性较差如果需要自定义启动参数(如修改端口、开启调试模式),systemctl 的默认配置可能不够灵活,需额外修改配置文件。依赖系统服务框架如果系统的 systemd 出现问题,MySQL 服务可能无法正常启动。2. 使用 mysqld 命令直接启动 MySQL2.1 什么是 mysqldmysqld 是 MySQL 的核心服务器程序,直接运行它可以启动 MySQL 数据库服务。相比 systemctl,直接使用 mysqld 启动更贴近 MySQL 的底层运行机制,因此提供了更大的灵活性。2.2 mysqld 启动 MySQL 的方法可以直接运行以下命令启动 MySQL:1mysqld --defaults-file=/etc/my.cnf &命令中的 --defaults-file 参数指定了配置文件路径,用于加载相关参数(如数据目录、端口号等)。如果需要指定其他启动参数,例如开启调试模式或更改监听端口,可以通过命令行直接传递参数:1mysqld --port=3307 --datadir=/var/lib/mysql --log-error=/var/log/mysql/error.log &2.3 应用场景使用 mysqld 直接启动的典型场景包括:开发和测试环境在开发或测试阶段,用户可能需要频繁更改 MySQL 的运行参数,直接运行 mysqld 能更灵活地控制 MySQL 的启动行为。调试和问题排查如果需要深入分析 MySQL 的运行状态或调试 MySQL 的问题,可以通过 mysqld 直接启动并附加调试选项。临时运行 MySQL在某些临时场景下(例如运行 MySQL 的多个实例),直接使用 mysqld 可以快速启动服务而无需修改系统服务配置。2.4 优缺点优点灵活性高用户可以根据需求自定义启动参数,无需修改系统配置文件。适合调试直接运行 mysqld 可以更方便地捕获错误信息和调试数据。独立性强不依赖系统服务管理框架,适合在轻量级或嵌入式系统中运行。缺点操作复杂需要手动管理后台运行、日志输出等,稍有不慎可能导致进程中断。缺乏自动化管理功能无法直接实现开机自启动、服务状态监控等功能。不便于长期维护适合短期使用,但对生产环境的大规模管理来说不够高效。3. 对比分析为了更直观地对比 systemctl 和 mysqld 两种启动方式的特点,以下以表格形式总结它们在不同维度的差异:对比维度systemctl 启动 MySQLmysqld 直接启动 MySQL适用场景适用于生产环境中的日常服务管理,特别是需要自动化和稳定性的场景。适用于开发、测试、调试环境,以及临时运行 MySQL 的场景。启动复杂度操作简单,通过 start、stop 等命令即可控制服务。操作较复杂,需要熟悉 MySQL 启动参数,且需手动管理后台运行。灵活性灵活性较低,需修改配置文件才能调整服务参数。灵活性高,支持在启动命令中直接传递自定义参数。自动化能力支持开机自启动,提供自动化服务管理(如 enable 和 disable)。不支持自动化管理,需手动配置和启动,不适合长期运行。日志管理集成 journalctl,日志查看和管理便捷统一。需要单独指定日志路径,日志管理较为分散。运行安全性依赖系统服务框架,稳定性更高,适合长期运行的生产环境。独立运行,可能因误操作导致服务异常,不适合直接用于生产环境。依赖性依赖系统服务框架(systemd),一旦框架故障可能受影响。不依赖其他服务框架,具有更高的独立性。调试能力调试能力有限,需要依赖日志文件排查问题。更适合调试,可直接运行并附加调试选项查看运行状态和错误信息。服务管理统一管理系统中的多个服务,适合复杂服务器环境。仅管理单个 MySQL 实例,服务管理能力较弱。通过以上对比可以看出,systemctl 强调稳定性和便捷性,是生产环境的理想选择;而 mysqld 更加灵活,适合需要快速调试或个性化运行的场景。根据实际需求选择适当的启动方式,将极大提升 MySQL 服务管理的效率与质量。结语MySQL 的启动方式需要根据具体需求和使用场景选择。对于生产环境,systemctl 是首选,提供了稳定、易用的服务管理功能。而对于开发和调试任务,mysqld 的直接启动方式则提供了无可比拟的灵活性。理解这两种启动方式的优缺点和适用场景,可以帮助开发者和运维人员更高效地管理 MySQL 服务。无论选择哪种方式,都应确保充分了解 MySQL 的配置和运行机制,以确保服务的稳定性和安全性。
-
前言MySQL 是一款常用的关系型数据库管理系统,广泛应用于各类应用开发和数据管理场景。然而,在实际使用中,MySQL 有时会遇到启动失败、服务中断或性能问题等情况,导致服务无法正常运行。为快速定位问题并恢复服务,我们需要掌握 MySQL 问题排查的思路和方法。本文将从日志分析、服务状态检查、配置文件验证等多个方面,详细讲解 MySQL 出现问题时的排查步骤,并结合实际操作案例帮助您更高效地解决问题。1. 查看 MySQL 日志信息日志是 MySQL 故障排查的重要工具,它记录了数据库运行过程中的详细信息,包括错误、警告和其他运行状态。通过日志分析,我们可以快速定位问题。1.1 日志文件的种类与路径MySQL 的日志文件通常存储在 /var/log 目录下,其中最常用的日志文件为 mysqld.log。具体包括:错误日志 :记录数据库在启动、运行或停止时发生的错误和警告。查询日志 (可选):记录所有客户端执行的 SQL 查询。慢查询日志 (可选):记录超过设定执行时间的 SQL 语句。主要日志文件路径:/var/log/mysqld.log:默认的 MySQL 错误日志文件。1.2 查看日志内容的方法通过以下命令可以查看日志内容:实时查看日志1tail -f /var/log/mysqld.log此命令可以实时监控日志的更新,适用于跟踪服务启动时的错误信息。分页查看日志1less /var/log/mysqld.log使用 less 命令可按页浏览日志内容,并支持搜索关键字(如 ERROR)。查看系统日志 如果 mysqld.log 中未显示详细错误信息,还可以查看系统日志:12journalctl -u mysqld.servicejournalctl -xe1.3 日志分析的关键点在日志中,重点关注以下几类信息:错误代码 :如 ERROR 1045 表示用户认证失败,ERROR 2002 表示无法连接到 MySQL 服务。服务启动失败原因 :如权限问题、端口冲突等。文件路径异常 :如 datadir 指向的目录无法访问。示例日志分析:12[ERROR] InnoDB: Unable to lock ./ibdata1 error: 13[ERROR] InnoDB: Operating system error number 13 in a file operation.从以上日志可以判断是 ibdata1 文件无法访问,原因可能是文件权限不足或被其他程序占用。2. 查看 MySQL 服务状态当 MySQL 无法正常运行时,检查服务状态是关键步骤之一。2.1 查看服务状态使用以下命令查看 MySQL 服务的当前状态:1systemctl status mysqld运行结果将显示服务的状态(如 active、inactive 或 failed),并提供错误原因。若服务未运行,可尝试启动:1sudo systemctl start mysqld如需调试问题,可以在启动前清理现有进程:1sudo pkill -9 mysqld2.2 检查进程运行情况确认 MySQL 是否已成功启动:1ps aux | grep mysqld2.3 常见启动失败问题与解决端口占用如果 MySQL 使用的默认端口(3306)被占用,可以通过以下命令确认:1netstat -tuln | grep 3306若端口被占用,可修改配置文件中的端口号或停止冲突服务。权限问题若日志提示目录无法访问:12ls -ld /var/lib/mysqlchown -R mysql:mysql /var/lib/mysql3. 检查 MySQL 配置信息MySQL 的配置文件是服务运行的核心,它决定了数据存储路径、日志路径等多个关键参数。配置文件错误可能导致服务启动失败。3.1 配置文件的路径与内容默认的 MySQL 主配置文件路径为:/etc/my.cnf通过以下命令查看和编辑配置:12cat /etc/my.cnfvim /etc/my.cnf配置文件中重要的参数包括:数据目录 :datadir(默认 /var/lib/mysql)日志文件 :log-error端口号 :port(默认 3306)3.2 验证配置文件的正确性在修改配置文件后,可以通过以下命令验证配置文件是否正确:1mysqld --verbose --help | grep -A 1 "Default options"若配置无误,再尝试启动服务。4. 其他常见问题与解决方法4.1 数据库表损坏如果某些表因系统中断等原因损坏,可尝试修复:1mysqlcheck -u root -p --all-databases --auto-repair此命令将检查并修复所有数据库表。4.2 无法登录 MySQL忘记 root 密码 进入安全模式修改密码:12mysqld_safe --skip-grant-tables &mysql -u root然后更新密码:12UPDATE mysql.user SET authentication_string=PASSWORD('new_password') WHERE User='root';FLUSH PRIVILEGES;远程连接失败 确保防火墙开放 MySQL 端口:12sudo firewall-cmd --permanent --add-port=3306/tcpsudo firewall-cmd --reload结语MySQL 是构建现代应用程序的基础,但在运行过程中可能遇到各种问题。通过日志分析、服务状态检查和配置文件验证,我们可以快速定位问题并采取有效的解决措施。面对复杂问题时,逐步排查并验证每一步操作的结果尤为重要。此外,良好的备份和监控机制可以帮助减少故障发生的风险。希望本文能为您在解决 MySQL 问题时提供有用的参考。
-
一、索引的基本概念索引类似于书籍的目录,通过索引可以快速定位到数据表中的某一行,而无需逐行扫描整个表。索引在数据库管理系统(DBMS)中起到加速查询、优化性能的重要作用。二、索引的类型MySQL索引根据存储方式、逻辑用途和实际使用场景可以分为多种类型:B-树索引(BTREE索引):叶子节点包含条目直接指向表里的数据行。 叶子节点之间彼此相连,一个叶子节点有一个指向下一个叶子节点的指针。 分支节点包含条目指向索引里其他的分支节点或者叶子节点。 根节点位于树的最顶端。 哈希索引(HASH索引):根据索引列对应的哈希值获取表的记录行。 MySQL中仅MEMORY和HEAP存储引擎支持。 不支持排序,只支持等值比较。普通索引:允许在定义索引的列中插入重复值和空值。 使用关键字INDEX或KEY创建。唯一索引:避免数据出现重复。 列值必须唯一,允许有空值。 使用UNIQUE关键字创建。主键索引:专门为主键字段创建的索引。 特殊的唯一索引,不允许值重复或为空。 使用PRIMARY KEY关键字创建。空间索引:对空间数据类型的字段建立的索引。 使用SPATIAL关键字进行扩展。 只能在MyISAM存储引擎的表中创建。全文索引:用来查找文本中的关键字。 只能在CHAR、VARCHAR或TEXT类型的列上创建。 MySQL中仅MyISAM存储引擎支持。单列索引和组合索引:单列索引只包含原表的一个列。 组合索引(复合索引)包含原表的多个列,使用时需遵循最左匹配原则。三、索引的操作创建索引:CREATE INDEX index_name ON table_name(column_name); CREATE UNIQUE INDEX index_name ON table_name(column_name); CREATE SPATIAL INDEX index_name ON table_name(column_name); CREATE FULLTEXT INDEX index_name ON table_name(column_name);查询索引:SHOW INDEX FROM table_name;删除索引:DROP INDEX index_name ON table_name;四、索引的使用场景经常被查询的字段:如用户ID、订单号等。 需要进行范围查询的字段:如日期范围、价格范围等。 外键字段:用于关联查询。 排序和统计操作的字段。五、索引的优化技巧联合索引的最左匹配原则:必须按照从左到右的顺序匹配,直到遇到范围查询(>、<、between、like)停止匹配。避免滥用索引:索引会占用额外空间,且会影响写操作(插入、删除、修改)的速度。 查询时尽量利用索引覆盖:使用索引覆盖可以减少回表操作,提升效率。 禁止对索引字段使用函数、运算符操作:这样会导致索引失效。字符串模糊查询:避免使用'%值%',可以使用'值%'来有效利用索引。 排序中尽量使用索引字段:可以减少排序操作,提升查询效率。优化分页查询:对于连续单调的字段,采用子查询提升分页性能。 对于不连续单调的字段,采用正序查询和倒序查询,或做连续单调映射表。 order by和limit混合使用:可能导致排序结果和预期不一致,需要按照官方文档说明,在order by的字段中加上一个唯一字段。 通过合理创建和使用索引,可以显著提高MySQL数据库的查询性能。然而,索引并非多多益善,需要根据具体的使用场景进行合理选择和配置,以达到最佳的性能效果。
推荐直播
-
华为开发者空间玩转DeepSeek
2025/03/13 周四 19:00-20:30
马欣 山东商业职业技术学院云计算专业讲师,山东大学、山东建筑大学等多所本科学校学生校外指导老师
同学们,想知道如何利用华为开发者空间部署自己的DeepSeek模型吗?想了解如何用DeepSeek在云主机上探索好玩的应用吗?想探讨如何利用DeepSeek在自己的专有云主机上辅助编程吗?让我们来一场云和AI的盛宴。
即将直播 -
华为云Metastudio×DeepSeek与RAG检索优化分享
2025/03/14 周五 16:00-17:30
大海 华为云学堂技术讲师 Cocl 华为云学堂技术讲师
本次直播将带来DeepSeek数字人解决方案,以及如何使用Embedding与Rerank实现检索优化实践,为开发者与企业提供参考,助力场景落地。
去报名
热门标签