尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MySQL 8.4 LTS 下载安装教程:Windows/Linux 避坑指南

MySQL 8.4 LTS 下载安装教程:Windows/Linux 避坑指南 MySQL 的安装大概是所有数据库新手里最容易翻车的一步不是因为它难而是因为它给的选择太多官网上一堆安装包MSI、ZIP、tar.gz、RPM、DEB还有 Docker 镜像装完之后又要面对临时密码、字符集、认证插件、服务注册这一串问题。我见过不少人第一次装完 MySQL命令行敲下mysql -u root -p直接报 1045或者服务压根起不来折腾半天最后选择放弃——其实绝大多数问题都卡在两三个细节上。这篇就按我自己实际动手的顺序把 Windows 和 Linux 两条主线的 MySQL 下载安装教程完整走一遍包括版本怎么选、图形化安装向导里每一项到底是什么意思、ZIP 免安装版怎么手工初始化、Linux 下用包管理器和二进制包部署的差别以及装完之后必须立刻做的那些配置。走完这一遍你应该能独立从零把一套 MySQL 跑起来并且知道出问题时该去哪儿翻日志。1. 动手下载之前先把三件事定下来1.1 版本选择8.0、8.4 LTS 还是 9.x 尝鲜版打开官网下载页第一眼就会懵8.0、8.4、9.x 三个大版本并排放在那儿。我的建议很直接——生产环境选 8.4 LTS个人学习也跟着 8.4 走除非你有明确的理由选别的。原因在于 MySQL 的版本节奏。8.0 是上一代长期支持版本功能稳定、网上资料最多但它已经进入生命周期后段后续主要是安全补丁不会再有大的功能演进。8.4 是新一代 LTS官方承诺的维护周期更长而且很多新特性比如更强的 JSON 处理、更细的性能观测指标只有 8.4 及以上才有。9.x 属于创新版本迭代快、新功能多但小版本之间偶有行为调整拿来做学习可以扔到线上就需要额外评估。还有一个隐形的坑你的应用框架对 MySQL 版本有最低要求。比如 Django 较新的版本会对 MySQL 服务端版本做校验驱动或框架认为版本太低时会直接抛出NotSupportedError提示需要更高的 MySQL。这种报错不是安装出错而是版本线不匹配。所以如果你手上已经有一套项目代码先去翻一眼它的依赖说明别装完才发现要重来。版本线定位适合谁需要留意8.0上一代 LTS资料最全维护老项目、跟着老教程走新特性缺失长期看要迁移8.4 LTS当前主力长期支持版绝大多数人和新项目部分老客户端需要升级驱动9.x创新版本迭代快想试新特性、非关键环境小版本行为可能变化1.2 安装形态图形包、免安装包、包管理器、容器怎么挑同一台机器上MySQL 至少有四种安装姿势选错了不是装不上而是后面维护起来别扭。Windows 上的MSI Installer是图形化向导一路下一步就能跑起来它会顺手帮你注册服务、配好数据目录、装上 Workbench 和命令行工具最适合第一次接触的人。缺点是它会往系统里塞不少东西卸载时如果没走干净残留的目录会让下一次安装直接失败。ZIP 免安装版本质就是一个压缩包解压到任意目录自己写配置文件、自己初始化、自己注册服务。它看起来麻烦但好处是“一切可控”数据目录在哪、端口是多少、服务叫什么名字全在你手里卸载就是删目录干净利落。我个人在 Windows 上更偏爱这种方式尤其是需要同时跑两个不同版本做对比的时候。Linux 上则是包管理器yum/dnf、apt和二进制 tar.gz 包两条路。包管理器胜在省事一行命令装完systemd 服务也帮你建好了升级方便。二进制包胜在不受发行版仓库版本限制想要哪个小版本就是哪个小版本目录结构也完全由你决定缺点是初始化、权限、服务脚本都得自己来。Docker是第四条路适合临时验证、跑测试、给团队搭演示环境。一条docker run就能起一个干净的实例删掉容器不留痕迹。我的排序是本地学习用 MSI 或 ZIP服务器部署用包管理器需要精确控版本或多版本共存用二进制包一次性验证用 Docker。1.3 提前规划端口、数据目录和字符集这三项如果不在安装前想清楚后面返工的成本会成倍增加。端口默认 3306。如果机器上已经有一个 MySQL 或者别的服务占着 3306安装过程中会直接报端口冲突服务起不来。装之前先确认一下端口占用情况Windows 用netstat -ano | findstr 3306Linux 用ss -lntp | grep 3306有输出说明被占了要么停掉对方要么把新实例换成 3307。数据目录是所有表数据的落盘位置。Windows 的 MSI 默认放在C:\ProgramData\MySQL\MySQL Server X.X\DataZIP 版默认是解压目录下的data。这个目录一旦确定后面不要随便移动因为移动后必须同步改配置并重新初始化权限很多人“数据库突然连不上”就是因为动了这个目录。字符集统一用utf8mb4。注意 MySQL 里的utf8是个历史遗留名字它最多只存三个字节遇到某些四字节字符会直接写入失败。utf8mb4才是真正完整的 UTF-8 实现排序规则选utf8mb4_0900_ai_ci8.0 及以后。安装时如果没设置配置向导里也有对应选项别跳过。2. Windows 上用 MSI Installer 把服务跑起来2.1 官网下载页里到底该点哪个文件进入官网下载页后会看到 Community 和 Commercial 两栏个人开发用 Community 版就够它是免费的。接着会看到一列安装包常见的有这么几种mysql-installer-community-x.x.x.msi带界面的安装向导也是大多数人要下载的那个。mysql-installer-web-community-x.x.x.msi只是个下载器安装时还要联网拉组件网络不稳就容易卡住。mysql-x.x.x-winx64.zip免安装的压缩包。mysql-x.x.x-winx64-debug-test.zip带调试符号的测试包正常使用不需要。认准.msi结尾、体积在几百 MB 的那个完整安装包别下成 web 版。下载前页面可能会提示登录账号直接找“No thanks, just start my download”之类的链接跳过即可。下完之后对一下文件大小和官方给出的校验值尤其是从第三方镜像拿的包校验一下更稳妥。2.2 Setup Type 页面几种安装类型分别意味着什么双击 MSI 进入向导后第一个需要动脑的页面是 Setup Type。它通常给五个选项Developer Default、Server only、Client only、Full、Custom。Developer Default会装 server 加上 Workbench、Shell、文档、示例还会尝试装一些开发环境依赖对新手最省事。但它有个小毛病如果机器上缺少某些组件比如特定版本的运行库它会在“Check Requirements”阶段要求你先装反而多一步。Server only只装数据库服务端适合你已经有别的客户端工具的情况。Client only反过来只装命令行和图形客户端。Full全都装占磁盘最多。Custom让你自己勾组件和安装路径。我一般选Custom把 Server 勾上Workbench 按需勾安装目录改到非系统盘。这么做的好处是路径清晰重装和备份都好找。注意安装路径里不要有中文和空格虽然新版对路径的兼容性好了很多但某些客户端工具和脚本仍然会在带空格路径上出问题。2.3 配置向导里的关键几页逐项拆解安装文件复制完之后会进入配置阶段这几页决定了你的实例长什么样。第一页是Type and Networking。Config Type 选 Development Computer占用内存小还是 Server Computer预分配更多资源本地学习选前者就够。Port 保持 3306除非前面发现冲突。下面还有 X Protocol 端口和 Named Pipe、Shared Memory 的勾选一般不用动。第二页是Authentication Method。这里有两个选项强密码加密推荐和传统认证方式。新版默认走强密码加密安全性更高但代价是一些很老的客户端库连不上会报认证插件相关的错误。如果你要用的是几年前的老项目先确认它的驱动支持新认证方式实在不行就选传统方式但要知道这是拿安全性换兼容性。我现在的习惯是保持默认遇到连不上的客户端就去升级驱动而不是降级服务端配置。第三页是Accounts and Roles。设置 root 密码这个密码要记牢后面所有操作都靠它。下面还可以顺手添加一个普通用户建议这里就建好不要所有应用都用 root 连库。密码设置时注意新版默认启用了密码强度校验太简单的密码会提示不满足策略字母、数字、符号混合是省事的做法。第四页是Windows Service。这里决定要不要把 MySQL 注册成系统服务以及服务名是什么。建议勾上服务名我习惯写成MySQL84这种带版本号的将来装第二个版本时不会打架。下面的“Start the MySQL Server at System Startup”也勾上省得每次开机手动启动。第五页是Server File Permissions一般保持默认。最后进入 Apply Configuration它会依次执行初始化数据目录、启动服务、写配置等动作这期间任何一步失败都会在日志框里显示出来别急着点 Finish先把日志看完。2.4 装完立刻验证的三条命令安装向导跑完不代表万事大吉必须自己验一遍。第一步打开命令行把 MySQL 的 bin 目录加进 PATH或者直接用完整路径调用。然后执行mysql --version mysql -u root -p -e SELECT VERSION();第一条确认客户端能跑第二条确认服务端活着并且密码正确。第二条如果报 1045说明密码不对报 2003说明服务没起来或者端口不通。第三步看一眼字符集和端口SHOW VARIABLES LIKE character_set_server; SHOW VARIABLES LIKE port; SHOW VARIABLES LIKE datadir;这三个值确认无误Windows 这条线就算走完了。顺便说一句如果你在配置向导里勾了 Workbench直接打开它它会自动列出本地实例双击就能进比命令行直观。3. ZIP 免安装版的初始化才是真正的“手工活”3.1 解压位置与 my.ini 的最小可用配置把 ZIP 包解压到一个纯英文路径下比如D:\dev\mysql-8.4。解压出来是没有data目录的也没有my.ini这两个都要你自己来。配置文件放在解压根目录命名my.ini内容最小可用集合如下[mysqld] basedirD:/dev/mysql-8.4 datadirD:/dev/mysql-8.4/data port3306 character-set-serverutf8mb4 collation-serverutf8mb4_0900_ai_ci default-storage-engineINNODB max_connections200 [client] default-character-setutf8mb4 [mysql] default-character-setutf8mb4注意路径用正斜杠或者用双反斜杠。basedir和datadir一定要写对写错的话初始化阶段就会直接报错或者更隐蔽地——初始化到了一个你不知道的目录里后面怎么找都找不到数据。max_connections默认是 151本地开发通常够用但如果你会同时跑几个连接池压测提前调大一点省事。default-storage-engine保持 InnoDB别改成别的事务和行锁都靠它。3.2 初始化数据目录与临时密码的去向配置文件写好之后用管理员身份打开命令行进入 bin 目录执行mysqld --initialize --console这个命令会创建 data 目录、生成系统表并在控制台输出一行临时密码形如A temporary password is generated for rootlocalhost: xxxxxxxx。这行密码只显示这一次务必立刻复制下来。如果不小心关了窗口只能删掉 data 目录重新初始化。另一种写法是mysqld --initialize-insecure它不生成密码root 直接空密码适合本地纯学习环境图省事。但如果你这台机器会在局域网里被访问不要这么干空密码的 root 是个明确的风险点。初始化完成之后启动服务mysqld --console这个窗口会一直占着并输出日志关掉窗口服务就停了。生产式的做法是注册成系统服务下一节讲。先用这个方式确认能正常启动再去做服务注册出问题时更容易定位。3.3 注册成 Windows 服务并让它开机自启确认能手动启动之后按 CtrlC 停掉然后执行mysqld --install MySQL84 --defaults-fileD:\dev\mysql-8.4\my.ini net start MySQL84--install后面跟的是服务名--defaults-file指向你的配置文件。这两项写对服务才能找到正确的数据目录。启动之后可以再执行sc query MySQL84看一眼状态状态是 RUNNING 就说明到位了。如果net start报“服务无法启动”先别急着重装去看数据目录下的.err文件错误日志的命名规则一般是主机名.err。里面会写明到底是端口冲突、权限不足还是配置项拼错。这个日志文件是排查一切启动问题的第一入口养成先看日志的习惯能省下大量时间。3.4 改密码、统一字符集、把 bin 加进环境变量临时密码登进去之后第一件事就是改密码ALTER USER rootlocalhost IDENTIFIED BY 你的新密码; FLUSH PRIVILEGES;然后把字符集和服务端参数确认一遍。改字符集如果是在创建库之前配置里写好就生效如果已经建了库那要针对已有库和表单独转换命令是ALTER DATABASE 库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;最后把D:\dev\mysql-8.4\bin加到系统环境变量 PATH 里之后随便在哪个目录都能直接敲mysql。这一小步很多人懒得做结果每次都要 cd 到 bin 目录白白浪费时间。4. Linux 服务器上的三条部署路径4.1 官方仓库安装最省心的主流做法以 CentOS/RHEL 系列为例先引入官方仓库包再装服务端sudo rpm -Uvh mysql84-community-release-el9-1.noarch.rpm sudo yum install mysql-community-server sudo systemctl start mysqld sudo systemctl enable mysqld装完之后root 的临时密码在错误日志里sudo grep temporary password /var/log/mysqld.log拿到密码后执行mysql_secure_installation它会引导你改 root 密码、删匿名用户、禁止 root 远程登录、删测试库。这几步建议都做掉尤其是禁止 root 远程登录这是很基础的一道防线。Ubuntu/Debian 系列走 apt先下载官方提供的配置包mysql-apt-config_x.x.x-x_all.deb用dpkg -i装上去期间会让你选要安装的 MySQL 版本选完apt update再apt install mysql-server。Debian 系有个特点root 默认走 auth_socket 认证本地可以直接sudo mysql免密进要改成密码认证需要显式执行一条ALTER USER。4.2 二进制 tar.gz 包版本和目录完全由你决定需要精确控制小版本或者一台机器上跑多个实例时二进制包是最稳的选择。大致流程groupadd mysql useradd -r -g mysql -s /bin/false mysql tar -xf mysql-8.4.x-linux-glibc2.28-x86_64.tar.xz -C /usr/local ln -s /usr/local/mysql-8.4.x-linux-glibc2.28-x86_64 /usr/local/mysql cd /usr/local/mysql mkdir mysql-files chown mysql:mysql mysql-files chmod 750 mysql-files bin/mysqld --initialize --usermysql bin/mysqld_safe --usermysql 这里有两个容易忽略的点。一是必须建一个专用的 mysql 用户让数据库进程以非 root 身份运行这是权限隔离的基本要求。二是二进制包一般依赖 libaio 这类异步 IO 库如果系统是最小化安装初始化时会报找不到共享库先yum install libaio补上。还有一点从 8.0 开始很多发行版自带了系统级的my.cnf而 tar 包部署时默认也会读/etc/my.cnf。如果那个文件里写着别的路径你的实例可能莫名其妙读到错误的配置。稳妥的做法是在启动命令里显式指定--defaults-file/usr/local/mysql/my.cnf。4.3 Docker 起实例验证和演示场景的首选临时要用一个干净的 MySQL 做测试容器是最快的方式docker run -d --name mysql-test \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDYourStrongPass \ -e MYSQL_DATABASEtestdb \ -v /data/mysql-test:/var/lib/mysql \ mysql:8.4 \ --character-set-serverutf8mb4 \ --collation-serverutf8mb4_0900_ai_ci几个细节值得说。-v挂载数据目录是为了容器删了数据还在不挂载的话容器一删数据全没这几乎是新手最容易踩的坑。MYSQL_DATABASE会自动建好一个库省去手动 create。末尾的参数会追加到服务端启动参数里用来指定字符集。另外镜像首次启动初始化需要几十秒这期间连接会被拒绝别以为是启动失败了。如果要在宿主机上用命令行连容器里的实例注意容器的 root 默认允许从任意主机连接因为容器网络视角不同这和包管理器安装的默认策略不一样安全组和端口暴露要自己控制好。4.4 Linux 下的目录归属与 systemd 管理不管是哪种方式最后落实到运维上都是三件事目录归属、服务管理、日志位置。目录归属上/var/lib/mysql是数据目录属主必须是运行数据库的那个用户/var/log/mysqld.log或/var/log/mysql/error.log是日志/etc/my.cnf或/etc/mysql/my.cnf是主配置。这几处搞混就会出现“改了配置不生效”或者“服务启动后目录权限报错”的情况。服务管理统一用 systemdsudo systemctl status mysqld sudo systemctl restart mysqld sudo journalctl -u mysqld -n 100journalctl看的是 systemd 层面捕获的输出而错误日志看的是 MySQL 自己写的详细记录两边结合着看定位问题的速度会快很多。5. 装完之后必须补上的四项配置5.1 认证插件引发的连接失败与处理思路新版 MySQL 默认使用强密码加密的认证插件这个插件要求客户端也支持对应的握手流程。如果你用一个很老的客户端库去连可能会看到类似“Authentication plugin cannot be loaded”或者“Client does not support authentication protocol”的报错。处理方式有两种思路。一种是升级客户端包括升级驱动程序、升级图形工具版本这是首选因为服务端配置不用降级。另一种是针对特定账号切换认证插件ALTER USER app% IDENTIFIED WITH mysql_native_password BY 你的密码;第二种方式只应该用在明确知道原因的场景下而且要清楚它是为了兼容老客户端而做的妥协。不要为了图方便把所有账号都改回去那等于把整个实例的认证强度拉低。5.2 把字符集从 utf8 迁到 utf8mb4 的完整动作字符集问题往往在写入特殊字符时才暴露比如某些生僻字、表情符号插入时直接报错。查当前状态SHOW VARIABLES LIKE character_set%; SHOW VARIABLES LIKE collation%;理想情况下这几个值都应该是 utf8mb4 相关。如果发现是utf8或latin1先改服务端配置和连接配置再针对已有对象做转换。转换语句本身不会自动帮你把数据重新编码它只改元数据定义所以这一步前后最好做完整备份。另一个常被忽略的点是连接层字符集。服务端设置对了但客户端连接时没指定仍可能出现乱码。在 JDBC 连接串里加上characterEncodingutf8在 Python 的驱动里指定charsetutf8mb4这些都属于连接层的显式约定。5.3 远程连接与最小权限账号的写法默认安装后root 只允许本地登录这是合理的。要让应用从另一台机器连过来正确做法是建一个专用账号并只授予必要的库权限而不是把 root 开放出去CREATE USER shop_app10.0.1.% IDENTIFIED BY 强密码; GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO shop_app10.0.1.%; FLUSH PRIVILEGES;主机部分写网段比写%更安全权限只给增删改查不给 DROP、GRANT 这类高危操作。如果应用确实需要建表权限比如用了自动建表框架再单独加CREATE。远程连不上时排查顺序是服务端是否监听在 0.0.0.0 或者对应网卡bind-address配置项、防火墙是否放行端口、账号的主机部分是否匹配来源 IP。这三点逐个确认基本能覆盖九成情况。5.4 端口冲突、慢查询日志与执行计划的查看入口装完之后建议顺手打开慢查询日志它记录执行时间超过阈值的语句是后面做优化的第一手材料SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 1;long_query_time设成 1 秒适合入门观察正式环境可以根据业务调整。配合EXPLAIN看执行计划能快速判断一条慢语句是走了全表扫描还是命中了索引EXPLAIN SELECT * FROM orders WHERE user_id 1001;看输出里的type列ALL表示全表扫描ref、range、const依次更优key列显示实际用了哪个索引如果是 NULL 就说明没走索引。这几列看熟了日常排慢查询基本够用。6. 客户端连接图形工具和命令行的分工6.1 Workbench 与图形客户端的连接参数对照安装向导里勾了 Workbench 的话打开它首页就有本地实例的快捷入口。手动新建连接时需要填的主要是这几项连接名随便起只是本地标识、主机地址本地是 127.0.0.1远程填 IP、端口默认 3306、用户名、密码以及可选的默认数据库。图形客户端连不上时错误码是最有用的信息。2003 一般是网络或服务问题1045 是账号密码问题1049 是数据库不存在1251 通常和认证插件有关。把错误码和上面这张对照表记下来比漫无目的地重装快得多。错误码常见含义优先检查项2003连不上服务端服务是否启动、端口、防火墙1045账号或密码错误用户名、密码、允许登录的主机1049指定数据库不存在库名拼写、是否已创建1251认证方式不兼容客户端版本、账号认证插件6.2 命令行客户端的几个提效习惯图形工具方便但有些操作命令行更快。我常备的几个习惯用-e直接执行单条语句不进入交互模式写脚本时特别有用用source执行本地的 sql 文件批量建表建数据一步到位用\G代替分号结尾把结果按行竖排显示字段多的表看起来舒服很多。mysql -u root -p -e SHOW DATABASES; mysql -u root -p shop init.sql还有一个小技巧把常用连接写成配置文件放在用户目录下的my.cnf里用[client]段配好 host、user、password之后直接敲mysql就能连上不用每次输一长串参数。但要注意这个文件里的密码是明文的机器如果是共享的别这么干。7. 安装过程中翻车最多的几个场景7.1 服务起不来从错误日志倒着读“服务启动失败”是最笼统的报错真正的答案在错误日志里。Windows 上看数据目录下的.err文件Linux 上看/var/log/mysqld.log或journalctl -u mysqld。常见原因我按出现频率排了个序端口被占用、数据目录权限不对、配置项拼写错误、data 目录里残留了上一次失败的初始化文件、磁盘空间不足。其中“残留文件”这个最容易被忽略——上一次初始化失败后 data 目录不是空的下一次启动会直接拒绝删干净重来即可。读日志的技巧是从最后往前看找到第一条真正的错误而不是最后那条连带报错。比如权限问题会先报“Cant create/write to file”然后一堆后续错误都源于此。7.2 忘记 root 密码的正确重置姿势忘记密码不用重装。停掉服务用跳过权限校验的方式启动mysqld --skip-grant-tables --shared-memory然后另外开一个窗口连上去刷新权限表并改密码FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY 新密码;改完停掉这个临时实例用正常方式启动服务新密码即可生效。整个过程的关键是改密码前必须先FLUSH PRIVILEGES否则会报“权限表未加载”之类的错误很多人就是卡在这一步以为方法不管用。7.3 驱动版本和框架版本不匹配的报错NotSupportedError、MySQL 8.4 or later is required这类报错本质上不是安装问题而是应用层的版本校验没通过。触发原因通常有几种框架升级后提高了对数据库服务端的最低版本要求驱动程序版本太老向框架报告的服务端版本信息不准确连接串里参数写法变了。处理思路是先确定“要求的版本”和“实际连接的版本”分别是多少然后决定是升级服务端还是降级框架。如果只是驱动报告不准升级驱动往往就能解决。升级驱动之前记得看一下驱动和框架版本的兼容矩阵别升过头。7.4 卸载不干净导致重装失败Windows 上重装 MySQL 失败十有八九是上次卸载的残留安装目录还在、数据目录还在、服务还注册着、注册表里还有条目。完整的清理动作是先停服务并删除服务注册再删安装目录和数据目录然后清掉注册表里相关项最后重启再装。Linux 上包管理器卸载相对干净但apt remove和apt purge有区别前者保留配置文件后者一并删除。如果配置里写过自定义路径卸载后数据目录会留在原地重装时如果指向同一个目录可能因为内容不匹配而初始化失败。提示不管是哪个平台重装之前先把旧的数据目录完整备份一份哪怕你觉得里面没重要数据。删掉之后想找回来基本没有可能。8. 装完之后从建库建表到看懂执行计划8.1 一条完整的建库建表流程练手服务跑起来之后用一个小例子把常用语句过一遍比看文档有效得多。建库时显式指定字符集CREATE DATABASE shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; USE shop; CREATE TABLE orders ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, user_id BIGINT UNSIGNED NOT NULL, amount DECIMAL(10,2) NOT NULL DEFAULT 0.00, status TINYINT NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_user_created (user_id, created_at) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这里有个设计细节值得说idx_user_created是个联合索引把user_id放前面、created_at放后面。查询“某用户最近的订单”时这个索引能同时完成过滤和排序避免额外的排序开销。索引列的顺序不是随便排的等值条件在前、范围或排序条件在后是基本规则。至于默认值数值型字段用DEFAULT 0比允许 NULL 更省心因为 NULL 参与运算和比较时行为特殊容易写出意料之外的结果。8.2 用 EXPLAIN 验证索引是否真的生效建完索引不代表查询就会用它。写一条常查的语句前面加EXPLAINEXPLAIN SELECT id, amount FROM orders WHERE user_id 1001 ORDER BY created_at DESC LIMIT 10;重点看三列type如果是ref或range说明索引在起作用key要显示idx_user_createdExtra里如果出现Using filesort就要留意说明排序没走索引很可能是因为索引列顺序和排序方向不匹配。相反出现Using index是好消息说明覆盖索引生效不用回表。这套“建索引、看执行计划、按结果调整”的循环是数据库日常优化最核心的工作方式。安装只是把工具摆上桌真正用起来靠的是这个循环。8.3 常用命令的小抄与连接池配置的关联最后整理几个天天要用的命令都是入门阶段高频动作SHOW DATABASES; SHOW TABLES; DESC orders; SHOW CREATE TABLE orders\G SHOW INDEX FROM orders; SELECT VERSION(), NOW(), USER();顺带提一句连接池。应用连数据库一般不直连而是走连接池。安装完给出连接参数时要一并把池子的关键参数定下来最大连接数不要超过服务端max_connections能承受的范围连接空闲超时要比服务端wait_timeout小否则会出现“连接已被服务端关闭但池子还以为活着”的情况表现为偶发的连接异常。这个坑很隐蔽往往在压测时才会暴露。我在实际部署中养成的习惯是装完 MySQL 之后先跑一轮建库建表加几条查询把字符集、索引、连接参数都验证一遍再交给应用去连。这样如果后面出问题能立刻判断是环境问题还是代码问题排查范围直接缩小一半。至于版本选择这件事我的建议始终是跟着 LTS 走别为了尝鲜把长期维护的成本留给自己。
返回列表