ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

MySQL从零入门:安装配置、SQL实战与索引优化全指南

MySQL从零入门:安装配置、SQL实战与索引优化全指南 我记得刚开始学MySQL的时候走了不少弯路。网上教程东一篇西一篇有的讲半天的概念还没讲到怎么装有的上来就让你敲一堆命令但完全不说为什么。折腾了好久才把从下载安装到写出像样SQL这条路走通。所以这篇想直接按“从零到能干活”的逻辑整理一遍把安装、配置、客户端连接、常用SQL、索引和备份这些环节的关键点都过一遍。内容尽量贴近实际使用场景适合刚接触MySQL的初学者也适合那些装过但没系统梳理过基础操作的人。文章涉及的步骤我都按自己实际的经验写能复现不绕弯子。1. 先搞清楚MySQL是什么能干什么1.1 数据库到底解决什么问题很多人一开始被“数据库”这个词吓住其实没那么玄乎。你可以把MySQL理解成一个超大型的仓库仓库里有一排排货架每个货架上有编号整齐的格子数据就存在这些格子里。和Excel表格不太一样的是MySQL这种关系型数据库能处理的数据量级更大并发访问更稳定而且它有一套严谨的规则来保证数据不乱、不丢、不冲突。举个例子你做一个电商系统用户下单、商品库存、订单记录这些数据如果全放在内存里程序一重启就全没了。放在文件里自己读写那并发一高就会出现两个人同时买同一件商品、库存减出负数这种问题。MySQL通过事务和锁机制帮你把这些问题兜住你要做的只是写SQL把数据交给它管理。MySQL是世界上最流行的开源关系型数据库之一尤其在互联网行业中小型项目里几乎随处可见它的身影。它支持标准的SQL语法能处理复杂查询还能通过主从复制、分库分表等手段扩展能力。对初学者来说找它入门几乎是性价比最高的选择资料多、社区活跃、踩坑经验一搜一大把。1.2 为什么选择MySQL而不是其他数据库市面上常见的数据库不少比如PostgreSQL、SQLite、SQL Server、Oracle。我个人的看法是如果你想走业务开发这条路MySQL是国内企业使用率最高的数据库之一招聘需求里出现频率极高学了能直接用上。SQLite更适合嵌入式或本地小工具PostgreSQL功能更强大但国内普及度相对低一点Oracle和SQL Server则多在传统企业或大型系统里收费或者授权流程较复杂。MySQL还有一个好处是它对硬件要求不高普通电脑也能跑得很流畅很适合学习。而且它同时支持命令行操作和图形化工具初学阶段可以直接用命令练手理解SQL的执行逻辑比一上来就靠图形界面“点点点”学得更扎实。1.3 MySQL架构和基本概念速览安装之前先把几个最基础的概念理顺。MySQL服务端是一个常驻运行的程序它监听某个端口默认是3306等着客户端来连接。客户端可以是命令行工具mysql也可以是Navicat、Workbench这类图形界面程序。你连接时输入的账号密码实际是MySQL内部维护的用户系统中记录的认证信息。在MySQL里数据按库、表、字段来组织。一个库可以理解成一个仓库一张表是一个货架字段就是货架上的分类标签每一行数据是一个具体的货品。SQL语句就是你对仓库下达的操作指令比如“把A货架上编号为3的货品数量改成10”。索引则是数据库为了加速查询而建立的“目录”。想象一本厚字典如果你要查“mysql”这个单词没有目录的话得一页页翻有目录直接翻到对应页码就行。索引也是类似的原理后面我会专门讲它的使用。2. 安装篇从版本选择到MySQL跑起来2.1 版本选型别盲目追新MySQL的版本迭代节奏比较快目前主流的是8.0系列还有8.4 LTS长期支持版以及9.x创新版。对于刚入门的朋友我建议直接选择8.0.x版本比如8.0.43或者8.0.46这种较为日常的版本。原因很简单8.0是市面上使用范围最广、资料最多的版本你遇到问题搜索时基本都能找到对应答案。8.0相比老版本5.7有几个很明显的提升默认字符集变成了utf8mb4能完整支持中文和emoji支持窗口函数、公共表表达式这些高级查询特性默认认证插件是caching_sha2_password安全性更好。如果你在网上看到老教程让你装5.7也不是不能用但新项目我建议直接上8.0少踩历史坑。至于安装方式MySQL在Windows上有两种主流选择一个是下载安装包MSI Installer图形化安装另一个是下载免安装ZIP压缩包自行配置。我用得最多的是压缩包方式它干净、可控、不往系统里塞多余的东西出了问题也容易清理。下面重点讲这种方式。2.2 Windows环境ZIP压缩包安装详细步骤先去MySQL官网的下载页面找到“MySQL Community Server”的下载入口选择Windows (x86, 64-bit), ZIP Archive版本。这里要留意官网需要登录Oracle账号才能下载但有一个“No thanks, just start my download”的链接可以跳过登录直接下载。下载后把压缩包解压到一个无中文、无空格的路径下我习惯放在D盘根目录比如D:\mysql-8.0.46-winx64。解压完后目录里默认有一个my.ini的示例吗实际是有的但有时候不显眼。我们建议自己手动创建一个my.ini配置文件内容大致如下[mysqld] # 设置端口 port3306 # 设置MySQL安装目录解压目录 basedirD:/mysql-8.0.46-winx64 # 设置MySQL数据目录存放数据库文件 datadirD:/mysql-8.0.46-winx64/data # 默认字符集 character-set-serverutf8mb4 # 默认排序规则 collation-serverutf8mb4_unicode_ci # 兼容旧客户端认证方式 default_authentication_plugincaching_sha2_password [client] default-character-setutf8mb4配置好之后用管理员身份打开命令提示符进入MySQL的bin目录依次执行三条关键命令。第一条是初始化数据目录同时生成一个临时的空密码root账号mysqld --initialize-insecure --console这一句执行完会在解压目录下生成data文件夹里面是MySQL的系统数据库。--initialize-insecure的意思是创建一个root用户密码为空。如果你用--initialize则会给一个随机密码新手容易找不到所以我建议先用insecure方式初始化后面自己改密码。第二条是注册Windows服务让MySQL可以开机自启并且可以用Windows服务管理器统一管理mysqld --install MySQL执行完如果显示 “Service successfully installed”说明服务注册成功。此时可以去Windows服务列表确认“MySQL”这个服务是否存在。第三条是启动服务net start MySQL启动后MySQL就会在3306端口监听。如果启动失败最常见的原因是my.ini里路径没写对或者data目录已经存在导致初始化冲突。排查时可以看MySQL的错误日志通常位于data目录下后缀为.err的文件里。2.3 修改root密码并创建自己的用户服务起来以后用命令行工具连接本地MySQL。初始时root没有密码直接回车登录mysql -uroot -p提示输入密码时直接回车。登录成功后执行以下语句修改root密码并让配置生效ALTER USER rootlocalhost IDENTIFIED BY 你的密码; FLUSH PRIVILEGES;我个人不建议日常开发都用root账号风险太大。可以创建一个专门用于项目的账号CREATE USER appuserlocalhost IDENTIFIED BY app_password; GRANT ALL PRIVILEGES ON mydb.* TO appuserlocalhost; FLUSH PRIVILEGES;上面两句话是说创建一个只能在本机登录的appuser账号并把mydb这个库的所有权限都给它。以后写代码连数据库就用这个账号不要把root密码写进项目里。2.4 Docker方式安装MySQL如果你的开发环境是MacOS或者Linux或者你不想在Windows里装一堆东西Docker是一个很好的选择。Docker把MySQL跑在一个轻量级容器里启动和销毁都很快还能保持宿主机环境干净。一条典型命令如下docker run --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD123456 \ -e MYSQL_DATABASEmydb \ -v /my/own/datadir:/var/lib/mysql \ -d mysql:8.0这里解释一下-p 3306:3306把容器内的3306端口映射到宿主机这样你用Navicat连localhost:3306就能访问MYSQL_ROOT_PASSWORD是root初始密码MYSQL_DATABASE会自动创建一个默认数据库-v指定数据卷把数据库文件持久化到宿主机目录否则容器删掉数据就没了。Docker方式装MySQL有个好处卸载的时候直接docker rm -f mysql8就全部清干净不会像Windows服务那样留下残留。但要注意生产环境别图方便直接挂-p 3306:3306不设密码安全配置还是要做扎实。3. 客户端连接命令行、Workbench和Navicat3.1 命令行基础操作习惯MySQL自带了一个文本客户端就是你刚才用来登录的mysql命令。它的作用不只是登录所有SQL操作都能在里面执行。熟练使用命令行是一个基本功因为将来你在服务器上排查问题时不一定有图形界面可用。进入命令行后可以用这些基础命令快速了解当前环境-- 查看MySQL版本 SELECT VERSION(); -- 查看当前用户 SELECT CURRENT_USER(); -- 查看所有数据库 SHOW DATABASES; -- 切换数据库 USE mydb; -- 查看当前库所有表 SHOW TABLES;有几点习惯我建议尽早养成。SQL语句里关键字大写是一种行业惯例虽然MySQL本身不区分大小写但代码里关键字大写能让语句更清晰。每条语句以分号结尾否则MySQL会一直等待你的结束符。多用\G代替分号能让查询结果竖排显示字段多的时候可读性会好很多。3.2 MySQL Workbench能做什么MySQL官方提供了一个免费图形化客户端Workbench。它最大的优势是免费、跨平台、功能完整。安装后在“Database”菜单里选择“Connect to Database”填上主机名、端口、用户名和密码就能连接到本地或远程的MySQL实例。Workbench的界面大致分为三个区域左侧是导航面板能看到所有数据库的对象中间是SQL编辑区域你写SQL的地方下方是结果网格查询结果会以表格形式显示。它还有个非常有用的功能是反向工程可以直接从现有数据库生成ER图方便你理解和设计表关系。另外它自带的备份恢复工具也比较好用选择对应数据库点几下就能导出结构或数据。对于初学者我建议把它当成一个辅助工具用来查看表结构和可视化关系。真正写SQL时还是在命令行或者编辑器里手敲这样能巩固记忆。3.3 Navicat和同类工具的选择Navicat是另一款非常流行的MySQL客户端界面更现代操作更顺手很多公司开发都在用。它支持MySQL、MariaDB、PostgreSQL等多种数据库还有数据同步、结构同步、导入导出、计划任务备份等功能。不过Navicat是收费软件虽然功能确实好用但如果你是个人学习不一定非要买可以用官方Workbench替代或者寻找一些开源免费方案。网上很多人搜Navicat破解版或者注册码我不建议这么做。一是破解软件来源不稳定容易捆绑恶意程序数据库客户端天天要输密码和操作核心数据风险极高二是从学习角度Workbench功能和Navicat重叠度已经很高了。如果你的公司购买了正版授权那用起来确实香可以尝尝鲜。工具选型上我的经验是平时日常工作用图形化客户端提高效率但遇到慢查询、锁等待这种复杂问题还是回归命令行配合EXPLAIN看执行计划更清晰。工具只是手段SQL能力和数据库原理才是核心。4. 实战篇从建库建表到写业务SQL4.1 设计一个简单的业务表安装配置完成后最好找一个具体场景来练手。我用一个最常见的例子用户订单系统。第一步创建数据库CREATE DATABASE IF NOT EXISTS shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE shop;这里显式指定utf8mb4和unicode的排序规则是为了确保中英文存储不出乱码并且排序比较时更符合常规。第二步创建用户表和订单表CREATE TABLE user ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, username VARCHAR(50) NOT NULL COMMENT 用户名, email VARCHAR(100) DEFAULT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表; CREATE TABLE orders ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, user_id INT UNSIGNED NOT NULL, amount DECIMAL(10,2) NOT NULL DEFAULT 0.00, status TINYINT NOT NULL DEFAULT 0 COMMENT 0-待支付 1-已支付 2-已取消, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_user_id (user_id), KEY idx_created_at (created_at) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT订单表;字段类型是我特意想提醒重点的地方。id用了INT UNSIGNED因为用户量一般不会超过40亿还可以加AUTO_INCREMENT自增amount用了DECIMAL(10,2)而不是FLOAT或DOUBLE因为金额对精度要求高浮点数会产生精度偏差结账时多一分少一分都是事故status用TINYINT定长整型保存状态码比字符串更节省空间且查询更快。4.2 增删改查写SQL前的思维训练数据操作最核心的四个动作是增删改查分别对应INSERT、DELETE、UPDATE、SELECT。插入数据INSERT INTO user (username, email) VALUES (zhangsan, zhangsanexample.com);批量插入时可以写多组值INSERT INTO user (username, email) VALUES (lisi, lisiexample.com), (wangwu, wangwuexample.com);查询数据时不要养成SELECT *的习惯尽量只查需要的字段一方面减少网络传输另一方面能让MySQL优化器更轻松SELECT id, username, email FROM user WHERE id 1;更新数据时最关键的是别忘了WHERE条件UPDATE orders SET status 1 WHERE id 10;如果不小心把WHERE漏了整个表的数据都会被更新到同一个状态后果相当严重。这个坑我见过不止一次写上一条没WHERE的UPDATE之前先数一数自己有几条命。删除数据同理DELETE之前先SELECT确认范围SELECT * FROM orders WHERE id 10; DELETE FROM orders WHERE id 10;数据删除后默认不可恢复所以在生产环境执行DELETE和UPDATE之前务必确认条件正确并做好备份。4.3 UPDATE配合子查询小心这个坑在实际业务里有时候更新一张表的字段需要根据另一张表的数据来计算。热搜词里有“mysql中更新子查询”说明不少人碰到过这类需求。比如你想把所有用户的订单总额回写到user表的一个字段里很多人第一反应是UPDATE user u SET total_amount ( SELECT SUM(o.amount) FROM orders o WHERE o.user_id u.id );这条SQL在MySQL里有可能会报错You cant specify target table user for update in FROM clause。原因很经典MySQL不允许在同一语句中直接先从目标表读取数据再更新这张表逻辑上会造成冲突。解决办法是套一层派生表UPDATE user u SET total_amount ( SELECT total FROM ( SELECT user_id, SUM(amount) AS total FROM orders GROUP BY user_id ) tmp WHERE tmp.user_id u.id );更高效的做法是使用多表更新语法UPDATE user u LEFT JOIN ( SELECT user_id, SUM(amount) AS total FROM orders GROUP BY user_id ) o ON o.user_id u.id SET u.total_amount COALESCE(o.total, 0);COALESCE的作用是当左连接没匹配上时把NULL转成0避免出现NULL参与后续计算的问题。实际业务里回填汇总数据很常见掌握多表更新比子查询更实用。4.4 排序和字段运算热搜词里有“mysql排序”和“mysql中int5”这两个都是写查询时很基础但容易忽略的点。排序用ORDER BY可以指定升序ASC或降序DESCSELECT id, amount, created_at FROM orders ORDER BY created_at DESC;多字段排序时排序规则从左到右依次生效比如先按状态排序状态相同再按金额降序SELECT id, status, amount FROM orders ORDER BY status ASC, amount DESC;所谓int5其实是MySQL允许在查询中对数值字段做表达式运算。比如你想给所有订单金额加上5元优惠后再排序SELECT id, amount 5 AS adjusted_amount FROM orders ORDER BY adjusted_amount DESC;AS关键字用来给计算结果起个别名后面可以在ORDER BY中引用。但要注意如果按别名排序WHERE条件里不能使用这个别名因为SQL的执行顺序是先过滤再计算再排序。这个顺序在复杂查询里非常容易踩坑。聚合函数也经常和排序搭配使用。比如统计每个用户的总订单金额SELECT user_id, SUM(amount) AS total FROM orders GROUP BY user_id ORDER BY total DESC;GROUP BY之后只能用聚合函数或者分组字段本身这是SQL的一个基本规则初学者最容易在这里犯迷糊。5. 进阶篇索引、存储过程与自动备份5.1 索引原理与创建索引的实用建议官方文档说索引是MySQL高效获取数据的数据结构。这块内容值得多花点心思理解因为面试爱考生产环境排查慢查询更是离不开它。MySQL最常用的索引底层数据结构是B树。你可以把它理解成一本多级目录最顶层是根节点往下有分支节点最底层是叶子节点数据都存在叶子节点上。B树的查询时间复杂度比较稳定而且叶子节点之间有指针相连做范围查询时效率极高。如果一张表里没有索引MySQL就要全表扫描数据量大到几百万行时一次查询可能得好几秒甚至更久。加了合适的索引以后查询可能毫秒级就返回了。创建索引的语法很简单CREATE INDEX idx_username ON user(username);也可以在建表时就指定或者在表结构变更时添加ALTER TABLE orders ADD INDEX idx_user_created (user_id, created_at);这个复合索引(user_id, created_at)的含义是先按user_id排序在user_id相同的情况下再按created_at排序。如果你经常按某个用户查他的订单并且按时间排序这个索引就能完美覆盖。创建索引有几个原则。第一索引不是越多越好每多一个索引就多一份写入时的维护成本第二区分度高的字段适合做索引比如订单号、用户ID性别这种只有两三个值的字段就不太值得第三不要在索引列上做函数运算比如WHERE DATE(created_at) 2025-01-01会导致索引失效可以改成范围查询WHERE created_at 2025-01-01 AND created_at 2025-01-02。怎么判断自己的SQL是否用上了索引在SQL前面加一个EXPLAINEXPLAIN SELECT id, amount FROM orders WHERE user_id 100;结果里的type是ref或者range表示用到了索引如果type是ALL则说明是全表扫描需要警惕。5.2 存储过程什么时候值得用存储过程是数据库里预先编译好的一段SQL逻辑集合。说得直白一点它就像你在数据库这边写好的一堆python函数调用时只需要传参数。一个简单的示例是给用户创建订单同时记录日志DELIMITER $$ CREATE PROCEDURE create_order( IN p_user_id INT, IN p_amount DECIMAL(10,2) ) BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; RESIGNAL; END; START TRANSACTION; INSERT INTO orders (user_id, amount, status) VALUES (p_user_id, p_amount, 0); INSERT INTO order_log (user_id, action, created_at) VALUES (p_user_id, create_order, NOW()); COMMIT; END$$ DELIMITER ;调用它CALL create_order(1, 199.00);存储过程的优点是把业务规则封装在数据库里多个应用服务都能复用而且减少了网络往返。缺点也很明显不好调试版本管理困难数据库的压力会变大。我的建议是初学者了解语法即可生产中尽量少用复杂存储过程把核心业务逻辑放在应用层代码会更好维护。只在那种对数据一致性要求高、逻辑非常固定的场景下比如统计汇总、批量归档可以谨慎使用。5.3 Windows下用bat脚本定时备份数据备份是每一个数据库使用者都必须重视的事情。手动备份偶尔一次两次没问题但人总会忘。写一个bat脚本加上Windows计划任务就能实现每天自动备份。一个简单的mysqldump备份脚本如下echo off set timestamp%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2% set bk_dirD:\mysql_backup set mysql_binD:\mysql-8.0.46-winx64\bin set db_nameshop if not exist %bk_dir% mkdir %bk_dir% %mysql_bin%\mysqldump -uroot -pYourPassword --single-transaction --default-character-setutf8mb4 %db_name% %bk_dir%\%db_name%_%timestamp%.sql echo Backup completed: %bk_dir%\%db_name%_%timestamp%.sql然后把这个脚本添加到Windows“任务计划程序”里每天凌晨2点执行一次。--single-transaction参数对InnoDB引擎非常重要它能在备份期间保证数据一致性又不会锁住线上表影响读写。这里有个我想提醒的坑不要在脚本里明文写root密码。可以把密码放到一个独立配置文件里或者使用环境变量。备份脚本权限要收紧不然数据库密码就泄露了。另外备份文件要定期清理否则磁盘会被慢慢塞满。可以配合forfiles命令删除7天前的备份文件forfiles /p %bk_dir% /s /m *.sql /d -7 /c cmd /c del path6. 常见问题与排查技巧6.1 连接不上MySQL的排查思路连接不上MySQL是新手问得最多的问题报错通常是Cant connect to MySQL server on localhost (10061)。遇到这个错误先别慌按顺序排查。第一步确认MySQL服务是否在运行Windows下单命令行执行sc query MySQL或者用net start检查第二步确认端口占用情况执行netstat -ano | findstr 3306看端口是否在被监听第三步检查连接参数服务端是否绑定了特定IP如果my.ini里设置了bind-address127.0.0.1那么其他机器是连不上这台数据库的。远程连接时还有一层安全拦截MySQL用户表里记录的Host决定了这个账号可以从哪里登录。前面我们创建的rootlocalhost只能本机登录如果想让其他机器连接需要创建一个root%这样允许任意Host的用户但这在生产环境风险很高最好限定具体IP。6.2 字符集乱码和大小写问题乱码的根源通常是客户端、连接、服务器、数据库、表这五个层级的字符集没有统一。MySQL 8.0默认已经是utf8mb4但如果你的SQL工具或连接字符串指定了错误字符集依然会出现中文乱码。连接后可以先执行SHOW VARIABLES LIKE character_set%;重点看character_set_server和character_set_database是否都是utf8mb4。如果有不一致可以在连接URL里加上characterEncodingutf8JDBC场景或者在bat脚本里指定--default-character-setutf8mb4。大小写问题也是MySQL里很有名的坑。Linux系统下MySQL的表名默认区分大小写Windows下默认不区分。这是因为底层文件系统特性不同。需要调整的话可以在my.ini的[mysqld]下设置lower_case_table_names11表示表名全部转为小写存储不区分大小写0表示区分大小写。这个参数在MySQL 8.0里修改比较麻烦因为它会影响数据目录所以最好在初始化之前就确定。至于字符串内容的大小写比较则由排序规则决定。utf8mb4_general_ci里的ci就是case-insensitive不区分大小写如果你需要区分可以改列级别的排序规则为utf8mb4_bin。6.3 忘记root密码怎么办这个情况几乎所有人都遇到过。MySQL 8.0处理方式是跳过权限验证登录然后修改密码再恢复原状。首先停止MySQL服务然后在管理员命令行里用以下命令以跳过授权表的方式启动mysqld --skip-grant-tables --shared-memory这个命令会让MySQL跳过权限检查方便你登录。此时新开一个命令行窗口执行mysql -uroot进入后再手动刷新权限因为跳过模式下有些操作受限FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY new_password;改完密码后回到第一个窗口按CtrlC终止跳过模式的MySQL进程再正常启动服务就行了。注意跳过授权表模式下MySQL是完全开放的任何本机用户都能连进来操作时要确保机器安全尽快完成密码重置。6.4 连接池打满和自动断开的隐患如果你的应用用到了数据库连接池比如HikariCP、Druid偶尔会出现Connection is not available, request timed out的情况。这通常是连接池的活动连接达到了上限常见原因有慢SQL把连接长时间占用不释放、连接泄漏代码里获取连接后没归还、数据库的max_connections设置得太小。排查时可以进入MySQL查看当前连接数SHOW STATUS LIKE Threads_connected; SHOW VARIABLES LIKE max_connections;如果发现Threads_connected接近上限就说明并发连接太多或者连接泄漏严重。除了优化代码还可以调整连接池参数比如最大连接数、连接超时时间、空闲回收时间。另一个常见迷惑行为是程序运行一段时间后第一次执行的SQL报错Connection has been closed。这多半是数据库空闲超时把连接断掉了而连接池没有及时感知。解决方法是配置连接池的testWhileIdle或validationQuery以及连接最大存活时间让它主动踢掉死连接。7. 写在最后的实操建议MySQL入门这条路说难不难说简单也不简单。最难的部分往往不是语法而是“不知道自己在干什么”的状态。比如配好了却不明白端口是什么写出了SQL却不理解执行顺序建了索引却不知道它怎么加速。所以我特别建议大家在学习过程中多问一层“为什么”像8.0默认的认证插件为什么会让老客户端连不上事务隔离级别为什么默认是Repeatable ReadB树和红黑树在数据库场景下为什么选前者这些问题想明白了基础才算扎实。我建议的学习路径先把安装和基本CRUD跑顺然后花时间搞懂索引的原理和解释执行计划接下来多练JOIN、GROUP BY、子查询这些进阶语法最后一定要自己动手配一次备份。遇到问题别先想着换工具先用日志和状态命令看证据。MySQL其实是个很老实的软件它不会无缘无故出问题大多数报错都直接告诉了你原因只是你还没来得及看仔细。如果你按上面这些内容自己走完一遍基本的建库建表、查询优化、备份恢复就都摸到门路了。后面无论是去看面试题还是学习分库分表都有了一定的底子。数据库这条路很长先把MySQL这台机器真正跑起来就算迈出了最实在的第一步。
返回列表