还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
数据库MySQL欢迎参加MySQL数据库课程!在当今数据驱动的世界中,掌握MySQL这一强大的关系型数据库管理系统已成为技术人员的基本技能本课程将全面介绍MySQL数据库的核心概念、安装配置、基础操作以及高级应用,帮助您从入门到精通无论您是数据库初学者还是希望提升技能的开发人员,都能从中获益我们将通过理论讲解与实践案例相结合的方式,确保您能够掌握MySQL的各项功能,并能在实际工作中灵活应用让我们一起开始这段学习旅程吧!什么是数据库?数据库基本概念常见数据库类型数据库是一个按照数据结构来组织、存储和管理数据的仓库它•关系型数据库MySQL、Oracle、SQL Server、可以高效地存储、检索、管理和维护数据,提供数据安全性与完PostgreSQL整性保障•非关系型数据库MongoDB、Redis、Cassandra数据库系统主要由数据库、数据库管理系统DBMS、数据库应•内存数据库Redis、Memcached用程序和数据库管理员组成,共同协作确保数据的有效管理与利•图形数据库Neo4j、ArangoDB用不同类型数据库各有特点,适用于不同的应用场景和数据处理需求简介MySQL定位主要特性MySQLMySQL是世界上最受欢迎的开源•开源且免费(社区版)关系型数据库管理系统之一,以•跨平台兼容性强其可靠性、易用性和性能著称•多种存储引擎支持它成为Web应用程序的标准数据•优秀的性能和可扩展性库选择,特别是与PHP搭配使用的LAMP架构中的关键组件与其他数据库对比相比Oracle、SQL Server等商业数据库,MySQL具有部署简单、成本低廉的优势;与PostgreSQL相比,MySQL的安装和维护更为简便,但PostgreSQL在某些高级特性上更为完善发展历程MySQL年19951MySQL首个内部版本发布,由瑞典MySQL AB公司开发年22000发布
3.23版本,引入InnoDB存储引擎年20083Sun Microsystems收购MySQL AB年42010Oracle收购Sun,引发社区担忧,MariaDB分支诞生年起20155MySQL
5.7和
8.0版本发布,引入JSON支持、Window函数等现代特性随着Oracle收购MySQL后,社区担忧其开源未来,促使原MySQL开发者创建了MariaDB分支目前,MySQL和MariaDB作为两个独立分支并行发展,都拥有大量忠实用户和应用场景两者保持高度兼容性,但在新特性和许可证方面有所不同应用场景MySQL互联网企业电子商务金融系统Facebook、Twitter、阿里巴巴、京东、亚马逊等电许多银行和金融机构使用YouTube等巨头都在核心系商平台大规模应用MySQL存MySQL处理日常交易数据,统中使用MySQL它能够支储产品信息、订单数据和用户其ACID特性保证了金融数据持高并发访问,处理海量数信息MySQL的事务处理能的准确性和安全性,满足监管据,同时保持较好的性能表力保证了电子支付的安全性和合规要求现,非常适合用户数据和内容一致性管理日志分析网站访问日志、应用程序日志等大量结构化数据的存储和分析,MySQL提供高效的读写性能和灵活的查询能力数据库安装部署概述选择安装方式安装前准备可选择官方安装包、操作系统包管理器、确定系统环境安装前需检查系统是否满足最低要求4GB Docker容器化部署或源码编译安装对于生MySQL支持多种操作系统平台,包括以上内存、2GB以上磁盘空间(建议产环境,建议使用稳定版本而非最新开发Windows、Linux各发行版、macOS等不SSD)此外,还需要确认系统是否已安装版,以确保系统稳定性同平台的安装方式略有不同,但核心功能保必要的依赖库,防火墙是否开放相应端口持一致在选择版本时,需考虑系统兼容性(默认3306)和硬件要求系统下安装Windows MySQL下载安装程序访问MySQL官方网站mysql.com,下载MySQL Installerfor Windows建议选择包含所有组件的完整版本,初学者可选择Developer Default安装类型运行安装向导双击安装包启动向导,按提示选择安装类型、配置组件和安装位置可同时安装MySQL Server、Workbench、Connector等组件,方便后续开发使用服务器配置设置MySQL服务器的配置类型(开发/生产)、网络连接、身份验证方式,并创建root用户密码建议记录此密码,它是后续管理的重要凭证完成安装配置Windows服务和防火墙设置,确保MySQL服务自动启动,并可通过网络访问(如需要)最后点击Finish完成整个安装过程系统下安装Linux MySQL使用包管理器安装安全配置对于Ubuntu/Debian:sudo aptupdate运行mysql_secure_installation脚本进sudo aptinstall mysql-server行安全配置,包括设置root密码、删除对于CentOS/RHEL:sudo yuminstall匿名用户、禁止远程root登录等加强安全性的措施mysql-server源码编译安装(高级)服务管理下载源码包,解压后执行./configure、使用systemctl命令管理MySQL服务make、make install等命令,可定制更sudo systemctl多编译选项,适合有特殊需求的高级用start/stop/restart/status mysql户配置文件结构MySQL配置文件位置Windows:C:\ProgramData\MySQL\MySQLServer X.X\my.iniLinux:/etc/mysql/my.cnf或/etc/my.cnf主要配置段[client]-客户端配置[mysqld]-服务器端配置[mysql]-命令行客户端配置常用参数port-端口号默认3306datadir-数据存储目录max_connections-最大连接数innodb_buffer_pool_size-InnoDB缓冲池大小character-set-server-服务器字符集配置文件采用INI格式,分为多个配置段,每个段用方括号标识修改配置文件后需重启MySQL服务才能生效建议在修改前备份原配置文件,以防配置错误导致服务无法启动对于性能优化,重点关注内存相关参数,通常建议将innodb_buffer_pool_size设置为系统可用内存的50%-70%启动与关闭服务MySQL系统系统常见问题排查Windows Linux通过服务管理启动/停止使用systemd管理(现代Linux发行服务无法启动的常见原因版)•控制面板→管理工具→服务•配置文件错误•sudo systemctlstart mysql•找到MySQL服务,右键选择启动/•数据目录权限问题停止/重启•sudo systemctlstop mysql•端口冲突•sudo systemctlrestart mysql使用命令行•内存不足•sudo systemctlstatus mysql检查错误日志(error log)是排查问题的•net startmysql使用service命令(旧版系统)最佳方法•net stopmysql•sudo servicemysqlstart/stop/restart客户端工具MySQLMySQL提供多种客户端工具,满足不同用户的需求命令行客户端(mysql)是最基本的交互工具,适合脚本操作和自动化任务;MySQL Workbench是官方提供的图形界面工具,支持数据库设计、SQL开发和管理;phpMyAdmin是流行的基于Web的管理工具,安装简便;Navicat是功能强大的商业工具,提供全面的数据库管理功能连接数据库的基本命令mysql-h主机名-u用户名-p密码-P端口数据库名例如mysql-h localhost-u root-p-P3306mysql体系结构MySQL客户端连接层处理连接、认证和安全层SQL解析、优化和执行SQL查询存储引擎层负责数据的实际存储和管理MySQL采用插件式架构,其核心是SQL层和存储引擎层的分离设计SQL层负责接收客户端请求,解析SQL语句,并生成执行计划;存储引擎层则专注于数据存储和管理,不同存储引擎具有不同的功能特点常见存储引擎包括InnoDB(默认,支持事务、外键和行级锁)、MyISAM(查询性能好,不支持事务)、Memory(内存存储,速度极快但不持久)、Archive(高压缩比,适合归档)等MySQL的多引擎架构使其能够灵活应对不同场景的需求用户与权限管理基础用户创建CREATE USERusername@host IDENTIFIEDBY password;例CREATE USERdbadmin@localhost IDENTIFIEDBY secure123;授予权限GRANT privilegesON database.table TOusername@host;例GRANT SELECT,INSERT ON company.employees TOdbadmin@localhost;撤销权限REVOKE privilegesON database.table FROMusername@host;例REVOKE INSERTON company.*FROM dbadmin@localhost;删除用户DROP USERusername@host;例DROP USERdbadmin@localhost;理解数据库与表数据库()表()Database Table数据库是表的集合,是一个更表是数据存储的基本单位,由高级别的组织单元它允许在行和列组成每一列代表一个逻辑上分组相关的表,并应用字段,定义了存储的数据类统一的访问控制和管理策略型;每一行代表一条记录,包创建数据库的命令CREATE含该实体的所有属性值创建DATABASE表的命令CREATE TABLEdatabase_name;table_namecolumn_definitions;命名规范数据库和表名建议使用小写字母,单词间用下划线分隔(例如customer_orders)名称长度应适中,能清晰表达其用途避免使用MySQL保留字和特殊字符,遵循团队一致的命名约定数据类型详解数值类型INT、TINYINT、BIGINT、FLOAT、DOUBLE、DECIMAL字符串类型CHAR、VARCHAR、TEXT、ENUM日期时间类型DATE、TIME、DATETIME、TIMESTAMP二进制类型BLOB、BINARY、VARBINARY选择合适的数据类型对数据库性能和存储效率至关重要数值类型中,INT适合普通整数,DECIMAL适合需要精确计算的金额;字符串类型中,CHAR适合固定长度字符串,VARCHAR适合变长字符串;日期类型中,TIMESTAMP会自动随记录更新而更新,适合记录修改时间字段约束包括NOT NULL(强制非空)、UNIQUE(确保唯一性)、DEFAULT(设置默认值)、CHECK(验证数据有效性,MySQL
8.
0.16后支持)等,可在创建表时添加这些约束确保数据完整性表的创建与管理--创建表CREATE TABLE employees id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR100NOT NULL,email VARCHAR100UNIQUE,department VARCHAR50,salary DECIMAL10,2,hire_date DATE,INDEX idx_department department;--修改表结构ALTER TABLEemployeesADD COLUMNphone VARCHAR20,MODIFY COLUMNsalary DECIMAL12,2;--删除表DROP TABLEemployees;创建表时,需要明确定义每个字段的数据类型和约束条件PRIMARY KEY定义主键,确保记录唯一性;AUTO_INCREMENT允许自动生成递增的ID值;INDEX定义索引,提高查询效率修改表结构使用ALTER TABLE语句,可添加、修改或删除列,但在生产环境中应谨慎操作,避免影响正在运行的应用程序在大型系统中,推荐使用数据库版本控制工具(如Flyway、Liquibase)管理表结构变更,确保变更可追踪且可重现创建表前应进行充分的数据建模,避免频繁修改结构主键与外键主键(Primary Key)外键(Foreign Key)主键是表中唯一标识每条记录的字段或字段组合主键必须包含唯一值,且不能为外键是表中引用另一个表主键的字段,用于建立表之间的关联关系外键确保引用NULL一个表只能有一个主键,但可以由多个字段组成(复合主键)完整性,防止出现孤立的记录CREATE TABLEstudentsCREATE TABLEclasses student_id INTPRIMARY KEY,class_id INTPRIMARY KEY,name VARCHAR100NOT NULLclass_name VARCHAR50;;CREATE TABLEstudents student_id INTPRIMARY KEY,主键的选择应考虑唯一性、不变性、简单性和非空性常用自增整数或UUID作name VARCHAR100,为主键class_id INT,FOREIGN KEYclass_idREFERENCES classesclass_id;外键约束可设置级联动作ON DELETE和ON UPDATE,常用选项包括CASCADE(级联操作)、SET NULL、RESTRICT等自动增长与默认值AUTO_INCREMENT特性默认值设置实际应用示例AUTO_INCREMENT是MySQL中用于自动生成序列值的特DEFAULT关键字用于为字段指定默认值,当插入记录时未提性,通常用于主键字段当插入新记录时,如果未指定该字段供该字段的值时,将使用默认值这对于确保数据完整性和简CREATE TABLEorders的值或指定为NULL,MySQL会自动分配下一个可用的序列化数据输入非常有用order_id INTAUTO_INCREMENT PRIMARY KEY,值customer_id INTNOT NULL,几乎所有数据类型都可以设置默认值,包括当前时间戳order_date DATETIMEDEFAULTAUTO_INCREMENT字段必须被索引(通常是主键),且只能(CURRENT_TIMESTAMP)NULL也可以作为默认值,但CURRENT_TIMESTAMP,应用于整数类型字段(INT、BIGINT等)每个表只能有一个字段必须允许NULL值status VARCHAR20DEFAULT pending,AUTO_INCREMENT字段total_amount DECIMAL10,2DEFAULT
0.00;在此示例中,新订单创建时会自动分配唯一的order_id,如果未指定order_date则使用当前时间,状态默认为pending,总金额默认为0索引基础4主要索引类型MySQL支持的主要索引类型数量,包括主键索引、唯一索引、普通索引和全文索引70%查询性能提升使用适当索引后典型查询的性能提升百分比5-8索引字段限制推荐的单个索引中包含的最大字段数量16最大索引键长度InnoDB存储引擎默认情况下单个索引的最大长度(单位KB)索引是数据库中用于提高查询性能的数据结构,类似于书籍的目录MySQL主要使用B+树索引结构,它能够高效地进行范围查询和排序操作虽然索引可以显著提高SELECT查询速度,但也会降低INSERT、UPDATE和DELETE操作的性能,因为每次数据变更都需要更新索引创建索引的基本语法CREATE INDEXindex_name ON table_name column1,column2,...选择索引字段时,应考虑查询频率、选择性(不同值的比例)以及字段大小避免在频繁更新或很少查询的字段上创建索引数据的基本操作插入数据(INSERT)INSERT INTOtable_name column1,column2,...VALUES value1,value2,...;可一次插入多行INSERT INTOtable_name VALUESrow1,row2,...;更新数据(UPDATE)UPDATE table_name SETcolumn1=value1,column2=value2WHERE condition;注意不带WHERE子句将更新表中所有记录,使用前务必确认条件删除数据(DELETE)DELETE FROM table_name WHERE condition;同样,不带WHERE子句将删除表中所有记录,操作前应先用SELECT测试条件安全操作建议重要操作前先备份数据;大型删除/更新考虑分批处理;优先使用事务,确保操作可回滚;在测试环境验证复杂SQL语句批量插入与导入数据批量语句导入使用工具导入INSERT LOAD DATA除了SQL语句,还可以使用多种工具导INSERT INTOemployees LOADDATA INFILE入数据name,department,salary/path/to/file.csvVALUES INTOTABLEemployees•mysqldump导出再导入张三,研发部,8000,FIELDS TERMINATEDBY,•MySQL Workbench导入向导李四,市场部,7500,ENCLOSED BY•mysqlimport命令行工具王五,财务部,9000,LINES TERMINATEDBY\n•数据库迁移工具(如Navicat)赵六,研发部,8500;IGNORE1LINES;大型数据迁移建议在低峰时段进行,并事先估算所需时间相比多次执行单行INSERT,批量插入可LOADDATA是最快的数据导入方式,可显著提高性能,减少网络通信和事务开直接从CSV、TSV等文件导入数据在销大量数据可分批次执行,每批约服务器上执行比客户端更高效,但需要1000条文件系统权限查询基本语法SELECT[DISTINCT]column1,column2,...FROM table_name[WHEREcondition][GROUP BYcolumns][HAVING group_condition][ORDER BYcolumns[ASC|DESC]][LIMIT offset,row_count];SELECT语句是SQL中最常用的命令,用于从一个或多个表中检索数据最简单的形式是SELECT*FROM table_name,这将返回表中的所有列和所有行但在实际应用中,应避免使用星号*,而是明确指定需要的列,这样可以减少数据传输量和提高查询效率DISTINCT关键字用于去除结果集中的重复行;FROM子句指定查询的数据源;WHERE子句用于筛选符合条件的记录;GROUP BY用于分组;HAVING用于过滤分组;ORDERBY用于排序;LIMIT用于分页SQL语句的执行顺序与书写顺序不同,实际执行顺序是FROM→WHERE→GROUP BY→HAVING→SELECT→DISTINCT→ORDER BY→LIMIT条件查询WHERE比较操作符逻辑操作符•=(等于)WHERE salary=5000•AND(与)WHERE salary5000•!=或(不等于)WHERE ANDdept=研发部department!=销售部•OR(或)WHERE city=北京OR•(大于)WHERE age30city=上海•(小于)WHERE price100•NOT(非)WHERE NOTstatus=已删除•=(大于等于)WHERE score=60复杂条件可用括号分组WHERE dept=•=(小于等于)WHERE quantity=研发部OR dept=产品部AND salary108000特殊条件•BETWEEN WHERE salary BETWEEN5000AND10000•IN WHEREdept IN研发部,产品部,市场部•LIKE WHEREname LIKE张%(%表示任意字符)•IS NULL WHERE phoneIS NULL•IS NOT NULLWHEREemail ISNOT NULL排序与分页ORDER BY排序LIMIT分页分页性能优化ORDER BY子句用于对结果集进行排序,可以按一个或多个列排序,LIMIT子句用于限制结果集的行数,常用于实现分页功能语法为当数据量很大时,简单的LIMIT offset,count可能性能较差,特别是并指定升序(ASC,默认)或降序(DESC)LIMIT[offset,]row_count,其中offset是起始位置(从0开始),offset值很大时优化方法包括row_count是返回的行数•使用书签分页WHERE idlast_id LIMITcount--单列排序•避免使用COUNT*计算总行数SELECT name,salary FROM employees--返回前10条记录•结合索引优化ORDER BYsalary DESC;SELECT id,name FROMproductsORDER BYid LIMIT10;•避免SELECT*,只查询需要的列--多列排序SELECT name,department,salary--返回第11-20条记录FROM employeesSELECT id,name FROMproductsORDER BY department ASC,salary DESC;ORDER BYid LIMIT10,10;排序会消耗额外的计算资源,特别是大数据量时如果字段有索引,计算分页参数LIMIT页码-1*每页行数,每页行数排序性能会更好聚合函数应用分组查询--基本分组查询SELECT department,COUNT*as employee_countFROM employeesGROUP BYdepartment;--带HAVING条件的分组查询SELECT department,AVGsalary asavg_salaryFROM employeesGROUP BY departmentHAVINGAVGsalary8000;--多字段分组SELECT department,gender,COUNT*as countFROM employeesGROUP BYdepartment,genderORDER BYdepartment,count DESC;GROUP BY子句用于将查询结果按一个或多个列分组,通常与聚合函数一起使用分组后,SELECT中只能包含分组字段和聚合函数,否则结果将不确定GROUPBY后可跟多个字段,形成层次分组,如先按部门分组,再按性别分组HAVING子句用于过滤分组后的结果,类似于WHERE,但作用于分组后而非分组前的数据HAVING中可以使用聚合函数,而WHERE中不能查询执行顺序是先执行WHERE过滤行,再按GROUPBY分组,然后用HAVING过滤分组,最后执行SELECT和ORDER BY多表连接与联结内连接(INNER JOIN)左连接(LEFT JOIN)返回两表中匹配行返回左表所有行及右表匹配行SELECT e.name,d.dept_name SELECTc.name,o.order_idFROM employees e FROMcustomers cINNERJOIN departmentsd LEFTJOIN ordersoON e.dept_id=d.id;ONc.id=o.customer_id;全连接(MySQL不直接支持)可通过UNION模拟实现右连接(RIGHT JOIN)SELECT e.*,d.*返回右表所有行及左表匹配行FROM employees eLEFT JOIN departments dON e.dept_id=d.id SELECT e.name,d.dept_nameUNION FROM employees eSELECTe.*,d.*RIGHT JOINdepartments dFROMemployeeseONe.dept_id=d.id;RIGHT JOINdepartments dON e.dept_id=d.idWHERE e.id ISNULL;子查询与嵌套查询子查询基本概念常见用法示例子查询是嵌套在另一个查询内部的SELECT语句子查询可以出现在SELECT、FROM、WHERE和HAVING子句中,用--标量子查询,返回单个值于提供主查询所需的数据或条件子查询必须放在括号内,且通常在主查询执行前先执行SELECT name,salary子查询可分为标量子查询(返回单个值)、列子查询(返回单列多行)、表子查询(返回多列多行)和相关子查询(引FROMemployees用外部查询中的表)WHEREsalarySELECT AVGsalaryFROMemployees;--IN子查询,返回单列多值SELECT nameFROMemployeesWHERE department_idINSELECT idFROMdepartmentsWHERE location=北京;--EXISTS子查询SELECT nameFROMdepartments dWHEREEXISTS SELECT1FROMemployeeseWHERE e.department_id=d.id;子查询虽然功能强大,但可能影响性能,特别是相关子查询(因为需要反复执行)在某些情况下,JOIN可能比子查询更高效复杂查询时,可以考虑先创建临时表或视图,简化查询逻辑视图基础视图的创建视图是基于SQL查询的虚拟表,不存储实际数据,而是在查询视图时执行定义的SQL语句创建视图的基本语法是CREATE VIEW view_name ASSELECT column1,column2,...FROM table_nameWHERE condition;例如CREATE VIEWemployee_details ASSELECTe.id,e.name,d.dept_name FROMemployeeseJOINdepartmentsdONe.dept_id=d.id;视图的使用创建后,视图可以像普通表一样使用SELECT*FROMemployee_details WHERE id100;视图也可以用于INSERT、UPDATE和DELETE操作,但有一定限制(取决于视图定义和底层表结构)视图的管理查看现有视图SHOW FULLTABLES WHEREtable_type=VIEW;查看视图定义SHOW CREATEVIEWview_name;修改视图ALTER VIEWview_name ASnew_query;删除视图DROP VIEW[IF EXISTS]view_name;存储过程MySQL存储过程优点存储过程缺点•提高执行效率预编译存储,减少网络传输•可移植性较差各数据库系统语法差异大•增强安全性可用于权限控制,隐藏表结构•调试困难错误难以定位和修复•代码复用减少重复编写SQL的工作量•开发效率频繁修改时开发效率较低•简化维护业务逻辑集中管理,易于维护•版本控制不如应用代码便于管理版本基本语法结构DELIMITER//CREATE PROCEDUREprocedure_nameIN param1INT,OUT param2VARCHAR50BEGIN--声明变量DECLARE var1INT;--SQL语句SELECT col1INTO var1FROMtable1WHERE id=param1;--流程控制IF var10THENSET param2=Positive;ELSESET param2=Non-positive;END IF;END//DELIMITER;触发器MySQL触发器语法DELIMITER//触发器定义CREATE TRIGGERtrigger_name{BEFORE|AFTER}{INSERT|UPDATE|DELETE}触发器是在表上执行INSERT、UPDATE或DELETE操作时自ONtable_name FOREACH ROW动触发执行的一段代码触发器可以在操作前BEFORE或操BEGIN作后AFTER触发,用于实现复杂的数据完整性规则、审计日--触发器代码志或自动更新相关表END//DELIMITER;应用示例--在员工表插入新记录后,更新部门表的员工数量CREATE TRIGGERafter_employee_insert使用注意事项AFTER INSERTON employeesFOREACH ROW触发器可能影响性能,特别是在大量数据操作时;可能导致级BEGIN联更新,引起复杂的数据变更;难以调试和维护;建议适度使UPDATE departments用,避免过度依赖SET emp_count=emp_count+1WHEREid=NEW.dept_id;END;函数和变量MySQL常用内置函数用户自定义函数变量类型与作用域•字符串函数CONCAT,SUBSTRING,LENGTH,MySQL中的变量分为几种类型DELIMITER//UPPER,LOWERCREATE FUNCTIONcalc_tax•用户变量以@开头,如@count,会话级别有效•数值函数ROUND,CEILING,FLOOR,ABS,salary DECIMAL10,2•局部变量存储过程/函数中使用DECLARE声明,仅在MOD定义它的BEGIN...END块内有效•日期时间函数NOW,DATE,DATEDIFF,RETURNS DECIMAL10,2•系统变量以@@开头,如@@hostname,分为全局和DATE_ADD,DATE_FORMAT DETERMINISTIC会话级别•条件函数IF,IFNULL,CASE BEGINDECLAREtax DECIMAL10,2;设置变量SET@var_name=value;或SELECTcolINTO例如SELECT CONCATfirst_name,,last_name ASIFsalary5000THEN@var FROMtable;full_name FROMemployees;SET tax=salary*
0.03;ELSESET tax=salary*
0.05;END IF;RETURN tax;END//DELIMITER;--使用方法SELECT name,salary,calc_taxsalary astaxFROM employees;事务与特性ACID原子性(Atomicity)事务是不可分割的工作单元,要么全部执行,要么全不执行一致性(Consistency)事务执行前后,数据库必须保持一致状态隔离性(Isolation)多个事务并发执行时,相互独立不受影响持久性(Durability)事务一旦提交,其结果永久保存,即使系统故障也不会丢失MySQL的InnoDB存储引擎支持事务处理,而MyISAM不支持事务控制主要使用以下命令•BEGIN或START TRANSACTION开始一个新事务•COMMIT提交当前事务,使所有修改永久生效•ROLLBACK回滚当前事务,取消所有修改•SAVEPOINT identifier在事务中创建保存点•ROLLBACK TOidentifier回滚到指定保存点事务的使用场景包括涉及多表操作的数据一致性(如银行转账)、需要回滚能力的复杂业务逻辑、并发环境下的数据完整性保障等隔离级别与并发控制隔离级别脏读不可重复读幻读性能影响READ可能发生可能发生可能发生影响最小UNCOMMITTEDREAD不会发生可能发生可能发生影响较小COMMITTEDREPEATABLE不会发生不会发生可能发生影响中等READSERIALIZABL不会发生不会发生不会发生影响最大EMySQL提供四种事务隔离级别,用于解决并发事务可能导致的问题每种级别对并发问题的解决程度不同,同时也会影响性能InnoDB默认使用REPEATABLE READ隔离级别并发事务可能引发的问题包括脏读(读取到未提交的数据)、不可重复读(同一事务内多次读取同一数据得到不同结果)、幻读(同一事务内,相同查询条件下结果集行数发生变化)设置隔离级别的命令SET SESSIONTRANSACTION ISOLATIONLEVEL[隔离级别]在选择隔离级别时,应权衡数据一致性需求与性能影响锁机制详解表锁(Table Lock)行锁(Row Lock)意向锁(Intention Lock)锁定整个表,适用于对整表数据进锁定表中的某一行或多行,允许不表级锁,用于指示事务稍后要对表行修改的操作表锁容易导致并发同事务操作表中的不同行,并发性中的行设置锁的类型(共享/排性能下降,但实现简单,MyISAM能好InnoDB支持行锁,是其并他)意向锁提升了表锁和行锁共主要使用表锁发控制的核心机制存时的效率显式加表锁LOCK TABLES行锁是通过索引实现的,查询条件InnoDB自动管理意向锁,无需手table_name[READ|WRITE];解不走索引会导致行锁升级为表锁动设置锁UNLOCK TABLES;死锁检测与解决死锁是多个事务互相等待对方释放锁的情况InnoDB有自动死锁检测机制,发现死锁后会回滚影响最小的事务避免死锁按固定顺序访问表/行、减少事务大小和持续时间、使用合适的隔离级别、适当设置锁等待超时日志与数据恢复(二进制日志)(重做日志)(回滚日志)Binlog RedoLog UndoLog记录所有修改数据的SQL语句(语句或记录数据页的物理变更,采用循环写入记录事务执行前的数据状态,用于行格式),主要用于方式,用于•事务回滚ROLLBACK操作•数据恢复在备份后执行的更改•确保事务持久性•MVCC实现一致性读取•主从复制将主服务器的变更同步到•崩溃恢复重启时恢复未写入磁盘的InnoDB特有,存储在系统表空间或独立从服务器事务的undo表空间中•审计记录数据变更历史InnoDB特有,将随机写转换为顺序写,配置innodb_undo_directory、提高性能配置log-bin=mysql-bin(启用)innodb_undo_tablespaces配置innodb_log_file_size、查看SHOW BINARYLOGS;SHOWinnodb_log_files_in_groupBINLOG EVENTS;数据备份与还原方法逻辑备份(mysqldump)物理备份(XtraBackup)生成包含CREATE和INSERT语句的直接复制数据文件,支持在线热备份SQL文件优点可读性好,可选择和增量备份优点备份速度快,对性备份部分数据,支持跨版本;缺服务影响小,可实现点对点恢复;缺点备份和恢复速度较慢,适合中小点通常需要相同版本的MySQL,备型数据库份文件较大备份命令mysqldump-u用户名-p PerconaXtraBackup是主流的物理备密码数据库名备份文件.sql份工具,提供全量和增量备份功能还原命令mysql-u用户名-p密码数据库名备份文件.sql备份策略与自动化完善的备份策略应包括定期全量备份(如每周一次)+日常增量备份;备份文件异地存储;定期测试恢复过程使用cron等工具自动执行备份脚本,配合监控系统确保备份成功;设置备份文件保留策略,避免磁盘空间耗尽安全管理与审计用户权限强化遵循最小权限原则网络安全策略限制远程访问与加密连接审计日志监控与记录数据库活动合规要求满足行业标准与法规提高MySQL安全性的关键措施包括定期更新密码并使用强密码策略;为每个应用分配专用数据库账户,避免使用root账户;精确分配权限(如只读、只写或特定表权限);启用SSL加密传输;设置防火墙规则限制数据库端口访问;禁用不必要的功能和插件MySQL企业版提供内置审计功能,社区版可使用MariaDB审计插件或第三方工具审计记录应包括登录尝试、权限变更、敏感数据访问、架构更改等在金融、医疗等行业,数据库审计是满足GDPR、PCI DSS、HIPAA等合规要求的重要组成部分审计日志应定期审查,并与安全信息事件管理SIEM系统集成数据库优化基础硬件层面优化系统层面优化分库分表策略选择合适的硬件配置对MySQL性能至关操作系统和文件系统配置也影响MySQL当单个数据库无法满足性能需求时,考重要性能虑分库分表•CPU多核处理器,支持高并发查询•I/O调度器使用deadline或noop调•垂直分表按功能将表拆分到不同库处理度器•内存充足的RAM,至少能容纳活跃•文件系统XFS或ext4,关闭atime•水平分表按规则(如ID范围、哈希数据集值)将同一表数据分散到多张表•SWAP设置低设置或禁用•存储使用SSD,提供高IOPS和低延•打开文件限制增加上限分库分表需要考虑分片策略、跨分片查迟询、分布式事务等问题,通常需要中间避免系统资源过度使用,MySQL应是主•网络高带宽、低延迟网络连接件(如MyCat、ShardingSphere)支要应用程序持内存通常是最关键的资源,应确保InnoDB缓冲池能容纳大部分热数据查询优化进阶慢查询日志分析执行计划EXPLAIN优化技巧慢查询日志记录执行时间超过阈值的SQL语句,是性能优化的重要数EXPLAIN命令揭示MySQL优化器如何执行查询,帮助定位性能瓶根据EXPLAIN结果优化查询的常见方法据源启用方法颈•添加适当索引,尤其是WHERE、JOIN、ORDER BY和GROUPBY子句中的列#my.cnf中配置EXPLAIN SELECT*FROM orderso•重写查询,避免全表扫描和filesortslow_query_log=ON JOINcustomers cON o.customer_id=c.id•使用LIMIT限制结果集大小slow_query_log_file=/var/log/mysql/slow.log WHEREo.status=pending;long_query_time=1#秒•简化复杂查询,拆分为多个简单查询log_queries_not_using_indexes=ON•优化表结构,如使用适合的数据类型关键列解读•type访问类型,从好到差systemconsteq_refref分析工具使用mysqldumpslow或pt-query-digest(PerconarangeindexALLToolkit)对慢查询日志进行统计分析,识别最耗时的SQL模式•key实际使用的索引•rows预估需要检查的行数•Extra附加信息,如Using index(覆盖索引)、Usingfilesort(需要排序)索引优化实战创建索引的原则索引虽能提升查询速度,但也会增加写入开销和存储空间应遵循以下原则创建索引在WHERE和JOIN条件的列上建立索引;选择区分度高(唯一值比例大)的列;索引字段尽量小;复合索引遵循最左前缀原则;避免过多索引(一般每表不超过5个)覆盖索引优化覆盖索引是指索引包含查询所需的所有字段,可以直接从索引获取数据而无需访问表数据这种方式大幅减少I/O操作,明显提升查询性能EXPLAIN结果的Extra列显示Using index表示使用了覆盖索引复合索引优化复合索引(多列索引)遵循最左前缀原则查询条件必须包含索引最左边的列才能使用该索引例如,索引a,b,c可用于查询a、a,b或a,b,c,但不适用于只有b或c的查询合理设计复合索引顺序可减少索引数量常见索引陷阱使用函数或表达式(如WHERE YEARdate_column=2023)会导致索引失效;隐式类型转换(如字符串和数字比较)可能使索引无效;过于宽泛的LIKE查询(如LIKE%keyword%)无法有效利用索引;OR条件两侧如有一个无索引,整个查询可能转为全表扫描数据库参数与性能调优分布式与主从复制主从复制原理复制配置步骤MySQL主从复制是指将主服务器主库配置开启binlog,设置server-id,(Master)上的数据变更同步到一个或多创建复制用户;从库配置设置unique个从服务器(Slave)的过程基本原理server-id,配置master信息,启动slave进是主库将所有数据变更写入二进制日志程可通过SHOW SLAVESTATUS命令监(binlog);从库的I/O线程读取主库2控复制状态,主要关注Slave_IO_Runningbinlog并写入自己的中继日志(relay和Slave_SQL_Running状态log);从库的SQL线程读取relay log并重放执行复制延迟与挑战读写分离概述主从复制面临的主要挑战包括复制延迟读写分离是将数据库读操作和写操作分散(从库落后于主库)、数据一致性问题到不同的节点上主库负责处理所有写入(延迟导致的暂时不一致)、故障切换请求和必须保证强一致性的读请求;从库(主库宕机时的处理)解决方案包括使处理一般的读请求,如报表查询这种架用半同步复制、监控复制延迟、实施自动构可提高系统整体吞吐量和可用性故障转移等分区表与Sharding分区类型分区表与Sharding分区表优势MySQL支持多种分区类型分区表是单个表在服务器内部的分区;而Sharding是将分区表在以下场景特别有用数据分散到多个物理服务器两者主要区别•RANGE分区按连续区间分区,如按ID范围或日期•大表性能优化只访问包含目标数据的分区范围•管理范围分区表由单个MySQL实例管理,•历史数据管理按时间分区便于归档旧数据Sharding跨多个实例•LIST分区按离散值列表分区,如按地区代码或状•批量操作可按分区批量删除或加载数据态码•透明度分区对应用透明,Sharding通常需要应用•均衡I/O分区可分布在不同存储设备上或中间件支持•HASH分区按哈希函数值分区,可实现均匀分布创建分区表示例CREATE TABLEsales...•KEY分区类似HASH,但使用MySQL内部哈希函•扩展性Sharding提供更好的水平扩展能力PARTITION BYRANGEYEARsale_date...数•复杂性Sharding架构复杂度高,实现和维护成本大还支持复合分区(如RANGE COLUMNS)和子分区与比较InnoDB MyISAM特性InnoDB MyISAM事务支持支持不支持锁级别行锁表锁外键支持不支持全文索引
5.6+支持支持崩溃恢复自动恢复可能数据丢失存储限制64TB256TB缓存数据和索引仅索引适用场景OLTP,要求事务安全OLAP,读密集型自MySQL
5.
5.5起,InnoDB成为默认存储引擎,替代了早期的MyISAM这两种引擎在设计理念和适用场景上有显著差异InnoDB注重数据安全和一致性,支持事务、行级锁定和外键约束,适合在线交易处理OLTP系统;MyISAM则更注重性能,尤其是读取性能,适合读多写少的场景,如数据仓库和报表系统选择存储引擎时,应考虑业务特点如需要事务支持、并发性能和崩溃恢复能力,选择InnoDB;如追求单纯的读取速度和较小的存储空间开销,可考虑MyISAM在现代应用中,多数情况下推荐使用InnoDB,因为其安全性和功能性更强高可用与集群解决方案MySQLMHA(Master HighAvailability)Percona XtraDBCluster PXCMHA是一套开源的MySQL高可用方案,主要用于主库故障时自动将从PXC是基于Galera的多主复制集群解决方案,所有节点都可读写,数据库提升为新主库,实现快速故障转移优点是转移时间短(通常10-30通过认证同步复制保持一致优点是强一致性、高可用性、无主从延秒内)、配置相对简单、对应用几乎透明;缺点是不提供负载均衡功迟;缺点是写入性能受限于全局复制、不适合大事务和大批量操作适能,需单独实现适合传统的主从复制架构合需要强一致性保证的场景负载均衡技术Group ReplicationMySQL官方提供的高可用解决方案,基于分布式一致性协议可在单实现读写分离和负载均衡的常用技术包括ProxySQL(专为MySQL设主模式(推荐)或多主模式下运行优点是与MySQL深度集成、配置计的代理,支持复杂路由规则和查询缓存)、MySQL Router(官方提相对简单、支持自动成员管理;缺点是社区经验相对较少、某些场景下供的轻量级路由器)、HAProxy(通用负载均衡器)等合理配置这可能有性能瓶颈适合需要官方支持的企业环境些工具可充分利用集群资源并提高可用性常见问题与故障排查连接异常无法连接数据库是最常见的问题之一排查步骤检查网络连通性(ping/telnet);确认MySQL服务是否运行;检查用户名密码是否正确;确认用户有对应主机的连接权限;检查max_connections限制;查看错误日志是否有相关信息权限问题权限错误通常表现为Access denied错误解决方法确认使用了正确的用户名和密码;检查用户对特定数据库/表的权限(SHOW GRANTS命令);确认用户的连接主机限制;如必要,使用GRANT语句授予适当权限;刷新权限缓存(FLUSH PRIVILEGES)性能问题数据库性能下降的表现包括查询变慢、响应延迟增加等排查思路检查系统资源使用情况(CPU、内存、磁盘I/O);分析慢查询日志找出问题SQL;使用EXPLAIN分析执行计划;检查表索引状态;查看服务器状态变量(SHOW STATUS);考虑是否有锁竞争或事务堵塞错误日志分析技巧MySQL错误日志是排查问题的重要来源日志位置可通过SHOW VARIABLESLIKE log_error查看分析技巧关注启动和关闭消息;查找ERROR关键词;注意常见错误模式如table isfull、cant createthread等;使用grep/awk等工具过滤日志;考虑结合系统日志一起分析获取完整情况项目开发实践案例分析--客户表CREATE TABLEcustomers customer_id INTPRIMARY KEYAUTO_INCREMENT,name VARCHAR100NOT NULL,email VARCHAR100UNIQUE NOT NULL,phone VARCHAR20,address TEXT,registration_date DATETIMEDEFAULT CURRENT_TIMESTAMP,INDEX idx_email email;--产品表CREATE TABLEproducts product_id INTPRIMARY KEYAUTO_INCREMENT,name VARCHAR200NOT NULL,description TEXT,price DECIMAL10,2NOT NULL,stock_quantity INTNOT NULLDEFAULT0,category VARCHAR50,INDEX idx_category category;--订单表CREATE TABLEorders order_id INTPRIMARYKEYAUTO_INCREMENT,customer_id INTNOT NULL,order_date DATETIMEDEFAULT CURRENT_TIMESTAMP,status ENUMpending,processing,shipped,delivered,cancelled DEFAULTpending,total_amount DECIMAL12,2NOT NULL,shipping_address TEXT,FOREIGN KEYcustomer_id REFERENCEScustomerscustomer_id,INDEX idx_customer customer_id,INDEX idx_date order_date;--订单明细表CREATE TABLEorder_items item_id INTPRIMARYKEYAUTO_INCREMENT,order_id INTNOT NULL,product_id INTNOT NULL,quantity INTNOTNULL,unit_price DECIMAL10,2NOTNULL,FOREIGN KEYorder_id REFERENCESordersorder_id,FOREIGN KEYproduct_id REFERENCESproductsproduct_id,INDEX idx_order order_id;资料推荐与学习路线官方文档经典书籍在线学习资源社区与实践MySQL官方文档是最全面、最推荐阅读《高性能MySQL》优质学习平台MySQL官方培活跃社区Stack Overflow的权威的学习资源建议从参考(OReilly出版)是MySQL性训课程;慕课网、极客时间等MySQL标签区;GitHub上的手册入手,尤其关注能优化的权威指南;《MySQL平台的MySQL专题课程;MySQL相关开源项目;Tutorial、SQL Syntax和技术内幕InnoDB存储引擎》Udemy、Coursera上的数据MySQL官方论坛;Percona博Optimization章节官方文深入剖析InnoDB架构;《SQL库课程;YouTube上有许多免客和论坛参与开源项目或尝档会随着版本更新而更新,始必知必会》适合SQL基础学费的教程视频,如MySQL试解决社区问题是提升实战能终提供最新特性和最佳实践的习;《数据库系统概念》提供DBA和MySQLTutorial频力的有效方式建议搭建个人详细说明扎实的理论基础道测试环境,跟随教程实践各种操作课程总结与答疑高级应用性能调优、高可用架构、分布式数据库进阶技能事务管理、索引优化、存储过程、触发器基本操作增删改查、多表连接、聚合函数基础知识安装配置、数据类型、表结构、管理工具本课程系统介绍了MySQL数据库的各个方面,从基础概念到高级应用我们学习了MySQL的安装配置、表结构设计、基本SQL操作、索引与查询优化、事务管理、安全与备份等核心内容通过这些知识,您应该能够设计、实现和维护大多数业务场景下的MySQL数据库系统在实际工作中,不同的应用场景可能需要特定的优化策略,建议结合具体业务需求进行深入学习数据库技术在不断发展,鼓励大家关注MySQL的新版本特性,以及NoSQL、NewSQL等新兴数据库技术的发展趋势,拓展知识面,提升综合能力。
个人认证
优秀文档
获得点赞 0