@[toc]
MySQL是什么?
随着时间的推移,开源数据库在中低端应用中逐渐流行起来,占据了很大的市场份额。开源数据库具有免费使用、配置简单、稳定性好、性能优良等特点,而 MySQL 数据库正是开源数据库中的杰出代表。
- 开源全称为“开放源代码”。很多人认为开源软件最明显的特点是免费,但实际上并不是这样的,开源软件最大的特点应该是开放,也就是任何人都可以得到软件的源代码。可以在源代码的基础上加以修改学习,甚至重新发放,当然是在版权限制范围之内。
MySQL 是最流行的数据库之一,是一个免费开源的关系型数据库管理系统,但也不意味着该数据库是完全免费的。MySQL 由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 适合中小型软件,被个人用户以及中小企业青睐。
MySQL的版本以及版本号
针对不同的用户,MySQL 分为两个版本:
- MySQL Community Server(社区版):该版本完全免费,但是官方不提供技术支持。
- MySQL Enterprise Server(企业版):该版本能够以很高的性价比为企业提供数据仓库应用,支持 ACID 事物处理,提供完整的提交、回滚、崩溃恢复和行级锁定功能,但是该版本需要付费使用,官方提供电话技术支持。
注意:MySQL Cluster 主要用于架设群服务器,需要在社区服务或企业版的基础上使用。
MySQL的版本命名机制
MySQL 的命名机制由 3 个数字和 1 个后缀组成,例如 mysql-5.7.20:
- 第 1 个数字“5”是主版本号,用于描述文件的格式,所有版本 5 的发行版都有相同的文件夹格式。
- 第 2 个数字“7”是发行级别,主版本号和发行级别组合在一起便构成了发行序列号。
- 第 3 个数字“20”是在此发行系列的版本号,随每次新发行的版本递增。通常选择已经发行的最新版本。
在 MySQL 开发过程中,同时存在多个发布系列,每个发布系列的成熟度处在不同阶段。
- MySQL 5.7 是最新开发的稳定(GA)发布系列,是将执行新功能的系列,目前已经可以正常使用。
- MySQL 5.6 是比较稳定的(GA)发布系列,只针对漏洞修复重新发布,不增加会影响稳定性的新功能。
- MySQL 5.1 是一个稳定的(产品质量)发布系列,只针对严重漏洞修复和安全修复重新发布,不增加影响该系列稳定性的重要功能。
mysql 的优势
由于 MySQL 数据库体积小、速度快、总体拥有成本低、开放源代码,其有着广泛的应用,一般中小型网站的开发都选择 MySQL 作为网站数据库。由于其社区版的性能卓越,因此搭配 PHP 和 Apache 服务器可组成良好的开发环境。
主要的优势有以下几点
- MySQL 是开放源代码的数据库,任何人都可以获取该数据库的源代码。这就使得任何人都可以修正 MySQL 的缺陷,并且任何人都能以任何目的来使用该数据库。MySQL 是一款可以自由使用的数据库。
- MySQL 的跨平台性:MySQL 不仅可以在 Windows 系列的操作系统上运行,还可以在 UNIX、Linux 和 Mac OS 等操作系统上运行。因为很多网站都选择 UNIX、Linux 作为网站的服务器,所以 MySQL 的跨平台性保证了其在 Web 应用方面的优势。。
- 价格优势:MySQL 数据库是一个自由软件,任何人都可以从 MySQL 的官方网站上下载该软件,这些社区版本的 MySQL 都是免费试用的,即使是需要付费的附加功能,其价格也是很便宜的。相对于 Oracle、DB2 和 SQL Server 这些价格昂贵的商业软件,MySQL 具有绝对的价格优势。
- 功能强大且使用方便:MySQL 是一个真正的多用户、 多线程 SQL 数据库服务器。它能够快速、有效和安全的处理大量的数据。相对于 Oracle 等数据库来说,MySQL 的使用是非常简单的。MySQL 主要目标是快速、健壮和易用。
MySQL 与常用的主流数据库 Oracle、SQL Server 相比,主要特点就是免费,并且在任何平台上都能使用,占用的空间相对较小。但是,MySQL 也有一些不足,比如对于大型项目来说,MySQL 的容量和安全性就略逊于 Oracle 数据库
mysql 的特性
MySQL 数据库管理系统具有以下系统特性:
- 使用 C 和 C++ 编写,并使用多种编译器进行测试,保证源代码的可移植性。
- 支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows 等多种操作系统。
- 为多种编程语言提供了 API。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
- 支持多线程,充分利用 CPU 资源。
- 优化的 SQL 查询算法,有效地提高查询速度。
- 既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入其他的软件中。
- 提供多语言支持,常见的编码如中文的 GB 2312、BIG 5,日文的 Shift_JIS 等都可以用作数据表名和数据列名。
- 提供 TCP/IP、ODBC 和 JDBC 等多种数据库连接途径。
- 提供用于管理、检查、优化数据库操作的管理工具。
- 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
- 支持多种存储引擎。
mysql 的适用场景
MySQL 是目前世界上最流行的开源关系数据库,大多应用于互联网行业。比如,在国内,大家所熟知的百度、腾讯、淘宝、京东、网易、新浪等,国外的 Google、Facebook、Twitter、GitHub 等都在使用 MySQL。社交、电商、游戏的核心存储往往也是 MySQL。
- Web 网站系统:Web 网站开发者是 MySQL 最大的客户群,也是 MySQL 发展史上最为重要的支撑力量。
- MySQL 之所以能成为 Web 网站开发者们最青睐的数据库管理系统,是因为 MySQL 数据库的安装配置都非常简单,使用过程中的维护也不像很多大型商业数据库管理系统那么复杂,而且性能出色。还有一个非常重要的原因就是 MySQL 是开放源代码的,完全可以免费使用。
- 日志记录系统:MySQL 数据库的插入和查询性能都非常的高效,设计的好,在使用 MyISAM 存储引擎的时候,两者可以做到互不锁定,达到很高的并发性能。所以,对需要大量的插入和查询日志记录的系统来说,MySQL 是非常不错的选择。比如处理用户的登录日志,操作日志等,都是非常适合的应用场景。
- 数据仓库系统:随着现在数据仓库数据量的飞速增长,我们需要的存储空间越来越大。数据量的不断增长,使数据的统计分析变得越来越低效,越来越困难。
- 下面是几个主要的解决思路。
- 采用昂贵的高性能主机以提高计算性能,用高端存储设备提高 I/O 性能,效果理想,但是成本非常高;
- 通过将数据复制到多台使用大容量硬盘的廉价 PC Server 上,以提高整体计算性能和 I/O 能力,效果尚可,存储空间有一定限制,成本低廉;
- 通过将数据水平拆分,使用多台廉价的 PC Server 和本地磁盘来存放数据,每台机器上面都只有所有数据的一部分,解决了数据量的问题,所有 PC Server 一起并行计算,也解决了计算能力问题,通过中间代理程序调配各台机器的运算任务,既可以解决计算性能问题又可以解决 I/O 性能问题,成本也很低廉。
- 在上面的三个方案中,第二和第三个的实现,MySQL 都有较大的优势。通过 MySQL 的简单复制功能,可以很好的将数据从一台主机复制到另外一台 ,不仅仅在局域网内可以复制,在广域网同样可以。
- 当然,很多人可能会说,其他的数据库同样也可以做到,不是只有 MySQL 有这样的功能。确实,很多数据库同样能做到,但是 MySQL 是免费的,其他数据库大多都是按照主机数量或者 cpu 数量来收费,当我们使用大量的 PC Server 的时候,License 费用相当惊人。所以第一个方案,基本上所有数据库系统都能够实现,但是其高昂的成本不是每一个公司都能够承担的。
- 下面是几个主要的解决思路。
- 嵌入式系统:嵌入式环境对软件系统最大的限制是硬件资源非常有限,在嵌入式环境下运行的软件系统,必须是轻量级低消耗的软件。
- MySQL 在资源的使用方面的伸缩性非常大,可以在资源非常充裕的环境下运行,也可以在资源非常少的环境下正常运行。它对于嵌入式环境来说,是一种非常合适的数据库系统,而且 MySQL 有专门针对于嵌入式环境的版本。
- 并且,MySQL 的定位是通用数据库,各种类型的应用一般都能利用到 MySQL 存取数据的优势。业内生产实践证明,MySQL 更适合中小型企业。以目前的软硬件产品水平来看,如果数据超过几个 TB 将难以高效利用 MySQL。
- MySQL 可以作为传统的关系型数据库产品使用,也可以当作一个 key-value 产品来使用。由于它具有优秀的灾难恢复功能,因此相对于目前市场上的一些 key-value 产品会更有优势。
MySQL客户端和服务器架构(C/S架构)
客户端-服务器(Client/Server)结构简称 C/S 结构,是一种网络架构,通常在该网络架构下的软件分为客户端和服务器。
服务器是整个应用系统资源的存储和管理中心,多个客户端分别各自处理相应的功能,共同实现完整的应用。在客户/服务器结构中,客户端用户的请求被传送到数据库服务器,数据库服务器进行处理后,将结果返回给用户,从而减少网络数据的传输量。
用户在使用应用程序时,首先启动客户端,然后通过相关命令告知服务器进行连接以完成各种操作,而服务器则按照此请示提供相应的服务。每一个客户端软件的实例都可以向一个服务器或应用程序服务器发出请求。
客户端和服务器程序通常不在同一台计算机上运行,比如,我们平时在当当网上买书的时候,所使用的电脑和网页浏览器就被当做了一个客户端,同时,组成当当网的电脑、数据库和应用程序就被当做服务器。
数据库管理系统可分为两类:一类是基于共享文件系统的数据库管理系统,例如 Microsoft Access 和 FileMaker,主要用于桌面用途,不适合用于高端或更关键的应用;另一类是基于客户端-服务器的数据库管理系统,例如 MySQL、Oracle 和 SQL Server 等数据库。
服务器软件负责访问和处理所有数据的一个软件,这个软件运行在称为数据库服务器的计算机上,并且与数据文件打交道的只有服务器软件。
关于数据的添加、删除和更新等所有的请求都由服务器完成。这些请求来自于运行客户端的计算机。客户端用来和用户打交道。例如,如果你请求一个按字母顺序列出的产品表,则客户端会通过网络提交该请求给服务器,服务器处理这个请求,然后根据需要对数据进行过滤、丢弃和排序,最后把结果返回到客户端。
注意:客户端和服务器可以安装在两台计算机或一台计算机上,不管它们在不在相同的计算机上,客户端都要与服务器进行通信。
以上这些过程对用户都是透明的,你不需要直接访问数据文件。为了使用MySQL,需要访问运行 MySQL 服务器的计算机和发布命令到 MySQL 客户端的计算机。
对于 MySQL 数据库管理系统,服务器为MySQL DBMS。你可以在本地安装的副本上运行,也可以连接到运行在你具有访问权的远程服务器上的一个副本。
客户端可以是 MySQL 提供的工具(如 MySQL Workbench、SQLyog)、脚本语言(如Perl)、Web 应用开发语言和程序设计语言等。
MySQL体系结构详解
麻雀虽小,五脏俱全。MySQL 虽然以简单著称,但其内部结构并不简单。
mysql的体系结构
MySQL 就好比盖房子,如果想把房子盖的特别高,地基一定要稳,基础一定要牢固。
MySQL 由连接池、SQL 接口、解析器、优化器、缓存、存储引擎等组成,可以分为三层,即 MySQL Server 层、存储引擎层和文件系统层。MySQL Server 层又包括连接层和 SQL 层。如下是官方文档中 MySQL 的基础架构图:
上图中,Connection pool 为连接层,Management Services & Utilities ...Caches & Buffers 为 SQL 层,Pluggable Storage Engines 为存储引擎层,File system、Files & Logs 为文件系统层。
Connectors 不属于以上任何一层,可以将 Connectors 理解为各种客户端、应用服务,主要指的是不同语言与 SQL 的交互。
连接层
应用程序通过接口(如 ODBC、JDBC)来连接 MySQL,最先连接处理的是连接层。连接层包括通信协议、线程处理、用户名密码认证 3 部分。
- 通信协议负责检测客户端版本是否兼容 MySQL 服务端。
- 线程处理是指每一个连接请求都会分配一个对应的线程,相当于一条 SQL 对应一个线程,一个线程对应一个逻辑 CPU,在多个逻辑 CPU 之间进行切换。
- 密码认证用来验证用户创建的账号、密码,以及 host 主机授权是否可以连接到 MySQL 服务器。
Connection Pool(连接池)属于连接层。由于每次建立连接都需要消耗很多时间,连接池的作用就是将用户连接、用户名、密码、权限校验、线程处理等需要缓存的需求缓存下来,下次可以直接用已经建立好的连接,提升服务器性能。
SQL层
SQL 层是 MySQL 的核心,MySQL 的核心服务都是在这层实现的。主要包含权限判断、查询缓存、解析器、预处理、查询优化器、缓存和执行计划。
- 权限判断可以审核用户有没有访问某个库、某个表,或者表里某行数据的权限。
- 查询缓存通过 Query Cache 进行操作,如果数据在 Query Cache 中,则直接返回结果给客户端,不必再进行查询解析、优化和执行等过程。
- 查询解析器针对 SQL 语句进行解析,判断语法是否正确。
- 预处理器对解析器无法解析的语义进行处理。
- 查询优化器对 SQL 进行改写和相应的优化,并生成最优的执行计划,就可以调用程序的 API 接口,通过存储引擎层访问数据。
Management Services & Utilities、SQL Interface、Parser、Optimizer 和 Caches & Buffers 属于 SQL 层,详细说明如下表所示。
- Management Services & Utilities: MySQL 的系统管理和控制工具,包括备份恢复、MySQL 复制、集群等。
- SQL Interface(SQL 接口):用来接收用户的 SQL 命令,返回用户需要查询的结果。例如 SELECT FROM 就是调用 SQL Interface。
- Parser(查询解析器):在 SQL 命令传递到解析器的时候会被解析器验证和解析,以便 MySQL 优化器可以识别的数据结构或返回 SQL 语句的错误。
- Optimizer(查询优化器):SQL 语句在查询之前会使用查询优化器对查询进行优化,同时验证用户是否有权限进行查询,缓存中是否有可用的最新数据。它使用“选取-投影-连接”策略进行查询。
- 例如
SELECT id, name FROM student WHERE gender = "女";
语句中,SELECT 查询先根据 WHERE 语句进行选取,不是将表全部查询出来以后再进行 gender 过滤。SELECT 查询先根据 id 和 name 进行属性投影,不是将属性全部取出以后再进行过滤,将这两个查询条件连接起来生成最终查询结果。
- 例如
- Caches & Buffers(查询缓存):如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的,比如表缓存、记录缓存、key 缓存、权限缓存等。
存储引擎层
Pluggable Storage Engines 属于存储引擎层。存储引擎层是 MySQL 数据库区别于其他数据库最核心的一点,也是 MySQL 最具特色的一个地方。主要负责 MySQL 中数据的存储和提取。因为在关系数据库中,数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。
文件系统层
文件系统层主要是将数据库的数据存储在操作系统的文件系统之上,并完成与存储引擎的交互。
MySQL 5.7的新特性(新功能)
与 MySQL 5.6 相比,MySQL 5.7 具有以下几个方面的新功能。
- 随机 root 密码:MySQL 5.7 数据库初始化完成后,会自动生成一个 root@localhost 用户,root 用户的密码不为空,而是随机产生一个密码。
- 自定义 test 数据库:MySQL 5.7 默认安装完成后没有 test 数据库。用户可以自行创建 test 数据库并对其进行权限控制。
- 默认 SSL 加密:MySQL 5.7 采用了更加简单的 SSL 安全访问机制,默认连接使用 SSL 的加密方式。
- 密码过期策略:MySQL 5.7 支持用户设置密码过期策略,要求用户在一定时间过后必须修改密码。
- 用户锁:MySQL 5.7 为管理员提供了暂时禁用某个用户的功能,使被锁定的用户无法访问和使用数据库。
- 全面支持JSON:MySQL 5.7 也提供了对 JSON 的支持,在服务器端提供了一组便于操作 JSON 的函数。存储的方法是将 JSON 编码成 BLOB 后再由存储引擎进行处理。这样,MySQL 就同时拥有了关系型数据库和非关系型数据库的优点,并且可以提供完整的事务支持。
- 支持两类生成列(generated column):生成列是通过数据库中的其他列计算得到的一列。当为生成列创建索引时,可以便捷地加快查询速度。MySQL 5.7 支持虚拟生成列和存储生成列。虚拟生成列仅将数据保存在表的元数据中,作为缺省的生成列类型;存储生成列则是将数据永久保存在磁盘上,需要更多的磁盘空间。
- 引入系统库(sys schema):系统库中包含一系列视图、函数和存储过程,通过多线程、多进程、组合事务提交和基于行的优化方式将复制功能提高 5 倍以上,用户向外扩充其跨商品系统的工作负载时,得以大幅提升复制的效能和效率。
MySQL安装后的目录结构介绍
MySQL 的安装目录包含一些子目录以及一些后缀名为.ini
的配置文件。MySQL 5.7 版本的安装配置后,目录结构可能如下图所示:
注意:MySQL 5.7 的 Data 目录和 my.ini 文件有时并不放在 MySQL 的安装目录下,而是在 C:\ProgramData\MySQL\MySQL Server 5.7
下(如上图所示)。一般情况下,C 盘下的 ProgramData 目录是隐藏的,需要取消隐藏。
MySQL 安装目录的作用。
- bin 目录:用于放置一些可执行文件,如 mysql.exe、mysqld.exe、mysqlshow.exe 等。
- docs 目录:存放一些文档
- Data 目录:登录数据库后,可使用
SHOW GLOBAL VARIABLES LIKE "%Datadir%";
命令查看 Data 目录位置。Data 目录中用于放置一些日志文件以及数据库。我们创建和保存的数据都存在这个目录里。打开 Data 目录,以上数据库都是安装 MySQL 时,系统自动创建的 - include 目录:用于放置一些头文件,如:mysql.h、mysql_ername.h 等。
- lib 目录:用于放置一系列库文件
- share 目录:用于存放字符集、语言等信息
- my.ini 文件:my.ini 是 MySQL 默认使用的配置文件,一般情况下,只要修改 my.ini 配置文件中的内容就可以对 MySQL 进行配置。
- 除了上述介绍的目录,MySQL 安装目录下可能还有几个后缀名为
.ini
的配置文件,不同的配置文件代表不同的含义。my.ini 是 MySQL 默认使用的配置文件,其它的配置文件都是适合不同数据库的配置文件的模板,在文件名中就说明了适合的数据库类型- my-huge.ini:适合超大型数据库的配置文件。
- my-large.ini:适合大型数据库的配置文件。
- my-medium.ini:适合中型数据库的配置文件。
- my-small.ini:适合小型数据库的配置文件。
- my-template.ini:是配置文件的模板,MySQL 配置向导将该配置文件中选择项写入到 my.ini 文件。
- my-innodb-heavy-4G.ini:表示该配置文件只对于 InnoDB 存储引擎有效,而且服务器的内存不能小于 4GB。
MySQL数据目录
在 MySQL 中,物理文件存放在数据目录中。
数据目录与安装目录不同,安装目录用来存储控制服务器和客户端程序的命令,数据目录用来存储 MySQL 服务器在运行过程中产生的数据。
MySQL 中任何一项逻辑性或者物理性文件都具有可配置性,另外由于开源的原因,每个版本都有一些改进,所以不要死记硬背。
可以通过SHOW VARIABLES LIKE 'datadir';
命令查看MySQL 的数据目录路径
下面分别讲解 MySQL 数据目录里存放的目录和文件。
数据目录
下图是 MySQL(5.7.29)在 Windows 系统下安装的数据文件目录,可以看到有如下几类文件。
- Data 目录用来存放数据库相关的数据信息,包括数据库信息,表信息等。
- MySQL 5.7 及之后的版本开始支持集群模式,installer_config.xml 配置文件主要用于配置单节点或集群模式。
- my.ini 文件是 MySQL 服务端和客户端主要的配置文件,包括编码集、默认引擎、最大连接数等设置。MySQL 服务器启动时会默认加载此文件。
Data目录
Data 目录中存放的文件如下图所示:
由图中可以看出,系统数据库和用户自定义数据库的存放路径相同。数据库目录中主要存放相应的数据库对象
对 Data 目录中的文件说明如下:
- mysql、performance_schema、sakila、sys 和 world 是系统数据库,information_schema 数据库比较特殊,这里没有相应的数据库目录。
- test 是用户自定义的数据库,也就是用户自己创建的数据库。
- auto.cnf:MySQL 服务器的选项文件,用于存储 server-uuid 的值。server-uuid 与 server-id 一样,用于标识 MySQL 实例在集群中的唯一性。
- ib_logfile0、ib_logfile1 是支持事务性引擎的 redo 日志文件
- ibdata1 为共享表空间(系统表空间)。如果采用 InnoDB 引擎,默认大小为 10M 。
- ibtmp1 为存储临时对象的空间,比如临时表对象等。
数据目录里可能还有:
- MySQL 服务器的进程 ID(PID)文件。
- MySQL 服务器所生成的状态和日志文件。
- DES 密钥文件或服务器的 SSL 证书。
数据库目录
数据库实际是一个目录,每个目录都保存着相应数据库中的表以及表数据。对数据库目录中的文件说明如下:
- db.opt:用来保存数据库的配置信息,比如该库的默认字符集编码和字符集排序规则。如果你创建数据库时指定了字符集和排序规则,后续创建的表没有指定字符集和排序规则,那么该表将采用 db.opt 文件中指定的属性。
- 对于 InnoDB 表,如果是独立的表空间,数据库中的表结构以及数据都存储在数据库的路径下(而不是在共享表空间 ibdata1 文件中)。但是数据中的其他对象,包括数据被修改之后,事务提交之间的版本信息,仍然存储在共享表空间的 ibdata1 文件中。
- .frm:在 MySQL 中建立任何一张数据表,其对应的数据库目录下都会有该表的 .frm 文件。
.frm
文件用来保存每个数据表的元数据(meta)和表结构等信息。数据库崩溃时,可以用 .frm 文件恢复表结构。.frm 文件跟存储引擎无关,任何存储引擎的数据表都有 .frm 文件,命名方式为表名.frm
,如 users.frm。- MySQL 8.0 版本开始,frm 文件被取消,MySQL 把文件中的数据都写到了系统表空间。通过利用 InnoDB 存储引擎来实现表 DDL 语句操作的原子性(在之前版本中是无法实现表 DDL 语句操作的原子性的,如 TRUNCATE 无法回滚)。
- .MYD和.MYI
-
.MYD
理解为 My Data,用于存放 MyISAM 表的数据 -
.MYI
理解为 My Index,主要存放 MyISAM 表的索引及相关信息。
-
- .ibd:对于 InnoDB 存储引擎的数据表,一个表对应两个文件,一个是
*.frm
,存储表结构信息;一个是*.ibd
,存储表中数据。 - .ibd和.ibdata:都是专属于 InnoDB 存储引擎的数据库文件。当采用共享表空间时,所有 InnoDB 表的数据均存放在 .ibdata 中。所以当表越来越多时,这个文件会变得很大。相对应的 .ibd 就是采用独享表空间时 InnoDB 表的数据文件。
- 当然,就算开启了独享表空间,ibdata 文件也会越来越大,因为这个文件里还存储了:
- 变更缓冲区
- 双写缓冲区
- 撤销日志
- 当然,就算开启了独享表空间,ibdata 文件也会越来越大,因为这个文件里还存储了:
MySQL配置文件(my.ini)详解
my.ini 是 MySQL 数据库中使用的配置文件,MySQL 服务器启动时会读取这个配置文件,我们可以通过修改这个文件,达到更新配置的目的。
- 一般情况下,my.ini 在 MySql 安装的根目录下,也有可能在隐藏文件夹“ProgramData”下面。
文件内容如下:
[client]
port=3306
[mysql]
default-character-set=gbk
上面显示的是客户端的参数,[client] 和 [mysql] 都是客户端,参数说明如下:
- port:表示 MySQL 客户端连接服务器端时使用的端口号,默认的端口号为 3306。如果需要更改端口号的话,可以直接在这里修改。
- default-character-set:表示 MySQL 客户端默认的字符集。
服务器的参数,参数说明如下:
port=3306 :表示 MySQL 服务器的端口号
basedir=C:/Program Files/MySQL/MySQL Server 5.7/ :表示 MySQL 的安装路径
datadir=C:/ProgramData/MySQL/MySQL Server 5.7/Data :表示 MySQL 数据文件的存储位置,也是数据表的存放位置
character-set-server=gb2312 :表示服务器端默认的字符集
default-storage-engine=INNODB:创建数据表时,默认使用的存储引擎
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION":表示 SQL 模式的参数,通过这个参数可以设置检验 SQL 语句的严格程度
max_connections=100:表示允许同时访问 MySQL 服务器的最大连接数。其中一个连接是保留的,留给管理员专用的
query_cache_size=0:查询时的缓存大小,缓存中可以存储以前通过 SELECT 语句查询过的信息,再次查询时就可以直接从缓存中拿出信息,可以改善查询效率
table_cache=256:表示所有进程打开表的总数
tmp_table_size=35M:表示内存中每个临时表允许的最大大小
thread_cache_size=8:表示缓存的最大线程数
myisam_max_sort_file_size=100G:表示 MySQL 重建索引时所允许的最大临时文件的大小
myisam_sort_buffer_size=69M;表示重建索引时的缓存大小
key_buffer_size=55M:表示关键词的缓存大小
read_buffer_size=64K:表示 MyISAM 表全表扫描的缓存大小
read_rnd_buffer_size=256K:表示将排序好的数据存入该缓存中
sort_buffer_size=256K:表示用于排序的缓存大小
InnoDB 存储引擎使用的参数,参数说明如下:
- innodb_additional_mem_pool_size=3M:表示附加的内存池,用来存储 InnoDB 表的内容。
- innodb_flush_log_at_trx_commit=1:是设置提交日志的时机,若设置为 1,InnoDB 会在每次提交后将事务日志写到磁盘上。
- innodb_log_buffer_size=2M:表示用来存储日志数据的缓存区的大小。
- innodb_buffer_pool_size=107M:表示缓存的大小,InnoDB 使用一个缓冲池类保存索引和原始数据。
- innodb_log_file_size=54M:表示日志文件的大小。
- innodb_thread_concurrency=18:表示在 InnoDB 存储引擎允许的线程最大数。
注意:每次修改 my.ini 文件中的参数后,必须重新启动 MySQL 服务才会有效。
MySQL服务器的SQL模式(sql_mode变量)
MySQL 服务器可以在不同的 SQL 模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于 sql_mode 系统变量的值。
SQL 模式定义了 MySQL 数据库所支持的 SQL 语法和数据校验(数据验证检查),这样可以更容易的在不同环境下使用 MySQL。
在 MySQL 中,SQL 模式常用来解决下面几类问题:
- 通过设置 SQL Mode,可以完成不同严格程度的数据校验,有效地保障了数据的准确性。
- 通过设置 SQL Mode 为 ANSI 模式,可以保证大多数 SQL 符合标准的 SQL 语法,使不同数据库之间进行迁移时,不需要进行较大的修改。
- 在不同数据库之间进行数据迁移之前,设置 SQL Mode 可以使 MySQL 中的数据更方便地迁移到目标数据库中。
sql_mode 系统变量的常用值
下面列出了几种 SQL 模式常用的值。
- TRICT_ ALL_TABLES 和 STRICT_ TRANS_TABLES:如果将 sql_mode 的值设置为 TRICT_ALL_TABLES 和 STRICT_TRANS_TABLES,那么 MySQL将启用“严格”模式。在严格模式下,MySQL 服务器会更加严格地对待接收到的不合格数据,它不会把这些不合格的数据转换为最为接近的有效值,而是会拒绝接收它们。简单来说 MySQL 的严格模式就是 MySQL 自身对数据进行的严格校验,例如格式、长度和类型等。
- TRADITIONAL:类似于严格模式,但是对于插入的不合格值会给出错误而不是警告。可以应用在事务表和非事务表
- 用于事务表只要出现错误就会立即回滚。
- 如果是非事务存储引擎,建议不要把 SQL Mode 值设置为 TRADITIONAL,因为出现错误前进行的操作不会回滚,这样会导致操作只进行了一部分。
- ANSI_QUOTES:MySQL 服务器会把双引号识别为一个标识符引用字符,不是字符串的引号字符。在启用 ANSI_QUOTES 时,不能用双引号来引用字符串。
- PIPES_ AS_ CONCAT:会让 MySQL 服务器把
||
当成一个标准的 SQL 字符串连接运算符,而不会把它当成是 OR 运算符的同义词。- 在 Oracle 等数据库中,
||
被视为字符串的连接操作符,所以在其它数据库中含有||
操作符的 SQL 在 MySQL 中将无法执行,为了解决这个问题,MySQL 提供了这个值。
- 在 Oracle 等数据库中,
- ANSI:会同时启用 ANSI_QUOTES、PIPES_ AS_CONCAT 和其它的几个模式值,使 MySQL 服务器的行为比它的默认运行状态更接近于标准 SQL。
如何设置 sql_mode
在设置 SQL 模式时,需要指定一个由单个模式值或多个模式值(多个模式值用逗号分隔)构成的值,或者指定一个空字符串,用以清除该值。值不区分大小写。
如果想在启动服务器时设置 SQL 模式,那么可以在 mysqld 命令行,或者在某个选项文件里设置系统变量 sql_mode。可以使用下面语句:
sql_mode= "TRADITIONAL "
sql_mode= "ANSI_ QUOTES, PIPES_ AS_ CONCAT"
如果只是想在运行时更改 SQL 模式,那么可以使用 SET 语句来设置 sql_mode 系统变量。
SET sql_mode = ' TRADITIONAL' ;
如果想设置全局性的 SQL 模式,则需要加上 GLOBAL 关键字:
SET GLOBAL sql_mode = ' TRADITIONAL';
设置全局变量需要具备 SUPER 管理权限。新设置的全局变量值将成为此后连入客户端的默认 SQL 模式。
如果想获取当前会话或全局的 SQL 模式值,则可以使用如下语句:
SELECT @@SESSION.sql_mode;
SELECT @@GLOBAL. sql_mode;
其返回值由当前启用的所有模式构成,两个模式之间以逗号隔开。如果当前没有启用任何模式,则返回一个空值。