news 2026/10/22 11:11:14

达梦DM8从零实战:环境搭建、性能优化与排坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
达梦DM8从零实战:环境搭建、性能优化与排坑指南

这两年做数据库相关工作的同行应该都有一个很直观的感受:信创、国产化迁移的需求明显多了起来。我自己经手的项目里,达梦DM8是接触最多的一款国产数据库,很多原本跑在Oracle上的系统,最终都迁移到达梦上。这篇就当一次实战总结,从零开始走一遍达梦DM8全流程:先聊清楚它是什么、适合什么场景,再一步步把环境搭起来、把表空间和用户建好,重点讲讲性能优化具体怎么做,最后把我在真实项目里踩过的坑和排查经验一并倒出来。全文会给出可复制的命令和SQL,从环境搭建到性能优化都有实例代码,有一定数据库基础的朋友可以直接照着操作。

1. 项目背景与选型思路

1.1 达梦DM8到底是什么

达梦数据库管理系统简称DM,8是当前主流的大版本。它属于关系型数据库,核心引擎是自研的,但语法体系上大量兼容Oracle——这对无数从Oracle迁移过来的系统来说,意义非常大。很多人会问,它和MySQL像还是和Oracle像?答案是:它在使用习惯上更接近Oracle。存储过程、触发器、包、序列、物化视图、同义词这些概念都有;SQL层面,NVL、DECODE、ROWNUM这些Oracle风格的函数也都能直接用;甚至很多管理视图的名字都和Oracle一致。

这在项目中带来的一个巨大好处是迁移成本低。我参与过的一个某单位的业务系统,原来跑在Oracle上,改到达梦后,90%以上的SQL不用动,剩下改动的主要集中在少数不兼容的函数和分页写法上。对于开发人员和DBA来说,学习曲线非常友好,基本上一两天就能上手干活。而如果你之前只玩过MySQL,那可能要稍微适应一下,因为达梦没有information_schema那种习惯,换成了V$字典视图和DBA_视图,观念上需要切换。

1.2 为什么选择它:场景与取舍

选数据库这件事,不能光看跑分。我从几个维度聊聊达梦在真实项目里的优势。

  • 合规与国产化是大前提。很多项目合同里直接写明了要使用国产数据库,达梦是能拿到相关资质认证的,政企、金融、能源类项目尤其常见。
  • Oracle兼容性做得比较到位。底层存储过程、SQL语法、工具链都有意识地往Oracle靠,迁移团队的工作量能显著下降。
  • 部署形态灵活,支持单机、主备、读写分离集群、共享存储集群等,单机和主备模式在中小项目中部署起来不复杂。
  • 运维习惯友好,如果你熟悉Oracle,上手达梦几乎没有障碍,很多命令、字典视图可以直接套用。

当然,任何数据库都有自己的短板。达梦的社区生态、第三方中间件适配范围,确实不如MySQL和PostgreSQL那么庞大;网上能搜到的中文资料质量也参差不齐。所以在选型时要把团队技能树、项目周期都考虑进去。我的原则是:项目有明确国产化要求,或者本来就要从Oracle迁移,优先考虑达梦;如果是全新互联网高并发业务、没有历史包袱,那更应该认真比较MySQL、PG这类生态更成熟的产品。数据库选型这种事,没有绝对最好,只有适不适合当前场景。

2. 环境搭建:从零开始部署 DM8

2.1 部署前的环境检查清单

我在安装前一般会先做一个静默检查,避免装到一半才发现环境不行。核心就几项:

第一是操作系统。主流Linux发行版基本都支持,CentOS 7/8、统信UOS、麒麟等都是常见承载环境。官方文档里有具体支持矩阵,动手前最好先看一眼,别在系统兼容性上浪费一整天。

第二是硬件资源。内存建议至少2GB以上,生产环境8GB起步比较合理;磁盘先想好数据放在哪,路径规划好,别装完发现空间不够。数据库这种活,磁盘和内存永远不嫌多。

第三是依赖库。比如libaio、glibc、ncurses等基础库要装齐,少一个可能导致安装程序或数据库启动时报错。用dmdba用户部署是比较规范的做法。注意,安装数据库不要用root,日常运维也别用root去连数据库。第一步先建用户和组:

groupadd dinstall useradd -g dinstall -m -d /home/dmdba dmdba passwd dmdba

然后调整资源限制,否则实例容易因为打开文件数、进程数不够而异常。通常在 /etc/security/limits.conf 里加:

dmdba soft nofile 65536 dmdba hard nofile 65536 dmdba soft stack 32768 dmdba hard stack 32768

改完后最好重新登录dmdba用户,用ulimit -n验证一下是否生效。这一步看起来不起眼,但我在生产环境里遇到过不止一次因为文件句柄不够导致dmserver进程被系统杀掉的故障,根源就是初始环境配置没做。

2.2 安装介质与安装方式

达梦提供图形化和命令行两种安装方式。服务器上我几乎都用命令行方式,因为很多环境没有图形界面,而且命令行更可控。安装包一般是一个DMInstall.bin文件,有的版本也叫dm8_xxx.iso,需要先挂载。假设已经上传并解压到了某个目录,直接执行:

cd /opt/dm_install/ chmod +x DMInstall.bin ./DMInstall.bin -q

静默安装过程中会提示输入安装路径、组件等。如果你不想交互,也可以准备一个response文件来指定安装路径和组件。我的习惯是安装到 /dm8 这种独立目录,不用系统默认路径,方便后续维护和备份。安装过程最后会提示用root执行一个脚本来完成一些系统级配置,按它的提示做就行。

安装完成后,关键目录结构大概是这样的:

路径作用
/dm8/bindmserver、disql、dminit 等可执行程序
/dm8/script/root需要root权限的服务注册等脚本
/dm8/log安装与运行日志

这里有一点要特别注意:达梦的安装和实例是分开的。安装只是把软件装好,真正干活的是后面用dminit初始化出来的实例,类似于Oracle中“软件安装”和“建库”两个阶段。我第一次弄的时候差点在这上面绕晕,以为装完软件就能直接连库,结果半天连不上。

2.3 初始化实例与关键参数选择

实例初始化用dminit,这一步是最容易出问题的。先切到dmdba用户,写清楚PATH和数据目录:

su - dmdba cd /dm8/bin ./dminit PATH=/dm/data/DMDB \ DB_NAME=DMDB \ INSTANCE_NAME=DMSERVER \ PORT_NUM=5236 \ PAGE_SIZE=16 \ EXTENT_SIZE=16 \ CHARSET=1 \ CASE_SENSITIVE=Y

说说这些参数为什么重要。PAGE_SIZE是页大小,直接影响一行数据能写多长、索引性能,以及整个库的容量上限。一般业务系统选8KB或16KB,一旦建库后不能改,所以前期要想好,别后面悔。CHARSET控制字符集,跨系统协作多的场景我强烈建议UTF-8,否则中文乱码会折腾到怀疑人生。CASE_SENSITIVE是大小写敏感标志,它决定了表名、列名不带引号时是否强制大写。很多从MySQL迁过来的同事第一周就栽在这里,后面我会单独讲。

初始化完成后,数据目录 /dm/data/DMDB 下会生成dm.ini、系统表空间文件、日志文件等。整个库的数据文件都在这个目录里,备份也好、迁移也好,先认准这个目录,别每次找半天。

2.4 注册服务、启停与连接验证

初始化只表示实例“存在”,要让它像系统服务一样随开机启动,需要用root执行服务注册脚本:

/dm8/script/root/dm_service_installer.sh -t dmserver \ -p DMSERVER \ -dm_ini /dm/data/DMDB/dm.ini

注册成功后就能用systemctl统一管理:

systemctl start DmServiceDMSERVER systemctl status DmServiceDMSERVER systemctl enable DmServiceDMSERVER

服务名一般是 DmService 加上实例名,所以这里是DmServiceDMSERVER。启动完可以用达梦自带的命令行工具disql验证连接:

/dm8/bin/disql SYSDBA/你的密码@localhost:5236

能进到 SQL> 提示符,说明实例和服务都正常了。第一次连上建议先看版本信息和关键环境:

SELECT * FROM V$VERSION; SELECT NAME, CREATE_TIME FROM V$DATABASE;

到这儿,一个最小可用环境就搭起来了。整个流程如果用熟了,在Linux上装一个达梦实例,熟练工十几分钟就能搞定。很多人觉得国产数据库部署复杂,其实按步骤走下来并不比装其他数据库慢多少。

3. 实操基本功:表空间、用户与SQL

3.1 表空间规划与数据文件管理

达梦的存储体系跟Oracle很像:数据库由若干表空间组成,每个表空间对应磁盘上的一个或多个数据文件。默认表空间里有SYSTEM、ROLL、MAIN、TEMP等,SYSTEM放系统数据,ROLL放回滚信息,TEMP是排序等临时空间。但正规项目里,我一般不建议把业务数据直接塞到MAIN或SYSTEM里,而是自己单独建业务表空间,这样便于管理和迁移。

CREATE TABLESPACE TS_APP DATAFILE '/dm/data/DMDB/TS_APP01.DBF' SIZE 512 AUTOEXTEND ON NEXT 128 MAXSIZE 4096;

注意这里数据文件的路径,必须放在实例能访问到的目录下。如果目录不存在,要先mkdir并确认dmdba用户有写权限,否则建表空间会报错。管理上常用这些查询:

SELECT TABLESPACE_NAME, STATUS, TOTAL_SIZE * PAGE_SIZE / 1024 AS TOTAL_MB FROM V$TABLESPACE;

日常巡检里我最关注的就是表空间使用率。数据文件如果开的是定长不自动扩展,业务高峰期很容易一秒钟把空间撑满,整个库直接卡住。所以我的习惯是核心业务表空间全部开启AUTOEXTEND,并且设置合理的MAXSIZE上限,既避免手工频繁扩容,又能防止某个失控SQL把磁盘写爆。

3.2 用户与权限体系

建完表空间,接下来就是建用户。达梦里用户和模式的关系需要提前说清楚:在SQL里写user.table,实际上就是“用户名下的模式下的表”,所以一个用户默认拥有与自己同名的模式。最常用的授法是给应用单独建用户,再把默认表空间指到业务表空间:

CREATE USER APP_USER IDENTIFIED BY "你的强密码" DEFAULT TABLESPACE TS_APP; GRANT RESOURCE TO APP_USER; GRANT CONNECT TO APP_USER; ALTER USER APP_USER DEFAULT TABLESPACE TS_APP;

如果项目里需要管理员角色,可以直接GRANT DBA,但生产环境我建议按最小权限原则来,别不管三七二十一给全体应用账号发DBA。尤其是数据库账号密码很容易被写进配置文件里,权限越大的账号泄露风险越高。我在审计一个存量系统时发现,几乎所有应用账号都是DBA权限,后来花了很大力气才逐步收紧。

3.3 建表与分区表实战写法

建表语法和Oracle高度一致,但有一个坑值得单独提醒:大小写敏感。如果初始化时CASE_SENSITIVE=Y,那你写的表名、字段名都会默认转成大写;想保留小写,必须给对象名加双引号。下面这段是兼容Oracle风格的建表语句:

CREATE TABLE T_ORDER ( ORDER_ID INT, ORDER_NO VARCHAR(32), ORDER_DATE DATE, AMOUNT DECIMAL(12,2), STATUS CHAR(1), CONSTRAINT PK_ORDER PRIMARY KEY (ORDER_ID) ); CREATE INDEX IDX_ORDER_DATE ON T_ORDER(ORDER_DATE);

对于有明显时间维度的业务表,我强烈建议上分区表。后续清理数据和查询效率都会好很多:

CREATE TABLE T_ORDER_PART ( ORDER_ID INT, ORDER_DATE DATE, AMOUNT DECIMAL(12,2) ) PARTITION BY RANGE(ORDER_DATE) ( PARTITION P2024 VALUES LESS THAN ('2025-01-01'), PARTITION P2025 VALUES LESS THAN ('2026-01-01'), PARTITION P2026 VALUES LESS THAN ('2027-01-01') );

分区并不会让单条SQL变魔法快很多,它的核心价值是分区裁剪和利于滚动清理。例如丢掉一整年数据时,直接drop partition远比delete上亿行数据快。我接手过一个6亿行的流水表,每个月清理一次历史数据,用分区方案后清理操作从小时级变成分钟级。

3.4 DBA日常调试SQL与常用字典

如果你之前玩的是MySQL,突然切到达梦,最不习惯的可能是找不到information_schema。达梦的奥义是:V$字典视图加DBA_视图。像这样:

-- 查看所有会话 SELECT USERNAME, STATE, SQL_TEXT, LAST_SEND_TIME FROM V$SESSIONS ORDER BY LAST_SEND_TIME DESC; -- 查看锁等待 SELECT * FROM V$LOCK WHERE BLOCKED = 1;

连进来之后,先熟悉两个函数会非常有用:SF_GET_PARA_VALUE和SF_SET_PARA_VALUE。前者查看运行参数,后者动态修改参数。配数据库参数的时候用它们能少重启很多次。另外,如果你开启SQL日志,慢SQL记录在实例目录的log下,出问题时用文本工具一翻就能定位。不要小看这些基本功,DBA排查问题快不快,很大程度上取决于对字典视图熟不熟。

4. 性能优化实战

4.1 内存与并发参数调整

数据库性能优化的第一刀,应该落在内存和并发上。达梦的核心参数都写在dm.ini里,运行时可以用管理函数查看和调整。我习惯先看现状再动刀:

SELECT SF_GET_PARA_VALUE(1, 'BUFFER_POOL_SIZE') AS BUFFER_MB; SELECT SF_GET_PARA_VALUE(1, 'SESSIONS') AS SESSIONS;

这里说几个我常调的参数。

BUFFER_POOL_SIZE是数据页缓冲池大小,单位MB。缺省可能偏小,如果是专用数据库服务器且内存充裕,我会把70%到80%的可用内存分给数据库相关缓冲,然后根据业务类型微调。这个参数对查询性能影响非常直接,命中率上去了,磁盘IO压力立刻下降。

SESSIONS是最大会话数。连接数打满会导致新的连接直接失败,踩过坑的都懂。建议结合应用连接池大小估算:应用连接池最大连接数乘以应用实例数,再留1.5倍左右的余量。

LOG_BUF_SIZE是日志缓冲区大小,写密集型系统适当调大,能减少日志文件写入的IO次数。修改时区分动态和静态参数。比如SESSIONS这类往往需要改dm.ini重启生效;BUFFER_POOL_SIZE有些版本支持动态调整。稳妥做法是:修改前先备份dm.ini,能动态就动态,不能动态就规划好维护窗口重启实例。

ALTER SYSTEM SET BUFFER_POOL_SIZE = 2048; -- 或者 SP_SET_PARA_VALUE(1, 'BUFFER_POOL_SIZE', 2048);

这两种写法在不同版本里支持情况不完全一样,建议以你手里的版本的实际返回结果为准,多看V$DM_INI视图确认参数生效状态。千万别在文档没确认的情况下在生产库上乱改,一次参数调错导致重启失败的教训够喝一壶的。

4.2 索引设计与优化

索引是最常见也最容易见效的优化手段。达梦支持B树索引、位图索引、全文索引等,日常业务OLTP系统用B树就够了。我在项目中总结过几条索引设计原则。

第一,优先关注高频WHERE条件字段,尤其是等值查询字段。第二,组合索引的字段顺序要按区分度从高到低排,而不是随手把查询条件按书写顺序放进去。第三,不要在一块表上堆几十个索引,写入变慢不说,索引本身也占空间。

遇到过最典型的案例是:一张几千万行的订单表,查询条件经常是status加order_date,原系统只有一个主键索引,每次查都走全表扫描。加了一个组合索引之后,查询从十几秒降到毫秒级。SQL如下:

CREATE INDEX IDX_ORDER_STATUS_DATE ON T_ORDER(STATUS, ORDER_DATE);

注意,索引不是越多越好。特别是字段找不到唯一性的时候,该考虑的是怎么写SQL,而不是盲目加索引。另外,达梦里很多跟Oracle相同的经验是通用的:避免在索引列上做函数运算,避免隐式类型转换,这些都是老生常谈,但在实际代码里真的很容易犯。比如WHERE TO_CHAR(ORDER_DATE)='2025-01-01'这种写法,一旦在索引列上套了函数,索引基本就废了,改成范围判断会好得多。

4.3 SQL执行计划与统计信息

当一条SQL慢下来,第一件事不是瞎猜,而是看执行计划。达梦里用EXPLAIN就能看到计划:

EXPLAIN SELECT * FROM T_ORDER WHERE STATUS='1' AND ORDER_DATE >= '2025-01-01';

看计划时重点关注几个信号:有没有走全表扫描、有没有用对索引、关联顺序是否合理、排序和哈希操作是否在数据量极大的情况下出现。这些迹象直接提醒你到底该改SQL还是改索引。

另一个极容易被忽略的点是统计信息。如果优化器拿到的统计信息是旧的,即使有索引也可能不走。建议业务表的数据变化较大后,定期收集一下统计信息:

DBMS_STATS.GATHER_TABLE_STATS('APP_USER', 'T_ORDER'); DBMS_STATS.GATHER_INDEX_STATS('APP_USER', 'IDX_ORDER_STATUS_DATE');

收集统计信息和生成执行计划这两件事配合起来,往往比单纯调参数更立竿见影。我之前接手过一个系统,查询一会快一会慢,后来发现是统计信息长期没人管,优化器在走错路。后来加了每周定时任务统一收集一轮,问题就消停了。很多所谓“灵异性能问题”,最后查下来基本都是统计信息过期闹的。

4.4 监控手段与AWR报告

达梦提供了类似于Oracle AWR的性能报告功能,叫AW工作负载仓库。常用套路是先拍快照,再生成报告:

-- 创建快照 CALL DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT(); -- 查看已有快照 SELECT SNAP_ID, BEGIN_INTERVAL_TIME FROM SYS.WRM$_SNAPSHOT ORDER BY SNAP_ID;

报告生成一般在安装目录的tool或bin下有对应脚本,导出成文件后可以直接看Top SQL、等待事件、内存走势。第一次接触的人不用把报告所有部分都读一遍,优先看三个地方:最耗时的SQL、Buffer命中率、等待事件排行。很多故障苗头在真正发生前,其实都藏在报告数字里。

还有一种成本很低的做法,就是开启系统SQL日志,把慢SQL记录到日志文件里,出问题时翻日志定位。生产环境注意控制日志级别和大小,避免日志本身反过来成为性能负担。我有一次就是启了全量SQL日志没管,结果日志文件疯狂增长,把磁盘塞满,最后数据库直接停机。日志功能是好东西,但一定要配上日志轮转和保留策略。

5. 常见问题与排查技巧记录

5.1 启动与连接类故障

实例启动失败,最常见的原因是内存不足或者dm.ini参数配置错误。先看日志:

tail -100 /dm/data/DMDB/log/dm_dmserver_*.log

启动失败日志一般会直接告诉你原因,比如not enough memory,或者某个路径不存在。我遇到一次是安装后没调整ulimit限制,dmserver刚启动就被系统杀掉了,后来把nofile调大才解决。排查时顺手执行df -h和free -m确认磁盘和内存,别在日志里绕半天。

连接不上数据库,先确认三件事:服务进程在不在、端口通不通、账号密码对不对。服务没了就启动服务;端口不通往往是防火墙拦住了5236端口:

firewall-cmd --zone=public --add-port=5236/tcp --permanent firewall-cmd --reload

连接数打满。错误提示大概会是too many sessions之类的。排查当前连接数并确认瓶颈:

SELECT COUNT(*), STATE FROM V$SESSIONS GROUP BY STATE;

如果历史上来没这么多连接,看看应用连接池是不是泄露了。如果确实是业务增长,就要评估SESSIONS参数并合理扩容。这类问题定位起来不难,难的是别把SESSIONS一味调大而不去处理连接池泄漏,那样只会让问题以更隐蔽的方式继续存在。

5.2 性能类故障

一条SQL跑着跑着突然慢了。优先级最高的排查路径是:统计信息过期、执行计划被缓存带歪、锁等待、系统资源被占满。可以先用V$SESSIONS看会话等待什么,再看V$LOCK有没有锁等待,必要时对相关表重新收集统计信息。

从其他数据库迁移过来的乱码或报错问题,多数是字符集初始化不一致导致的。达梦实例、客户端工具、数据库表字符集三者的设置要统一。我个人建议所有新库初始化时直接指定UTF-8,数据交换、Web显示都会省心很多。这个建议在MySQL那边同样适用,但达梦这个坑踩一次就够了,别在初始化时图省事随便选个编码。

5.3 几个非常实用的踩坑心得

大小写敏感是新手最常掉进去的坑。初始化时CASE_SENSITIVE=Y,你建的APP_USER表,不带引号访问其实是APP_USER.T_ORDER,全部转大写;如果应用代码里用驼峰或小写写表名,且没有统一大写规范,就会莫名报无效的表名或视图名。遇到这种情况,先看建库参数,再统一代码里的对象命名。这个坑在建模阶段就要想清楚,否则后期改库参数几乎等于重建库。

还有一类是数据类型映射问题。比如从Oracle迁移来的number字段到达梦后,建议明确映射到精度合适的DECIMAL,避免小数位对不上。SQL层面少用Oracle特有、达梦可能不完全兼容的写法,例如(+)外连接在某些场景不如标准ANSI JOIN稳妥。程序里的SQL尽量写成标准风格,迁移时能少改一行是一行。注意别小看这些细节,迁移项目的工期往往就耗在这些不起眼的兼容性差异上。

另外,锁等待问题的排查也值得养成固定套路。很多系统卡顿不是数据库性能不好,而是两个会话互相等的锁把关键表锁住了。发现锁等待后,找到会话对应的SQL和应用模块,往往能很快定位到业务逻辑层面的问题,比如事务里做了太长的外部调用,或者写了事物代码忘了提交。

上面这套流程,基本覆盖了一个达梦DM8项目从零到能用的完整闭环。我个人在实际操作中最深的体会是:达梦虽然叫国产数据库,但在使用体验上更像是一个“兼容Oracle并做了大量简化”的变体,所以很多老DBA上手会非常顺,反而是从MySQL过来的人需要花点时间适应大小写和习惯上的差异。最后再说两个小习惯:生产环境改任何参数之前,先把dm.ini原文件备份好,并在测试实例上验证;遇到解释不清的故障,优先翻实例目录下的日志,大多数答案都写在那里。希望这篇总结能帮你少踩几个坑。后面有时间,我再单独写一篇关于达梦主备集群搭建和数据切换演练的实操记录。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 11:08:48

ccusage安装指南:用命令行统计Claude Code的token消耗与成本

1. 账单对不上的那天,我想起来要装 ccusage 上周我收到一份月度账单,发现用量比预想中多出一截。当时我脑子里第一个反应就是:到底哪个项目的哪一次会话在烧 token?结果在 Claude Code 官方界面上翻了半天,只能看到总的…

作者头像 李华
网站建设 2026/10/22 11:08:16

教学管理数据库四表DDL设计:从字段类型到索引约束的完整拆解

1. 四个表的设计思路:为什么是这四张表拿到“SchoolDB对应的4个表的DDL语句——仅有结构”这个标题时,我第一反应是:这不就是最经典的选课系统表结构吗?学生、课程、教师、成绩,四张表构成了一个精简但五脏俱全的教学管…

作者头像 李华
网站建设 2026/10/22 11:07:37

接触追踪应用安全后端:数字签名与TLS加密双链路实战解析

开发接触追踪类应用时,我负责的其中一个模块就是服务器端的安全机制。这类应用的特点是终端体量大、数据敏感、传输频次集中,服务器既要对下发的诊断数据和配置信息做数字签名,又要在和客户端交换数据时保证加密通信不被中间人截取或篡改。整…

作者头像 李华
网站建设 2026/10/22 11:07:04

计算机网络协议详解:从分层原理到抓包实战,一次搞懂TCP/IP核心协议

1. 从一次抓包聊起:为什么协议是网络的“交通规则”很多人第一次接触计算机网络,都是从“协议”这两个字开始的。教材上给的定义往往很抽象:协议是通信双方必须遵守的规则集合。这话没错,但太干了,干了到看完还是不知道…

作者头像 李华
网站建设 2026/10/22 11:05:04

不完全信息Epsilon纳什均衡的航天器追逃博弈复现与Matlab仿真

复现一篇带"不完全信息"和"Epsilon纳什均衡"字样的航天器末端追逃博弈论文,听起来就比常规的LQR追击问题高一个档次。这篇文章的完整标题是"不完全信息Epsilon纳什均衡航天器末端追逃博弈策略(基于EKF的参数估计与自适应博弈&a…

作者头像 李华
网站建设 2026/10/22 11:04:50

MySQL优化实战:先索引、再SQL、最后分库分表

一说MySQL优化,大部分人脑子里跳出来的就是三个词:索引、SQL、分库分表。这样理解不算错,但很容易把顺序搞反。我见过不少团队一遇到性能问题就嚷嚷着要分库分表,结果把系统搞得无比复杂,最后发现是几条SQL没写对。这篇…

作者头像 李华