MySQL入门教程 ===
从零开始学习MySQL,主要是面向MySQL数据库管理系统初学者。前端开发工程师为什么写这个入门教程呢?最近项目强迫我这个前端老司机使用MySQL,虽然我在项目中已经使用过一段时间,为了写出高质量的SQL语句,能快速定位解决数据库引发的问题,系统的过一遍基础,你也可以当做是我的笔记。有幸也认识一些 MySQL 的 DBA,这让我学习起来比较快,能快速入门,进入实战开发阶段。
原本我是使用 MongoDB 这类型的 NoSQL 数据库,MongoDB在 Nodejs 在 Mongoose 包的帮助下 JSON 的数据格式直接插入 MongoDB 中,对于一个前端开发工程师,使用起来非常舒服。但是没有办法,我是被逼的,从此入了一个新坑,我就决心系统的好好学习一下。如果你对本小电子书阅读非常没有耐心,你可以看看我做的一篇笔记 《21分钟MySQL基础入门》 ,这个笔记还可以在 SegmentFault 里面阅读,有导航阅读非常方便,为什么只需要21分钟呢?因为在我们大天朝有句话叫做“不管三七二十一”,你可以不管三七二十一开始使用 MySQL 及快速入门,里面系统的整理了,一些常用的SQL语句。
在本书中所搜集到得各种资源,我把它将放到这里 Awesome MySQL。所有SQL语句例子,是基于 MySQL 5.7.14 或者 MySQL 5.7.16 运行的。这里面的一些理论知识都是从维基百科等各种百科、各种官网搬运过来的,偶尔会有一些基础理论知识总结,如果有错误或者误差,可以给我来个疯狂的Pull requesets或Issue。如果实在看不下去你可以🔫。
MariaDB,是 MySQL server 的一个由社区开发的分支,MariaDB大部分跟 MySQL 5.5 以前版本使用差不多。自己电脑上是 MySQL 5.7.14,公司服务器上面是 MariaDB 最新版本,生产上 MySQL 5.7.16,所以很尴尬,偶尔提及MariaDB也是很正常的吧。
[!TIP] 没有完成的部分我已经借助 GPT-5.4 进行了补充完善,也欢迎大家结合 AI 工具进一步优化,让这份教程更加易懂、更加适合入门学习。(2026/03)
目录
Awesome MySQL
- 21分钟MySQL基础入门
- 手册文档 - 一些非官方的手册文档搜集
- 分析工具 - 性能,结构和数据分析工具
- GUI - 搜集的一些 MySQL 的客户端,也有命令行客户端
- 服务器 - MySQL服务器的衍生品
- 备份 - 备份/存储/恢复 工具
- 官方资料 - 官方的一些网站和文章
- 优秀文章 - 一些优秀的文章
第1章 初识MySQL
- 1.1 数据库基础
- [什么是数据库](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter1/1.1.md#什么是数据库)
- [数据库分类](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter1/1.1.md#数据库分类)
- [数据库模型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter1/1.1.md#数据库模型)
- [数据表](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter1/1.1.md#数据表)
- [关系键](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter1/1.1.md#关系键)
- 1.2 数据库技术构成
- [数据库系统](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter1/1.2.md#数据库系统)
- [关系数据库基本概念](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter1/1.2.md#关系数据库基本概念)
- [SQL语言](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter1/1.2.md#sql语言)
- [数据库访问技术](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter1/1.2.md#数据库访问技术)
- 1.3 什么是MySQL
- [MySQL介绍](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter1/1.3.md#mysql-介绍)
- [MySQL发展历史](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter1/1.3.md#mysql-发展历史)
- [MySQL版本](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter1/1.3.md#mysql-版本)
- [MySQL的优势](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter1/1.3.md#mysql-的优势)
- 1.4 如何学习MySQL
第2章 MySQL的安装与配置
- 2.1 Mac平台下安装与配置MySQL
- [Mac上安装MySQL](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.1.md#mac-安装mysql)
- [Mac上卸载MySQL](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.1.md#mac-卸载mysql)
- [检查是否已安装](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.2.md#检查是否已安装)
- [更新安装源](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.2.md#更新安装源)
- [检查是否下载成功](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.2.md#检查是否下载成功)
- [查看版本](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.2.md#查看版本)
- [启动指定版本](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.2.md#启动指定版本)
- [安装MySQL](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.2.md#安装mysql)
- [查看安装目录](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.2.md#查看安装目录)
- [MariaDB切换MySQL](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.2.md#mariadb切换mysql)
- [卸载 MySQL 软件](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.2.md#卸载-mysql-软件)
- 2.3 Docker 安装 MySQL
- [快速启动一个 MySQL 服务器实例](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.3.md#快速启动一个-mysql-服务器实例)
- [通过命令行访问 MySQL 容器](#通过命令行访问-mysql-容器)
- [使用 MySQL 自定义配置文件](#使用-mysql-自定义配置文件)
- [使用 stack 部署 MySQL](#使用-stack-部署-mysql)
- 2.4 启动数据库设置初始密码
- [命令行启动关闭重启MySQL服务](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.4.md#命令行启动关闭重启mysql服务)
- [图像界面启动关闭重启MySQL服务](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.4.md#图像界面启动关闭重启mysql服务)
- [查看初始密码](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.4.md#查看初始密码)
- [设置初始化密码](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.4.md#设置初始化密码)
- [启动报错处理](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.4.md#启动报错处理)
- 2.5 MySQL工具
- [命令行使用程序](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.5.md#命令行使用程序)
- [MySQL Workbench客户端](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.5.md#mysql-workbench客户端)
- [常用图形管理工具](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.5.md#常用图形管理工具)
- [MyCli替代MySQL的mysql命令行工具](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.5.md#mycli替代mysql的mysql命令行工具)
- 2.6 MySQL配置修改
- [MySQL安装目录说明](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.6.md#mysql安装目录说明)
- [配置文件的位置](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.6.md#配置文件的位置)
- [Windows系统配置文件读取](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.6.md#windows系统配置文件读取)
- [Linux系统配置文件读取](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.6.md#linux系统配置文件读取)
- [配置文件内容](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter2/2.6.md#配置文件内容)
第3章 数据库的基本操作
- 3.1 连接数据库
- [MySQL命令语法](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter3/3.1.md#mysql命令语法)
- [MySQL命令连接数据库](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter3/3.1.md#mysql命令连接数据库)
- [开启MySQL的远程帐号](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter3/3.1.md#开启mysql的远程帐号)
- [MySQL修改密码](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter3/3.1.md#mysql修改密码)
- 3.2 查看选择数据库
- [查看数据库](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter3/3.2.md#查看数据库)
- [选择数据库](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter3/3.2.md#选择数据库)
- 3.3 创建数据库
- [SQL语句创建数据库](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter3/3.3.md#sql语句创建数据库)
- [管理工具创建数据库](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter3/3.3.md#管理工具创建数据库)
- 3.4 删除数据库
- [SQL语句删除数据库](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter3/3.4.md#sql语句删除数据库)
- [管理工具删除数据库](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter3/3.4.md#管理工具删除数据库)
- 3.5 数据库存储引擎
- [存储引擎简介](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter3/3.5.md#存储引擎简介)
- [常用引擎对比](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter3/3.5.md#常用引擎对比)
- [查看存储引擎](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter3/3.5.md#查看存储引擎)
- [设置存储引擎](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter3/3.5.md#设置存储引擎)
- [如何选择合适的存储引擎](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter3/3.5.md#如何选择合适的存储引擎)
第4章 数据表的基本操作
- 4.1 创建数据表
- [数据表的结构设计](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter4/4.1.md#数据表的结构设计)
- [CREATE TABLE语句](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter4/4.1.md#create-table语句)
- [设置主键约束](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter4/4.1.md#设置主键约束)
- [设置外键约束](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter4/4.1.md#设置外键约束)
- 4.2 查看数据表结构
- [DESCRIBE语句](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter4/4.2.md#describe语句)
- [SHOW CREATE TABLE语句](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter4/4.2.md#show-create-table语句)
- 4.3 修改数据表
- [修改表名](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter4/4.3.md#修改表名)
- [修改字段数据类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter4/4.3.md#修改字段数据类型)
- [添加字段](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter4/4.3.md#添加字段)
- [删除字段](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter4/4.3.md#删除字段)
- [修改字段名](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter4/4.3.md#修改字段名)
- 4.4 删除数据表
- [删除没有被关联的表](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter4/4.4.md#删除没有被关联的表)
- [删除被其他表关联的主表](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter4/4.4.md#删除被其他表关联的主表)
第5章 数据类型和运算符
- 5.1 MySQL 数据类型介绍
- [数据类型的分类](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.1.md#数据类型的分类)
- [如何选择数据类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.1.md#如何选择数据类型)
- [MySQL 8.x 重要新特性](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.1.md#mysql-8x-重要新特性)
- 5.2 整数类型
- [TINYINT类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.2.md#tinyint类型)
- [SMALLINT类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.2.md#smallint类型)
- [MEDIUMINT类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.2.md#mediumint类型)
- [INT类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.2.md#int类型)
- [BIGINT类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.2.md#bigint类型)
- 5.3 浮点数类型和定点数类型
- [FLOAT类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.3.md#float类型)
- [DOUBLE类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.3.md#double类型)
- [DECIMAL类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.3.md#decimal类型)
- 5.4 日期时间类型
- [YEAR类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.4.md#year类型)
- [DATE类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.4.md#date类型)
- [TIME类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.4.md#time类型)
- [DATETIME类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.4.md#datetime类型)
- [TIMESTAMP类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.4.md#timestamp类型)
- 5.5 字符串类型
- [CHAR和VARCHAR类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.5.md#char和varchar类型)
- [TEXT类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.5.md#text类型)
- [ENUM类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.5.md#enum类型)
- [SET类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.5.md#set类型)
- 5.6 二进制类型
- [BIT类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.6.md#bit类型)
- [BINARY和VARBINARY类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.6.md#binary和varbinary类型)
- [BLOB类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.6.md#blob类型)
- 5.7 运算符
- [算术运算符](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.7.md#算术运算符)
- [比较运算符](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.7.md#比较运算符)
- [逻辑运算符](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.7.md#逻辑运算符)
- [位运算符](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter5/5.7.md#位运算符)
第6章 MySQL函数
- 6.1 MySQL函数简介
- [函数的分类](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.1.md#函数的分类)
- [如何使用函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.1.md#如何使用函数)
- 6.2 数学函数
- [绝对值函数和返回圆周率的函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.2.md#绝对值函数和返回圆周率的函数)
- [平方根函数和求余函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.2.md#平方根函数和求余函数)
- [获取整数的函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.2.md#获取整数的函数)
- [获取随机数的函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.2.md#获取随机数的函数)
- [三角函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.2.md#三角函数)
- 6.3 字符串函数
- [计算字符串字符数和字符串长度的函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.3.md#计算字符串字符数和字符串长度的函数)
- [合并字符串函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.3.md#合并字符串函数)
- [替换字符串的函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.3.md#替换字符串的函数)
- [比较字符串大小的函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.3.md#比较字符串大小的函数)
- [查找字符串的函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.3.md#查找字符串的函数)
- 6.4 日期时间函数
- [获取当前日期时间的函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.4.md#获取当前日期时间的函数)
- [获取月份的函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.4.md#获取月份的函数)
- [获取星期的函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.4.md#获取星期的函数)
- [获取时间的函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.4.md#获取时间的函数)
- [格式化日期的函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.4.md#格式化日期的函数)
- 6.5 条件判断函数
- [IF语句和CASE语句](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.5.md#if语句和case语句)
- [IFNULL和NULLIF函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.5.md#ifnull和nullif函数)
- 6.6 系统信息函数
- [获取MySQL版本号、连接数和数据库名的函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.6.md#获取mysql版本号连接数和数据库名的函数)
- [获取用户名的函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.6.md#获取用户名的函数)
- [获取字符串的字符集和排序方式的函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.6.md#获取字符串的字符集和排序方式的函数)
- 6.7 加密函数
- [加密函数PASSWORD](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.7.md#加密函数password)
- [加密函数MD5](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.7.md#加密函数md5)
- [加密函数ENCODE和DECODE](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter6/6.7.md#加密函数encode和decode)
第7章 查询数据
- 7.1 基本查询语句
- [SELECT语句的语法](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.1.md#select语句的语法)
- [查询所有字段](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.1.md#查询所有字段)
- [查询指定字段](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.1.md#查询指定字段)
- [查询指定记录](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.1.md#查询指定记录)
- [带IN关键字的查询](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.1.md#带in关键字的查询)
- [带BETWEEN AND的范围查询](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.1.md#带between-and的范围查询)
- [带LIKE的字符匹配查询](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.1.md#带like的字符匹配查询)
- 7.2 排序查询
- [单字段排序](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.2.md#单字段排序)
- [多字段排序](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.2.md#多字段排序)
- 7.3 限制查询结果的数量
- [指定初始位置](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.3.md#指定初始位置)
- [不指定初始位置](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.3.md#不指定初始位置)
- 7.4 统计函数和分组查询
- [COUNT函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.4.md#count函数)
- [SUM函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.4.md#sum函数)
- [AVG函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.4.md#avg函数)
- [MAX和MIN函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.4.md#max和min函数)
- [GROUP BY关键字](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.4.md#group-by关键字)
- [HAVING关键字](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.4.md#having关键字)
- 7.5 连接查询
- [内连接查询](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.5.md#内连接查询)
- [外连接查询](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.5.md#外连接查询)
- [复合条件连接查询](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.5.md#复合条件连接查询)
- 7.6 子查询
- [带ANY、SOME关键字的子查询](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.6.md#带any-some关键字的子查询)
- [带ALL关键字的子查询](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.6.md#带all关键字的子查询)
- [带EXISTS关键字的子查询](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.6.md#带exists关键字的子查询)
- 7.7 合并查询结果
- [UNION关键字](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.7.md#union关键字)
- [UNION ALL关键字](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.7.md#union-all关键字)
- 7.8 事务与锁基础
- [什么是事务](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.8.md#什么是事务)
- [事务的四个特性](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.8.md#事务的四个特性)
- [什么是锁](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.8.md#什么是锁)
- [常见锁类型](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.8.md#常见锁类型)
- [事务隔离级别](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter7/7.8.md#事务隔离级别)
第8章 插入、更新与删除数据
- 8.1 插入数据
- [INSERT语句的语法](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter8/8.1.md#insert语句的语法)
- [为表的所有字段插入数据](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter8/8.1.md#为表的所有字段插入数据)
- [为表的指定字段插入数据](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter8/8.1.md#为表的指定字段插入数据)
- [同时插入多条记录](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter8/8.1.md#同时插入多条记录)
- [将查询结果插入到表中](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter8/8.1.md#将查询结果插入到表中)
- 8.2 更新数据
- [UPDATE语句的语法](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter8/8.2.md#update语句的语法)
- [更新部分数据](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter8/8.2.md#更新部分数据)
- [更新全部数据](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter8/8.2.md#更新全部数据)
- 8.3 删除数据
- [DELETE语句的语法](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter8/8.3.md#delete语句的语法)
- [删除部分数据](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter8/8.3.md#删除部分数据)
- [删除全部数据](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter8/8.3.md#删除全部数据)
第9章 索引
- 9.1 索引简介
- [索引的含义和特点](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter9/9.1.md#索引的含义和特点)
- [索引的分类](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter9/9.1.md#索引的分类)
- [索引的设计原则](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter9/9.1.md#索引的设计原则)
- 9.2 创建索引
- [创建表的时候创建索引](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter9/9.2.md#创建表的时候创建索引)
- [在已经存在的表上创建索引](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter9/9.2.md#在已经存在的表上创建索引)
- 9.3 删除索引
- [使用ALTER TABLE删除索引](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter9/9.3.md#使用alter-table删除索引)
- [使用DROP INDEX删除索引](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter9/9.3.md#使用drop-index删除索引)
第10章 存储过程和函数
- 10.1 存储过程和函数的概述
- [什么是存储过程和函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter10/10.1.md#什么是存储过程和函数)
- [存储过程和函数的区别](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter10/10.1.md#存储过程和函数的区别)
- 10.2 创建存储过程和函数
- [创建存储过程](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter10/10.2.md#创建存储过程)
- [创建存储函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter10/10.2.md#创建存储函数)
- [变量的使用](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter10/10.2.md#变量的使用)
- [定义条件和处理程序](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter10/10.2.md#定义条件和处理程序)
- [光标的使用](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter10/10.2.md#光标的使用)
- [流程控制的使用](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter10/10.2.md#流程控制的使用)
- 10.3 调用存储过程和函数
- [调用存储过程](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter10/10.3.md#调用存储过程)
- [调用存储函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter10/10.3.md#调用存储函数)
- 10.4 查看存储过程和函数
- [SHOW STATUS语句查看存储过程和函数的状态](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter10/10.4.md#show-status语句查看存储过程和函数的状态)
- [SHOW CREATE语句查看存储过程和函数的定义](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter10/10.4.md#show-create语句查看存储过程和函数的定义)
- [从information_schema.Routines表中查看存储过程和函数的信息](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter10/10.4.md#从information_schemaroutines表中查看存储过程和函数的信息)
- 10.5 修改存储过程和函数
- [使用ALTER语句修改存储过程和函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter10/10.5.md#使用alter语句修改存储过程和函数)
- 10.6 删除存储过程和函数
- [删除存储过程](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter10/10.6.md#删除存储过程)
- [删除存储函数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter10/10.6.md#删除存储函数)
第11章 视图
- 11.1 视图概述
- [什么是视图](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter11/11.1.md#什么是视图)
- [视图的作用](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter11/11.1.md#视图的作用)
- 11.2 创建视图
- [创建视图的语法](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter11/11.2.md#创建视图的语法)
- [在单表上创建视图](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter11/11.2.md#在单表上创建视图)
- [在多表上创建视图](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter11/11.2.md#在多表上创建视图)
- 11.3 查看视图
- [DESCRIBE语句查看视图基本信息](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter11/11.3.md#describe语句查看视图基本信息)
- [SHOW TABLE STATUS语句查看视图基本信息](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter11/11.3.md#show-table-status语句查看视图基本信息)
- [SHOW CREATE VIEW语句查看视图详细信息](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter11/11.3.md#show-create-view语句查看视图详细信息)
- [在views表中查看视图详细信息](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter11/11.3.md#在views表中查看视图详细信息)
- 11.4 修改视图
- [CREATE OR REPLACE VIEW语句修改视图](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter11/11.4.md#create-or-replace-view语句修改视图)
- [ALTER语句修改视图](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter11/11.4.md#alter语句修改视图)
- 11.5 更新视图
- [更新视图中的数据](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter11/11.5.md#更新视图中的数据)
- [视图不可更新的部分](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter11/11.5.md#视图不可更新的部分)
- 11.6 删除视图
- [DROP VIEW语句删除视图](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter11/11.6.md#drop-view语句删除视图)
第12章 触发器
- 12.1 触发器概述
- [创建触发器](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter12/12.1.md#创建触发器)
- [查看触发器](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter12/12.1.md#查看触发器)
- [删除触发器](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter12/12.1.md#删除触发器)
- 12.2 使用触发器
- [INSERT触发器](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter12/12.2.md#insert触发器)
- [UPDATE触发器](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter12/12.2.md#update触发器)
- [DELETE触发器](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter12/12.2.md#delete触发器)
第13章 MySQL用户管理
- 13.1 权限表
- [user表](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter13/13.1.md#user表)
- [db表和host表](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter13/13.1.md#db表和host表)
- [tables_priv表和columns_priv表](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter13/13.1.md#tables_priv表和columns_priv表)
- [procs_priv表](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter13/13.1.md#procs_priv表)
- 13.2 账户管理
- [创建用户](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter13/13.2.md#创建用户)
- [删除用户](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter13/13.2.md#删除用户)
- [修改用户密码](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter13/13.2.md#修改用户密码)
- 13.3 权限管理
- [权限的授予](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter13/13.3.md#权限的授予)
- [权限的撤销](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter13/13.3.md#权限的撤销)
- [查看权限](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter13/13.3.md#查看权限)
- 13.4 访问控制
- [连接核实阶段](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter13/13.4.md#连接核实阶段)
- [请求核实阶段](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter13/13.4.md#请求核实阶段)
第14章 数据备份与还原
- 14.1 数据备份
- [使用mysqldump命令备份](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter14/14.1.md#使用mysqldump命令备份)
- [直接复制整个数据库目录](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter14/14.1.md#直接复制整个数据库目录)
- [使用mysqlhotcopy工具快速备份](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter14/14.1.md#使用mysqlhotcopy工具快速备份)
- 14.2 数据还原
- [使用mysql命令还原](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter14/14.2.md#使用mysql命令还原)
- [直接复制到数据库目录](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter14/14.2.md#直接复制到数据库目录)
- [mysqlhotcopy快速恢复](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter14/14.2.md#mysqlhotcopy快速恢复)
- 14.3 表的导出和导入
- [用SELECT...INTO OUTFILE导出文本文件](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter14/14.3.md#用selectinto-outfile导出文本文件)
- [用mysqldump命令导出文本文件](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter14/14.3.md#用mysqldump命令导出文本文件)
- [用mysql命令导出文本文件](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter14/14.3.md#用mysql命令导出文本文件)
- [用LOAD DATA INFILE方式导入文本文件](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter14/14.3.md#用load-data-infile方式导入文本文件)
- [用mysqlimport命令导入文本文件](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter14/14.3.md#用mysqlimport命令导入文本文件)
第15章 MySQL日志
- 15.1 日志简介
- [MySQL日志的分类](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter15/15.1.md#mysql日志的分类)
- 15.2 二进制日志
- [启动和设置二进制日志](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter15/15.2.md#启动和设置二进制日志)
- [查看二进制日志](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter15/15.2.md#查看二进制日志)
- [删除二进制日志](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter15/15.2.md#删除二进制日志)
- [使用二进制日志还原数据库](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter15/15.2.md#使用二进制日志还原数据库)
- [暂时停止二进制日志功能](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter15/15.2.md#暂时停止二进制日志功能)
- 15.3 错误日志
- [启动和设置错误日志](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter15/15.3.md#启动和设置错误日志)
- [查看错误日志](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter15/15.3.md#查看错误日志)
- [删除错误日志](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter15/15.3.md#删除错误日志)
- 15.4 通用查询日志
- [启动和设置通用查询日志](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter15/15.4.md#启动和设置通用查询日志)
- [查看通用查询日志](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter15/15.4.md#查看通用查询日志)
- [删除通用查询日志](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter15/15.4.md#删除通用查询日志)
- 15.5 慢查询日志
- [启动和设置慢查询日志](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter15/15.5.md#启动和设置慢查询日志)
- [查看慢查询日志](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter15/15.5.md#查看慢查询日志)
- [删除慢查询日志](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter15/15.5.md#删除慢查询日志)
第16章 性能优化
- 16.1 优化简介
- [MySQL优化介绍](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter16/16.1.md#mysql优化介绍)
- [优化的原则](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter16/16.1.md#优化的原则)
- 16.2 优化查询
- [分析查询语句](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter16/16.2.md#分析查询语句)
- [索引对查询速度的影响](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter16/16.2.md#索引对查询速度的影响)
- [使用索引查询](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter16/16.2.md#使用索引查询)
- [优化子查询](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter16/16.2.md#优化子查询)
- 16.3 优化数据库结构
- [将字段很多的表分解成多个表](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter16/16.3.md#将字段很多的表分解成多个表)
- [增加中间表](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter16/16.3.md#增加中间表)
- [增加冗余字段](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter16/16.3.md#增加冗余字段)
- [优化插入记录的速度](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter16/16.3.md#优化插入记录的速度)
- [分析表、检查表和优化表](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter16/16.3.md#分析表检查表和优化表)
- 16.4 优化MySQL服务器
- [优化服务器硬件](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter16/16.4.md#优化服务器硬件)
- [优化MySQL的参数](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter16/16.4.md#优化mysql的参数)
第17章 各种问题解决
- [mysqld_safe不存在修改密码](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter17/17.3.md#mysqld_safe不存在修改密码)
- [启动修改丢失的mysql单实例root密码方法](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter17/17.3.md#启动修改丢失的mysql单实例root密码方法)
- [Mac下重置MySQL的root密码](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter17/17.3.md#Mac下重置MySQL的root密码)
- [不重启mysqld修改密码的方法](https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/HEAD/docs/chapter17/17.3.md#不重启mysqld的方法)
读者对象
整本书目录规划参考了其它几本 MySQL 书籍目录规划的,在我边学习边整理的过程可能有修改,这个过程有点慢,希望能完成,所以教程适合以下读者学习阅读使用:
- MySQL 数据库初学者。
- 对数据库开发感兴趣,希望快速、全面掌握 MySQL 的人员。
- 对其他数据库有一定的了解,想转到 MySQL 平台使用它的开发者。
- 像我一样被逼无奈使用 MySQL 数据库的人。
从目录来看,看上去内容丰富,比较完整的介绍了 MySQL 数据库技术的教程,我不是DBA,我不是,正在看这篇文章的你,很可能也不是,不想误人子弟,在项目中应用了一段时间 MySQL,如果你是DBA请多多指教,文采不佳还望高抬贵手,不甚感激,小弟在这里给您鞠躬,欢迎给我纠错。
我想念一个女孩儿,实属无奈我得继续努力,好好读书做个有趣的人,完成我的“著作”,待我著作完成可否跟我约个会? 还没有写完就结婚了,欢迎大家 PR 补充完善 :)。
Contributors
As always, thanks to our amazing contributors!
Made with action-contributors.
License
Licensed under the MIT License.
awesome mysql
Awesome MySQL ===
这是一个MySQL软件库和资源列表清单。部分资源搜集来源于shlomi-noach/awesome-mysql,它的中文翻译在这里,没有完全fork过来,没有完全拷贝,是因为部分排版比较丑陋,部分工具慢慢搜集理解。
说明
![Open-Source Software][OSS Icon] 表示开源标示,点击进入开源仓库; ![Freeware][Freeware Icon] 表示免费标示,或者个人免费; ![hot][hot Icon] 表示热门的资源标示; ![tuijian][tuijian Icon] 表示推荐资源标示; ![必备][bibei Icon] 表示必备资源标示; ![1 star][red Icon] 表示强烈推荐的,星星的数量来表达强烈的程度;
目录
手册文档
_这里是一些非官方的手册文档_
- http://www.w3school.com.cn/sql/index.asp
- http://www.1keydata.com/cn/sql/sql-count.php
- http://www.runoob.com/mysql/mysql-tutorial.html
分析工具
_性能,结构和数据分析工具_
- Anemometer - 一个 SQL 慢查询监控器。
- innodb-ruby - 一个对 InooDB 格式文件的解析器,用于 Ruby 语言。
- innotop - 一个具备多种特性和可扩展性的 MySQL 版 'top' 工具。
- pstop - 一个针对 MySQL 的类 top 程序,用于收集,汇总以及展示来自 performance_schema 的信息。
- mysql-statsd - 一个收集 MySQL 信息的 Python 守护进程,并通过 StatsD 发送到 Graphite。
- sql.ohrz.net - SQL语句解读服务,支持高亮显示解析结果中表名、字段名、子查询语句等在原文中对应的位置。
GUI
_这里是搜集的一些 MySQL 的客户端,也有命令行客户端。_
- TablePlus - 支持PostgreSQL,MySQL,RedShift,MariaDB ...各种数据库的高颜值客户端。[![Open-Source Software][OSS Icon]](https://github.com/sequelpro/sequelpro) ![Freeware][Freeware Icon] ![hot][hot Icon] ![必备][bibei Icon]
- TablePro - 轻量快速的数据库客户端,支持主流 SQL/NoSQL 数据源并提供 AI 辅助 SQL 编辑。 [![Open-Source Software][OSS Icon]](https://github.com/datlechin/TablePro) ![Freeware][Freeware Icon]
- Sequel Pro - 一个MySQL数据库管理软件。[![Open-Source Software][OSS Icon]](https://github.com/sequelpro/sequelpro) ![Freeware][Freeware Icon] ![hot][hot Icon]
- MySQL Workbench - MySQL数据库官方管理软件。提供给数据库管理员和开发人员进行数据库设计和建模的集成工具环境;SQL 开发;数据库管理。
- Navicat - 同样跨平台,同时支持多个数据库系统(MySQL、SQL Server、Oracle)。
- ElectroCRUD - MySQL数据库CRUD应用程序。[![Open-Source Software][OSS Icon]](https://github.com/garrylachman/ElectroCRUD) ![Freeware][Freeware Icon]
- Chrome MySQL Admin - 一个Chrome插件,是MySQL开发的跨平台、可视化数据库工具。[![Open-Source Software][OSS Icon]](https://github.com/yoichiro/chrome_mysql_admin) ![Freeware][Freeware Icon]
- Adminer - 一个 PHP 编写的数据库管理工具。[![Open-Source Software][OSS Icon]](https://github.com/vrana/adminer) ![Freeware][Freeware Icon]
- HeidiSQL - Windows 下的 MySQL 图形化管理工具。[![Open-Source Software][OSS Icon]](https://github.com/HeidiSQL/HeidiSQL) ![Freeware][Freeware Icon]
- phpMyAdmin - 一个 PHP 写成的开源软件,意图对 web 上的 MySQL 进行管理。[![Open-Source Software][OSS Icon]](https://github.com/phpmyadmin/phpmyadmin)
- mycli - 为MySQL命令行客户端,提供语法高亮和提示功能的工具!
[![Open-Source Software][OSS Icon]](https://github.com/dbcli/mycli) ![Freeware][Freeware Icon] ![tuijian][tuijian Icon] ![star 5][star5 Icon]
- dbdiagram - 创建数据库的实体-关系图的工具。
服务器
_MySQL服务器的衍生品_
- MariaDB - MySQL server 的一个由社区开发的分支。
- MySQL Server & MySQL Cluster - Oracle 官方的 MySQL server 和 MySQL 集群分布。
- Percona Server - 一个加强版的 MySQL 替代品
- WebScaleSQL - WebScaleSQL,5.6 版本,基于 MySQL 5.6 社区版本。
备份
_备份/存储/恢复 工具_
- MyDumper - 逻辑的,并行的 MySQL 备份/转储工具。
- MySQLDumper - 基于 web 的开源备份工具-对于共享虚拟主机非常有用。
- mysqldump-secure - 将加密,压缩,日志,黑名单和 Nagios 监控一体化的 mysqldump 安全脚本。
- Percona Xtrabackup - 针对 MySQL 的一个开源热备份实用程序——在服务器的备份期间不会锁定你的数据库。
官方资料
_官方的一些网站和文章_
- MySQL官网:http://www.mysql.com/
- MySQL开发者主页:http://dev.mysql.com/
- MySQL社区:http://www.mysqlpub.com/
- What is MySQL?
- 密码验证插件
优秀文章
_一些优秀的文章_
- MySQL索引背后的数据结构及算法原理
- MySQL数据库引擎
- Nodejs连接MySQL数据库
- MySQL优化
- 10分钟让你明白MySQL是如何利用索引的
- 一个MySQL 5.7 分区表性能下降的案例分析
- 一个不可思议的MySQL慢查分析与解决
[OSS Icon]: https://jaywcjlove.github.io/sb/ico/min-oss.svg [Freeware Icon]: https://jaywcjlove.github.io/sb/ico/min-free.svg [hot Icon]: https://jaywcjlove.github.io/sb/ico/min-hot.svg [tuijian Icon]: https://jaywcjlove.github.io/sb/ico/min-tuijian.svg [bibei Icon]: https://jaywcjlove.github.io/sb/ico/min-bibei.svg [red Icon]: https://jaywcjlove.github.io/sb/star/red.svg [star0 Icon]: https://jaywcjlove.github.io/sb/star/red0.svg [star1 Icon]: https://jaywcjlove.github.io/sb/star/red1.svg [star2 Icon]: https://jaywcjlove.github.io/sb/star/red2.svg [star3 Icon]: https://jaywcjlove.github.io/sb/star/red3.svg [star4 Icon]: https://jaywcjlove.github.io/sb/star/red4.svg [star5 Icon]: https://jaywcjlove.github.io/sb/star/red5.svg
minutes MySQL basic entry
21分钟MySQL基础入门 ===
为什么只需要21分钟呢?因为在我们大天朝有句话叫做三七二十一,你可以不管三七二十一开始使用 MySQL 及快速的方式入门 MySQL。其实21分钟把下面语句执行一遍是没有问题的,要理解的话估计不止21分钟,对于初学者来说只需满足自己需求可以增删改查等简易的维护即可。
目录
开始使用
我下面所有的SQL语句是基于MySQL 5.6+运行。
MySQL 为关系型数据库(Relational Database Management System),一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:
表头(header): 每一列的名称;列(col): 具有相同数据类型的数据的集合;行(row): 每一行用来描述某个人/物的具体信息;值(value): 行的具体信息, 每个值必须与该列的数据类型相同;键(key): 表中用来识别某个特定的人\物的方法, 键的值在当前列中具有唯一性。
登录MySQL
mysql -h 127.0.0.1 -u <用户名> -p<密码>. # 默认用户名<root>,-p 是密码,⚠️参数后面不需要空格
mysql -D 所选择的数据库名 -h 主机名 -u 用户名 -p
mysql> exit # 退出 使用 “quit;” 或 “\q;” 一样的效果
mysql> status; # 显示当前mysql的version的各种信息
mysql> select version(); # 显示当前mysql的version信息
mysql> show global variables like 'port'; # 查看MySQL端口号
创建数据库
对于表的操作需要先进入库use 库名;
-- 创建一个名为 samp_db 的数据库,数据库字符编码指定为 gbk
create database samp_db character set gbk;
drop database samp_db; -- 删除 库名为 samp_db 的库
show databases; -- 显示数据库列表。
use samp_db; -- 选择创建的数据库 samp_db
show tables; -- 显示 samp_db 下面所有的表名字
describe 表名; -- 显示数据表的结构
delete from 表名; -- 清空表中记录
创建数据库表
CREATE TABLE 语法语句用于从表中选取数据。 ``sql CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据类型, 列名称3 数据类型, .... );``
-- 如果数据库中存在user_accounts表,就把它从数据库中drop掉
DROP TABLE IF EXISTS `user_accounts`;
CREATE TABLE `user_accounts` (
`id` int(100) unsigned NOT NULL AUTO_INCREMENT primary key,
`password` varchar(32) NOT NULL DEFAULT '' COMMENT '用户密码',
`reset_password` tinyint(32) NOT NULL DEFAULT 0 COMMENT '用户类型:0-不需要重置密码;1-需要重置密码',
`mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机',
`create_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`update_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
-- 创建唯一索引,不允许重复
UNIQUE INDEX idx_user_mobile(`mobile`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8
COMMENT='用户表信息';
数据类型的属性解释
NULL:数据列可包含NULL值;NOT NULL:数据列不允许包含NULL值;DEFAULT:默认值;PRIMARY KEY:主键;AUTO_INCREMENT:自动递增,适用于整数类型;UNSIGNED:是指数值类型只能为正数;CHARACTER SET name:指定一个字符集;COMMENT:对表或者字段说明;
删除数据库表
DROP/TRUNCATE TABLE 语法语句用于删除数据库中的现有表。 ``sql DROP TABLE 表名称; -- 用于删除数据库中的现有表。 TRUNCATE TABLE 表名称; -- 用于删除表内的数据,但不删除表本身。``
-- 删除现有表 Shippers:
DROP TABLE Shippers;
-- 删除现有表 Shippers 表内的数据,不删除表:
TRUNCATE TABLE Shippers;
增删改查
SELECT
SELECT 语法语句用于从表中选取数据。 ``sql SELECT 列名称1, 列名称2, ... FROM 表名称; SELECT * FROM 表名称;``
-- 从 Customers 表中选择 CustomerName 和 City 列:
SELECT CustomerName, City FROM Customers;
-- 从 Customers 表中选择所有列:
SELECT * FROM Customers;
-- 表 station 取个别名叫 s,表 station 中不包含 字段 id=13 或者 14 的,并且 id 不等于 4 的 查询出来,只显示 id
SELECT s.id from station s WHERE id in (13,14) and id not in (4);
-- 从表 users 选取 id=3 的数据,并只拉一条数据(据说能优化性能)
SELECT * FROM users where id=3 limit 1
-- 结果集中会自动去重复数据
SELECT DISTINCT Company FROM Orders
-- 表 Persons 字段 Id_P 等于 Orders 字段 Id_P 的值,
-- 结果集显示 Persons表的 LastName、FirstName字段,Orders表的OrderNo字段
SELECT p.LastName, p.FirstName, o.OrderNo FROM Persons p, Orders o WHERE p.Id_P = o.Id_P
-- gbk 和 utf8 中英文混合排序最简单的办法
-- ci是 case insensitive, 即 “大小写不敏感”
SELECT tag, COUNT(tag) from news GROUP BY tag order by convert(tag using gbk) collate gbk_chinese_ci;
SELECT tag, COUNT(tag) from news GROUP BY tag order by convert(tag using utf8) collate utf8_unicode_ci;
UPDATE
Update 语法语句用于修改表中的数据。 ``sql UPDATE 表名称 SET 列名称1 = 值1, 列名称2 = 值2, ... WHERE 条件;``
-- update语句设置字段值为另一个结果取出来的字段
UPDATE user set name = (SELECT name from user1 WHERE user1 .id = 1 )
WHERE id = (SELECT id from user2 WHERE user2 .name='小苏');
-- 更新表 orders 中 id=1 的那一行数据更新它的 title 字段
UPDATE `orders` set title='这里是标题' WHERE id=1;
INSERT
INSERT 语法用于向表格中插入新的行。 ``sql INSERT INTO 表名称 (列名称1, 列名称2, 列名称3, ...) VALUES (值1, 值2, 值3, ...); INSERT INTO 表名称 VALUES (值1, 值2, 值3, ...);``
-- 向表 Persons 插入一条字段 LastName = JSLite 字段 Address = shanghai
INSERT INTO Persons (LastName, Address) VALUES ('JSLite', 'shanghai');
-- 向表 meeting 插入 字段 a=1 和字段 b=2
INSERT INTO meeting SET a=1,b=2;
--
-- SQL实现将一个表的数据插入到另外一个表的代码
-- 如果只希望导入指定字段,可以用这种方法:
-- INSERT INTO 目标表 (字段1, 字段2, ...) SELECT 字段1, 字段2, ... FROM 来源表;
INSERT INTO orders (user_account_id, title) SELECT m.user_id, m.title FROM meeting m where m.id=1;
-- 向表 charger 插入一条数据,已存在就对表 charger 更新 `type`,`update_at` 字段;
INSERT INTO `charger` (`id`,`type`,`create_at`,`update_at`) VALUES (3,2,'2017-05-18 11:06:17','2017-05-18 11:06:17') ON DUPLICATE KEY UPDATE `id`=VALUES(`id`), `type`=VALUES(`type`), `update_at`=VALUES(`update_at`);
DELETE
DELETE 语法语句用于删除表中的现有记录。 ``sql DELETE FROM 表名称 WHERE 条件;``
-- 在不删除table_name表的情况下删除所有的行,清空表。
DELETE FROM table_name
-- 或者
DELETE * FROM table_name
-- 删除 Person 表字段 LastName = 'JSLite'
DELETE FROM Person WHERE LastName = 'JSLite'
-- 删除 表meeting id 为2和3的两条数据
DELETE from meeting where id in (2,3);
WHERE
WHERE 语法用于仅提取满足指定条件的记录 ``sql SELECT 列名称, 列名称, ... FROM 表名称 WHERE 条件1;``
-- 从表 Persons 中选出 Year 字段大于 1965 的数据
SELECT * FROM Persons WHERE Year>1965
-- 从 Customers 表中选择 Country = Mexico 的所有数据:
SELECT * FROM Customers WHERE Country='Mexico';
-- 从 Customers 表中选择 CustomerID = 1 的所有数据:
SELECT * FROM Customers WHERE CustomerID=1;
AND, OR 和 NOT
WHERE 子句可以与 AND、OR 和 NOT 运算符组合使用。
AND 和 OR 运算符用于根据多个条件过滤记录:
- 如果由
AND分隔的所有条件都为TRUE,则AND运算符将显示一条记录。 - 如果由
OR分隔的任何条件为TRUE,则OR运算符将显示一条记录。
如果条件不为真,NOT 运算符将显示一条记录。
AND
AND 语法``sql SELECT 列名称, 列名称, ... FROM 表名称 WHERE 条件1 AND 条件2 AND 条件3 ...;``
-- 删除 meeting 表字段
-- id=2 并且 user_id=5 的数据 和
-- id=3 并且 user_id=6 的数据
DELETE from meeting where id in (2,3) and user_id in (5,6);
-- 使用 AND 来显示所有姓为 "Carter" 并且名为 "Thomas" 的人:
SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter';
OR
OR 语法``sql SELECT 列名称1, 列名称2, ... FROM 表名称 WHERE 条件1 OR 条件2 OR 条件3 ...;``
-- 使用 OR 来显示所有姓为 "Carter" 或者名为 "Thomas" 的人:
SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter'
NOT
NOT 语法``sql SELECT 列名称1, 列名称2, ... FROM 表名称 WHERE NOT 条件2;``
-- 从 Customers 表中选择 Country 不是 Germany 的所有字段:
SELECT * FROM Customers WHERE NOT Country='Germany';
AND & OR & NOT
-- 从 Customers 表中选择所有字段,其中 Country 为 Germany 且城市必须为 Berlin 或 München(使用括号构成复杂表达式):
SELECT * FROM Customers WHERE Country='Germany' AND (City='Berlin' OR City='München');
-- 从 Customers 表中选择 Country 不是 Germany 和 NOT "USA" 的所有字段:
SELECT * FROM Customers WHERE NOT Country='Germany' AND NOT Country='USA';
ORDER BY
ORDER BY 语法用于按升序或降序对结果集进行排序。 ``sql SELECT 列名称1, 列名称2, ... FROM 表名称 ORDER BY 列名称1, 列名称2, ... ASC|DESC;`默认按ASC升序对记录进行排序。要按降序对记录进行排序,请使用DESC` 关键字。
-- 从 Customers 表中选择所有字段,按 Country 列排序:
SELECT * FROM Customers ORDER BY Country;
-- 从 Orders 表中选择 Company, OrderNumber 字段,按 Company 列排序:
SELECT Company, OrderNumber FROM Orders ORDER BY Company
-- 从 Orders 表中选择 Company, OrderNumber 字段,按 Company 列降序排序:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
-- 从 Orders 表中选择 Company, OrderNumber 字段,按 Company 列降序排序,并 OrderNumber 以顺序显示:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
GROUP BY
GROUP BY 语法将具有相同值的行分组到汇总行中 ``sql SELECT 列名称(s) FROM 表名称 WHERE 条件 GROUP BY 列名称(s) ORDER BY 列名称(s);``
-- 列出了 Orders 每个发货人 Shippers 发送的订单 Orders 数量
SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders
LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
GROUP BY ShipperName;
IN
IN 语法运算符允许您在 WHERE 子句中指定多个值。运算符是多个 OR 条件的简写。 ``sql SELECT 列名称(s) FROM 表名称 WHERE 列名称 IN (值1, 值2, ...); SELECT 列名称(s) FROM 表名称 WHERE 列名称 IN (SELECT STATEMENT);``
-- 从表 Persons 选取 字段 LastName 等于 Adams、Carter
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')
-- 从表 Customers 选取 Country 值为 'Germany', 'France', 'UK' 的所有数据
SELECT * FROM Customers WHERE Country IN ('Germany', 'France', 'UK');
-- 从表 Customers 选取 Country 值不为 'Germany', 'France', 'UK' 的所有数据
SELECT * FROM Customers WHERE Country NOT IN ('Germany', 'France', 'UK');
-- 从表 Customers 选取与 Suppliers 表 Country 字段相同的所有数据:
SELECT * FROM Customers WHERE Country IN (SELECT Country FROM Suppliers);
UNION
UNION 语法操作符用于合并两个或多个 SELECT 语句的结果集 ``sql SELECT 列名称(s) FROM 表名称1 UNION SELECT 列名称(s) FROM 表名称2;``
-- 列出所有在中国表(Employees_China)和美国(Employees_USA)的不同的雇员名
SELECT E_Name FROM Employees_China UNION SELECT E_Name FROM Employees_USA
-- 列出 meeting 表中的 pic_url,
-- station 表中的 number_station 别名设置成 pic_url 避免字段不一样报错
-- 按更新时间排序
SELECT id,pic_url FROM meeting UNION ALL SELECT id,number_station AS pic_url FROM station ORDER BY update_at;
-- 通过 UNION 语法同时查询了 products 表 和 comments 表的总记录数,并且按照 count 排序
SELECT 'product' AS type, count(*) as count FROM `products` union select 'comment' as type, count(*) as count FROM `comments` order by count;
BETWEEN
BETWEEN 语法运算符选择给定范围内的值 ``sql SELECT 列名称(s) FROM 表名称 WHERE 列名称 BETWEEN 值1 AND 值2;``
-- 选择 Products 表中 Price 字段在 10 到 20 之间的所有:
SELECT * FROM Products WHERE Price BETWEEN 10 AND 20;
AS
AS 语法用于为表或表中的列(字段)提供临时名称(别名)。 ``sql SELECT 列名称 AS 别名 FROM 表名称; SELECT 列名称(s) FROM 表名称 AS 别名;``
-- 创建两个别名,一个用于 CustomerID 的 ID 别名列,一个用于 CustomerName 的 Customer 别名列:
SELECT CustomerID AS ID, CustomerName AS Customer FROM Customers;
-- 这句意思是查找所有 Employee 表里面的数据,并把 Employee 表格命名为 emp。
-- 当你命名一个表之后,你可以在下面用 emp 代替 Employee.
-- 例如 SELECT * FROM emp.
SELECT * FROM Employee AS emp
-- 列出表 Orders 字段 OrderPrice 列最大值,
-- 结果集列不显示 OrderPrice 显示 LargestOrderPrice
SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders
-- 显示表 users_profile 中的 name 列
SELECT t.name from (SELECT * from users_profile a) AS t;
-- 表 user_accounts 命名别名 ua,表 users_profile 命名别名 up
-- 满足条件 表 user_accounts 字段 id 等于 表 users_profile 字段 user_id
-- 结果集只显示mobile、name两列
SELECT ua.mobile,up.name FROM user_accounts as ua INNER JOIN users_profile as up ON ua.id = up.user_id;
JOIN
JOIN 子句用于根据两个或多个表之间的相关列组合来自两个或多个表的行。
JOIN: 如果表中有至少一个匹配,则返回行INNER JOIN:在表中存在至少一个匹配时,INNER JOIN 关键字返回行。LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行FULL JOIN: 只要其中一个表中存在匹配,就返回行(MySQL 是不支持的,通过LEFT JOIN + UNION + RIGHT JOIN的方式 来实现)
INNER JOIN
INNER JOIN 语法选择在两个表中具有匹配值的记录。 ``sql SELECT 列名称(s) FROM 表1 INNER JOIN 表2 ON 表1.列名称 = 表2.列名称;``
-- 选择包含 Customers 的所有 Orders:
SELECT Orders.OrderID, Customers.CustomerName FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
-- [JOIN 三张表] 选择包含 Customers 和 Shippers 的所有 Orders:
SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName
FROM ((Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)
INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);
LEFT JOIN
LEFT JOIN 语法返回左表 (表1) 中的所有记录,以及右表 (表2) 中的匹配记录 ``sql SELECT 列名称(s) FROM 表1 LEFT JOIN 表2 ON 表1.列名称 = 表2.列名称;``
-- 将选择所有 Customers 以及他们可能拥有的任何 Orders:
SELECT Customers.CustomerName, Orders.OrderID FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName;
RIGHT JOIN
RIGHT JOIN 语法返回右表 (表2) 中的所有记录,以及左表 (表1) 中的匹配记录 ``sql SELECT 列名称(s) FROM 表1 RIGHT JOIN 表2 ON 表1.列名称 = 表2.列名称;``
-- 返回所有 Employees 以及他们可能下的任何 Orders:
SELECT Orders.OrderID, Employees.LastName, Employees.FirstName FROM Orders
RIGHT JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
ORDER BY Orders.OrderID;
FULL OUTER JOIN
FULL OUTER JOIN 语法当左(表1)或右(表2)表记录中存在匹配时,关键字返回所有记录 ``sql SELECT 列名称(s) FROM 表1 FULL OUTER JOIN 表2 ON 表1.列名称 = 表2.列名称 WHERE 条件;``
SQL 函数
COUNT
COUNT 语法返回与指定条件匹配的行数 ``sql SELECT COUNT(列名称) FROM 表名称 WHERE 条件;``
-- 表 Store_Information 有几笔 store_name 栏不是空白的资料。
-- "IS NOT NULL" 是 "这个栏位不是空白" 的意思。
SELECT COUNT (Store_Name) FROM Store_Information WHERE Store_Name IS NOT NULL;
-- 获取 Persons 表的总数
SELECT COUNT(1) AS totals FROM Persons;
-- 获取表 station 字段 user_id 相同的总数
select user_id, count(*) as totals from station group by user_id;
AVG
AVG 语法返回数值列的平均值 ``sql SELECT AVG(列名称) FROM 表名称 WHERE 条件;``
-- 查找 Products 表中所的 Price 平均值:
SELECT AVG(Price) FROM Products;
SUM
SUM 语法返回数值列的总和 ``sql SELECT SUM(列名称) FROM 表名称 WHERE 条件;``
-- 查找 OrderDetails 表中 Quantity 字段的总和:
SELECT SUM(Quantity) FROM OrderDetails;
MAX
MAX 语法返回所选列的最大值 ``sql SELECT MIN(列名称) FROM 表名称 WHERE 条件;``
-- 列出表 Orders 字段 OrderPrice 列最大值,
-- 结果集列不显示 OrderPrice 显示 LargestOrderPrice
SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders
MIN
MIN 语法返回所选列的最小值 ``sql SELECT MIN(列名称) FROM 表名称 WHERE 条件;``
-- 查找 Products 表中 Price 字段最小值,并命名 SmallestPrice 别名:
SELECT MIN(Price) AS SmallestPrice FROM Products;
触发器
语法:
``sql
create trigger <触发器名称>
{ before | after} -- 之前或者之后出发
insert | update | delete -- 指明了激活触发程序的语句的类型
on <表名> -- 操作哪张表
for each row -- 触发器的执行间隔,for each row 通知触发器每隔一行执行一次动作,而不是对整个表执行一次。
<触发器SQL语句>
``
delimiter $
CREATE TRIGGER set_userdate BEFORE INSERT
on `message`
for EACH ROW
BEGIN
set @statu = new.status; -- 声明复制变量 statu
if @statu = 0 then -- 判断 statu 是否等于 0
UPDATE `user_accounts` SET status=1 WHERE openid=NEW.openid;
end if;
END
$
DELIMITER ; -- 恢复结束符号
OLD和NEW不区分大小写
- NEW 用NEW.col_name,没有旧行。在DELETE触发程序中,仅能使用OLD.col_name,没有新行。
- OLD 用OLD.col_name来引用更新前的某一行的列
添加索引
普通索引(INDEX)
语法:ALTER TABLE表名字ADD INDEX 索引名字 (字段名字)
-- –直接创建索引
CREATE INDEX index_user ON user(title)
-- –修改表结构的方式添加索引
ALTER TABLE table_name ADD INDEX index_name ON (column(length))
-- 给 user 表中的 name 字段 添加普通索引(INDEX)
ALTER TABLE `user` ADD INDEX index_name (name)
-- –创建表的时候同时创建索引
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`time` int(10) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
INDEX index_name (title(length))
)
-- –删除索引
DROP INDEX index_name ON table
主键索引(PRIMARY key)
语法:ALTER TABLE表名字ADD PRIMARY KEY (字段名字)
-- 给 user 表中的 id字段 添加主键索引(PRIMARY key)
ALTER TABLE `user` ADD PRIMARY key (id);
唯一索引(UNIQUE)
语法:ALTER TABLE表名字ADD UNIQUE (字段名字)
-- 给 user 表中的 creattime 字段添加唯一索引(UNIQUE)
ALTER TABLE `user` ADD UNIQUE (creattime);
全文索引(FULLTEXT)
语法:ALTER TABLE表名字ADD FULLTEXT (字段名字)
-- 给 user 表中的 description 字段添加全文索引(FULLTEXT)
ALTER TABLE `user` ADD FULLTEXT (description);
添加多列索引
语法:
ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3)
-- 给 user 表中的 name、city、age 字段添加名字为name_city_age的普通索引(INDEX)
ALTER TABLE user ADD INDEX name_city_age (name(10),city,age);
建立索引的时机
在WHERE和JOIN中出现的列需要建立索引,但也不完全如此:
- MySQL只对
<,<=,=,>,>=,BETWEEN,IN使用索引 - 某些时候的
LIKE也会使用索引。 - 在
LIKE以通配符%和_开头作查询时,MySQL不会使用索引。
-- 此时就需要对city和age建立索引,
-- 由于mytable表的userame也出现在了JOIN子句中,也有对它建立索引的必要。
SELECT t.Name
FROM mytable t LEFT JOIN mytable m ON t.Name=m.username
WHERE m.age=20 AND m.city='上海';
SELECT * FROM mytable WHERE username like'admin%'; -- 而下句就不会使用:
SELECT * FROM mytable WHERE Name like'%admin'; -- 因此,在使用LIKE时应注意以上的区别。
索引的注意事项
- 索引不会包含有NULL值的列
- 使用短索引
- 不要在列上进行运算 索引会失效
创建后表的修改
添加列
语法:alter table 表名 add 列名 列数据类型 [after 插入位置];
示例:
-- 在表students的最后追加列 address:
alter table students add address char(60);
-- 在名为 age 的列后插入列 birthday:
alter table students add birthday date after age;
-- 在名为 number_people 的列后插入列 weeks:
alter table students add column `weeks` varchar(5) not null default "" after `number_people`;
修改列
语法:alter table 表名 change 列名称 列新名称 新数据类型;
-- 将表 tel 列改名为 telphone:
alter table students change tel telphone char(13) default "-";
-- 将 name 列的数据类型改为 char(16):
alter table students change name name char(16) not null;
-- 修改 COMMENT 前面必须得有类型属性
alter table students change name name char(16) COMMENT '这里是名字';
-- 修改列属性的时候 建议使用modify,不需要重建表
-- change用于修改列名字,这个需要重建表
alter table meeting modify `weeks` varchar(20) NOT NULL DEFAULT '' COMMENT '开放日期 周一到周日:0~6,间隔用英文逗号隔开';
-- `user`表的`id`列,修改成字符串类型长度50,不能为空,`FIRST`放在第一列的位置
alter table `user` modify COLUMN `id` varchar(50) NOT NULL FIRST ;
删除列
语法:alter table 表名 drop 列名称;
-- 删除表students中的 birthday 列:
alter table students drop birthday;
重命名表
语法:alter table 表名 rename 新表名;
-- 重命名 students 表为 workmates:
alter table students rename workmates;
清空表数据
方法一:delete from 表名;方法二:truncate table "表名";
DELETE:1. DML语言;2. 可以回退;3. 可以有条件的删除;TRUNCATE:1. DDL语言;2. 无法回退;3. 默认所有的表内容都删除;4. 删除速度比delete快。
-- 清空表为 workmates 里面的数据,不删除表。
delete from workmates;
-- 删除workmates表中的所有数据,且无法恢复
truncate table workmates;
删除整张表
语法:drop table 表名;
-- 删除 workmates 表:
drop table workmates;
删除整个数据库
语法:drop database 数据库名;
-- 删除 samp_db 数据库:
drop database samp_db;
其它实例
SQL删除重复记录
-- 查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
-- 删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
delete from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)
-- 查找表中多余的重复记录(多个字段)
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
-- 删除表中多余的重复记录(多个字段),只留有rowid最小的记录
delete from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
-- 查找表中多余的重复记录(多个字段),不包含rowid最小的记录
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
参考手册
1
数据库基础 ===
数据库(Database,DB)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库。
简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、截取、更新、删除等操作。数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。
什么是数据库
人们通常用数据库这个术语来代表他们使用的数据库软件。这是不正确的,它是引起混淆的根源。确切地说,数据库软件应称为DBMS(数据库管理系统)。数据库是通过DBMS创建和操纵的容器。数据库可以是保存在硬设备上的文件,但也可以不是。在很大程度上说,数据库究竟是文件还是别的什么东西并不重要,因为你并不直接访问数据库;你使用的是DBMS,它替你访问数据库。
数据库指的是以一定方式储存在一起、能为多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。简单来说可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。
RDBMS即关系数据库管理系统(Relational Database Management System)的特点:
- 数据以表格的形式出现
- 每行为各种记录名称
- 每列为记录名称所对应的数据域
- 许多的行和列组成一张表单
- 若干的表单组成database
数据库分类
数据库的分类可多了去了,在维基百科上面有下面这些数据库,并粗略的分了个类别。一看这里面的学问大了去了,还是先搬一些代表性的吧,长长见识,要深入了解各种概念推荐看《数据库系统概论》。
关系数据库
_(英语:Relational database),是创建在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。关系模型是由埃德加·科德于1970年首先提出的,并配合“科德十二定律”。现如今虽然对此模型有一些批评意见,但它还是数据存储的传统标准。标准数据查询语言SQL就是一种基于关系数据库的语言,这种语言执行对关系数据库中数据的检索和操作。_
- MySQL
- MariaDB(MySQL的代替品,英文维基百科从MySQL转向MariaDB)
- Percona Server(MySQL的代替品)
- PostgreSQL
- Microsoft Access
- Google Fusion Tables
- SQL Server
- FileMaker
- Oracle
- Sybase
- dBASE
- Clipper
- FoxPro
几乎所有的数据库管理系统都配备了一个开放式数据库连接(ODBC)驱动程序,令各个数据库之间得以互相集成。
非关系型数据库(NoSQL)
_NoSQL一词最早出现于1998年,是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。当代典型的关系数据库在一些数据敏感的应用中表现了糟糕的性能,例如为巨量文档创建索引、高流量网站的网页服务,以及发送流式媒体。关系型数据库的典型实现主要被调整用于执行规模小而读写频繁,或者大批量极少写访问的事务。_
Key/value最终一致性存储
- Apache Cassandra(为Facebook所使用):高度可扩展
- Dynamo
- Hibari
- Project Voldemort
- Riak
Key/value硬盘存储
- LevelDB(Google)
- BigTable
- MemcacheDB
- Tokyo Cabinet
- Tuple space
- TreapDB
Key/value RAM存储
- Oracle Coherence
- memcached
- Citrusleaf database
- Velocity
- Redis
- Tuple space
Key/value基于Paxos算法的存储
- Keyspace
数据库模型
数据库模型描述了在数据库中结构化和操纵数据的方法,模型的结构部分规定了数据如何被描述(例如树、表等)。数据库模型的分类如下:
- 对象模型
- 层次模型(轻量级数据访问协议)
- 网状模型(大型数据储存)
- 关系模型
- 面向对象模型
- 半结构化模型
- 平面模型(表格模型,一般在形式上是一个二维数组。如表格模型数据Excel)
架构
_数据库的架构可以大致区分为三个概括层次:内层、概念层和外层。_
- 内层:最接近实际存储体,亦即有关数据的实际存储方式。
- 外层:最接近用户,即有关个别用户观看数据的方式。
- 概念层:介于两者之间的间接层。
数据库索引
数据索引的观念由来已久,像是一本书前面几页都有目录,目录也算是索引的一种,只是它的分类较广,例如车牌、身份证字号、条码等,都是一个索引的号码,当我们看到号码时,可以从号码中看出其中的端倪,若是要找的人、车或物品,也只要提供相关的号码,即可迅速查到正确的人事物。
数据库操作:事务
事务(transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分区的工作单位。
数据表
关系数据库没有数据表,关键字、主键、索引等也就无从谈起,数据表是关系数据库中一个非常重要的对象,是其它对象的基础,也是一系列二维数组的集合,用来存储、操作数据的逻辑结构。根据信息的分类情况。一个数据库中可能包含若干个数据表,每张表是由行和列组成,记录一条数据数据表就增加一行,每一列是由字段名和字段数据集合组成,列被称之为字段,每一列还有自己的多个属性,例如是否允许为空、默认值、长度、类型、存储编码、注释等

数据类型
在定义数据字段的类型对你的数据库的优化非常重要,数据类型决定了数据在计算机中的存储格式,代表不同的信息类型,大致可以分为:数值、日期/时间和字符串(字符)类型,字符串类型又包括二进制类型。
上图中每一列就是一个字段,每个字段都有自己的类型,例如name列为字符串类型,level 列为数字类型。
关系键
_关系键是关系数据库的重要组成部分。关系键是一个表中的一个或几个属性,用来标识该表的每一行或与另一个表产生联系。一列(或一组列),其值能够唯一区分表中每个行。_
主键
主键(primary key或unique key),又称主码,数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。unique 可空,可以在一个表里的一个或多个字段定义;primary key 不可空不可重复,在一个表里可以定义联合主键;unique索引和primary索引区别:
- primary key = unique + not null
- 唯一约束和主键一样都是约束的范畴,而且都可以作为外键的参考,不同的是,一张表只能有一个主键
- 主键和唯一约束的创建需要依靠索引,如果在创建主键或唯一约束的时候没有已经建好的索引可以使用的话,Oracle会自动建立一个唯一的索引。
表中的任何列都可以作为主键,只要它满足以下条件:
- unique 就是唯一,当你需要限定你的某个表字段每个值都唯一,没有重复值时使用。
- 任意两行都不具有相同的主键值;
- 每个行都必须具有一个主键值(主键列不允许NULL值)。
除MySQL强制实施的规则外,应该坚持的几个普遍认可的最好习惯为:
- 不更新主键列中的值;
- 不重用主键列的值;
- 不在主键列中使用可能会更改的值。(例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其名字时,必须更改这个主键。)
超键
超键(superkey),有的文献称“超码”,是在数据库关系模式设计中能够唯一标示多元组(即“行”)的属性集。包含所有属性的集叫做明显(平凡)超键。
超键指的是可以唯一标识一条记录的属性集合,不一定是最小的。超键的属性集合可能还包括其他属性,但是其中必须包含唯一标识记录的属性集合。例如,一个学生信息表中,学号和班级可以作为超键,因为这两个属性集合可以唯一标识一条学生记录,但是其中班级属性可以不包括,仍然是超键。
候选键
在关系模型中,候选键或候选码(candidate key)是某个关系变量的一组属性所组成的集合,它需要同时满足下列两个条件:
- 这个属性集合始终能够确保在关系中能唯一标识元组
- 在这个属性集合中找不出真子集能够满足条件
满足第一个条件的属性集合称为超键,因此我们也可以把候选键定义为“最小超键”,也就是不含有多余属性的超键。
候选键指的是可以唯一标识一条记录的最小属性集合(最小超键),即在该关系中,候选键的属性集合不可再被减少,否则将无法保证唯一标识一条记录。例如,一个学生信息表中,可以将学号作为候选键,因为学号可以唯一标识一条学生记录。
候选键的重要性是它们能够在关系中唯一标识出不同的元组,因此超键也是在设计数据库模式时需要指定的最重要的约束之一。由于在关系模型中,每个关系都是一个集合(没有重复的元素),所以每个关系都至少有一个候选键(因为所有属性组合必然是个超键)。但是在某些关系型数据库中表也能代表多重集,所以在每个关系中都显式地定义至少一个候选键是一条很重要的设计原则。数据库管理系统通常都需要将每个关系中的某个候选键定义为主键,亦即这个候选键是区分不同元组时首选的识别方式,例如外键通常就是引用主键而非其他候选键。
外键
外键(foreign key,台湾译作外来键),又称外部键。其实在关系数据库中,每个数据表都是由关系来连系彼此的关系,父数据表(Parent Entity)的主键(primary key)会放在另一个数据表,当做属性以创建彼此的关系,而这个属性就是外键。
比如,学生跟老师之间是教学的关系,学生数据表会有个属性叫指导老师(FK),而这个值就是对应到老师数据表的老师代号(PK),学生的指导老师就是外键。
代理键
在关系型数据库设计中,代理键是在当数据表中的候选键都不适合当主键时,例如数据太长,或是意义层面太多,就会请一个无意义的但唯一的字段来代为作主键。
代理键是:
- Surrogate (1) – Hall, Owlett and Codd (1976)
一个代理键值确定了外部世界的一个实体。代理键值是数据库生成的,从来不显示给用户或应用程序看。
- Surrogate (2) – Wieringa and De Jonge (1991)
一个代理键值确定了数据库中的一个对象。代理键值是数据库生成的,用户或应用程序看不到它。
在实践中,代理键值通常是个自动递增的数字。在Sybase或SQL Server,用identity column标识代理键,PostgreSQL里用serial,Oracle里用SEQUENCE,在MySQL里用一个标记有AUTO_INCREMENT的字段。
自然键
自然键与代理键相反,它是在自然生活中唯一确定一个事物的标识。身份证号就是一个自然键,用于确定一个人。
2
数据库技术构成 ===
数据库技术的出现是为了更加有效的管理和存取大量的数据资源。简单的来讲,数据库技术主要包括数据库系统,SQL语言,数据库访问技术。
数据库系统
数据库系统有3个主要的组成部分。
数据库
_数据库(Database System):用于存储数据的地方。_
数据库管理系统
_数据库管理系统(Database Management System,DBMS):用户管理数据库的软件。_
数据库应用程序
_数据库应用程序(Database Application):为了提高数据库系统的处理能力所使用的管理数据库的软件补充。_
SQL语言
SQL,(Structured Query Language)即结构化查询语言,数据库管理系统专门通过SQL语言来管理数据库中的数据,与数据库通信。
SQL的优点:
- SQL不是某个特定数据库供应商专有的语言。几乎所有重要的DBMS都支持SQL,所以,学习此语言使你几乎能与所有数据库打交道。
- SQL简单易学。它的语句全都是由描述性很强的英语单词组成,而且这些单词的数目不多。
- SQL尽管看上去很简单,但它实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。
DBMS专用的SQL:SQL不是一种专利语言,而且存在一个标准委员会,他们试图定义可供所有DBMS使用的SQL语法,但事实上任意两个DBMS实现的SQL都不完全相同。本书讲授的SQL是专门针对MySQL的,虽然书中所讲授的多数语法也适用于其他DBMS,但不要认为这些SQL语法是完全可移植的。
SQL为数据库管理系统提供的功能
SQL语言是一种数据库查询和程序设计语言,其主要用于存取数据、查询数据、更新数据和管理数据库系统。具体的,SQL分为4个部分,这里只是大概整理一下,详细的后面我会在SQL相关中仔细整理。
- 数据定义语言(Data Definition Language,DDL):DROP、CREATE、ALTER等语句;数据库定义语言。主要用于定义数据库、表、视图、索引和触发器等。CREATE语句主要用于创建数据库、创建表、创建视图。ALTER语句主要用于修改表的定义,修改视图的定义。DROP语句主要用于删除数据库、删除表和删除视图等。
- 数据操作语言(Data Manipulation Language,DML):INSERT、UPDATE、DELETE语句;数据库操作语言。主要用于插入数据,更新数据,删除数据。INSERT语句用于插入数据,UPDATE语句用于更新数据,DELETE语句用于删除数据。
- 数据查询语言(Data Query Language,DQL):SELECT语句。主要用于查询数据。
- 数据控制语言(Data Control Language,DCL):数据库控制语言。主要用于控制用户的访问权限。其中GRANT语句用于给用户增加权限,REVOKE语句用于收回用户的权限。
数据库管理系统通过这些SQL语句可以操作数据库中的数据,在应用程序中,也可以通过SQL语句来操作数据。来几个 SQL 语句的例子,这条语句声明创建一个叫 user 的表:
CREATE TABLE `user` (
`id` int(100) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL DEFAULT '' COMMENT '姓名',
`sex` tinyint(32) NOT NULL DEFAULT 0 COMMENT '性别:0,保密;1,男;2,女',
`mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机',
PRIMARY KEY (`id`)
);
这张表包含 4 个字段,分别为 id、name、sex、mobile,其中 id 定义为表的主键,并且只能为正数的自增长字段。并且字段 sex 有默认值 0,每个 COMMENT 后面均为字段注释。
表定义好了,我们可以向这张表插入数据,下面这条语句是在 user 表中插入一条数据记录:
INSERT INTO `user` SET name="张三",sex=1,mobile=13811772277;
INSERT INTO `user` VALUES (18,'王小二',0,12322224);
上面两条语句执行完之后,user 表中就会相对应增加一行新记录,第一条该记录中 id 是自增长的,部分字段有初始默认值,所以只需插入部分值也是可以插入成功的。第二条是必须按顺序填写对应的值,表中的id 字段比较特殊,所以插入 id 值的时候必须比表中最后一条数据的 id 值大,否则会报错。
插入数据之后我们再使用 SELECT 查询语句获取刚才插入的数据,如下:
mysql> SELECT * FROM `user`;
-- +----+-----------+-----+-------------+
-- | id | name | sex | mobile |
-- +----+-----------+-----+-------------+
-- | 1 | 张三 | 1 | 13811772277 |
-- | 19 | 王小二 | 0 | 12322224 |
-- +----+-----------+-----+-------------+
上面几条 SQL 语句的例子,大家看了之后会有一个印象,知道 SQL 语句语法是什么样子,后面有大量的 SQL 语句知识帮助你学习 SQL 语法,玩好 MySQL。
数据库访问技术
这个数据库访问技术 小弟认为这个是一个学术性的研究词汇,我在维基百科各种百科对这个词汇要么没有,要么就一句话解释,不知道谁想出的这个词汇,在下甚是佩服,初步了解到这个是个什么技术呢?
不同的程序设计语言会有各自不同的数据库访问方法,这个访问方法称之为一种技术,程序语言通过这些技术,执行 SQL 语句,进行数据库的管理。下面搜集了一些主要的数据库访问技术
ODBC
Open Database Connectivity(ODBC,开放数据库互连),提供了一种标准的API(应用程序编程接口)方法来访问数据库管理系统(DBMS)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。ODBC的设计者们努力使它具有最大的独立性和开放性:与具体的编程语言无关,与具体的数据库系统无关,与具体的操作系统无关。
ADO
微软公司的 ActiveX Data Objects(ADO)是一个用于访问数据源的COM组件,作为高层的编程界面层。ADO是在OLE DB之上,包含了很多层次化的COM对象与集合(Collections,也是一类对象,在其里面包含了其他层级对象)。允许开发人员编写访问数据的代码而不用关心数据源是如何实现与访问驱动的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象(Command)来执行。
MDAC
Microsoft Data Access Components(MDAC)是微软专门为数据访问功能而发展的应用程序开发接口,做为微软的统一化数据访问(Universal Data Access; UDA)解决方案的核心组成,最初的版本在1996年8月发表。目前其组成组件有ODBC,OLE DB以及ADO,其中ADO是在Visual Basic上唯一的数据访问管道,而OLE DB则是基于COM之上,供C/C++访问与提供数据的接口,ODBC则是统一化的数据访问API。
JDBC
Java Database Connectivity(JDBC,Java数据库连接)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。JDBC是面向关系型数据库的。
3
什么是MySQL ===
MySQL(官方发音为英语发音:/maɪ ˌɛskjuːˈɛl/ My S-Q-L,但也经常读作英语发音:/maɪ ˈsiːkwəl/ My Sequel)原本是一个开放源代码的关系数据库管理系统(DBMS),原开发者为瑞典的MySQL AB公司,该公司于2008年被昇阳微系统(Sun Microsystems)收购。2009年,甲骨文公司(Oracle)收购昇阳微系统公司,MySQL成为Oracle旗下产品。在本教程中,会让大家快速掌握MySQL的基本知识,并轻松使用MySQL数据库。
MySQL 介绍
MySQL在过去由于性能高、成本低、可靠性好,已经成为最流行的开源数据库,因此被广泛地应用在Internet上的中小型网站中,是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。随着MySQL的不断成熟,它也逐渐用于更多大规模网站和应用,比如维基百科、Google和Facebook等网站。
但被甲骨文公司收购后,Oracle大幅调涨MySQL商业版的售价,且甲骨文公司不再支持另一个自由软件项目OpenSolaris的发展,因此导致自由软件社区们对于Oracle是否还会持续支持MySQL社区版(MySQL之中唯一的免费版本)有所隐忧,因此原先一些使用MySQL的开源软件逐渐转向其它的数据库。例如维基百科已于2013年正式宣布将从MySQL迁移到MariaDB数据库。MySQL的创始人麦克尔·维德纽斯以MySQL为基础,成立分支计划MariaDB。
MySQL 发展历史
很多人以为MySQL是最近15年内才出现的数据库,其实MySQL数据库的历史可以追溯到1979年,那时 Bill Gates 退学没多久,微软公司也才刚刚起步,而Larry的Oracle公司也才成立不久。那时有一个天才程序员 Monty Widenius 用 BASIC 设计了一个报表工具,过了不久,又将此工具使用 C 语言重写,移植到 UNIX 平台,当时只是一个底层的面向报表存储引擎名叫Unireg。
- 1985年,瑞典的几位志同道合小伙子(David Axmark、Allan Larsson 和Monty Widenius) 成立了一家公司,这就是MySQL AB 的前身。
- 1990年,TcX公司的客户中开始有人要求为他的API提供SQL支持。当时有人提议直接使用商用数据库,但是Monty觉得商用数据库的速度难以令人满意。于是,他直接借助于mSQL的代码,将它集成到自己的存储引擎中。令人失望的是,效果并不太令人满意,于是,Monty雄心大起,决心自己重写一个SQL支持。
- 1996年,MySQL 1.0发布,它只面向一小拨人,相当于内部发布。
- 1996年10月,MySQL 3.11.1发布(MySQL没有2.x版本),最开始只提供Solaris下的二进制版本。一个月后,Linux版本出现了。
- 1999~2000年,MySQL AB公司在瑞典成立。Monty雇了几个人与Sleepycat合作,开发出了Berkeley DB引擎,因为BDB支持事务处理,所以MySQL从此开始支持事务处理了。
- 2003年12月,MySQL 5.0版本发布,提供了视图、存储过程等功能。
- 2008年1月16日,Sun(太阳微系统)正式收购MySQL。
- 2009年4月20日,甲骨文公司宣布以每股9.50美元,74亿美元的总额收购Sun电脑公司。
- 2010年12月,MySQL 5.5发布,其主要新特性包括半同步的复制及对SIGNAL/RESIGNAL的异常处理功能的支持,最重要的是InnoDB存储引擎终于变为当前MySQL的默认存储引擎。
- 2013年6月18日,甲骨文公司修改MySQL授权协议,移除了GPL。但随后有消息称这是一个bug。
MySQL 版本
MySQL针对不同的用户,分了社区版和企业服务器版,还提供一些其它版本,是属于MySQL相关工具。
- MySQL Community Server 社区版本,开源免费,但不提供官方技术支持。
- MySQL Enterprise Edition 企业版本,需付费,可以试用30天。
- MySQL Cluster 集群版,开源免费。可将几个MySQL Server封装成一个Server。
- MySQL Cluster CGE 高级集群版,需付费。
- MySQL Workbench(GUI TOOL)一款专为MySQL设计的ER/数据库建模工具。
MySQL Workbench是著名的数据库设计工具DBDesigner4的继任者。MySQL Workbench又分为两个版本,分别是社区版(MySQL Workbench OSS)、商用版(MySQL Workbench SE)。
MySQL 版本命命机制由三个数字组成,例如mysql-5.6.33-osx10.11-x86_64.tar.gz
- 第一个数字(5)主版本号:当你做了不兼容的 API 修改,
- 第二个数字(7)次版本号:当你做了向下兼容的功能性新增,合计,主要和次要的数字构成发布系列号。该系列号描述了稳定的特征集。
- 第三个数字(1)修订号:当你做了向下兼容的问题修正。这是一个新的bugfix释放增加。在大多数情况下,在一系列最新版本是最好的选择。
Github 上面有语义化版本标准, 开源仓库mojombo/semver,上面的版本命名大致是跟语义化版本标准差不多,你可以看语义化版本标准来学习版本名机制。通过语义化版本标准来理解MySQL版本命命机制。
MySQL 的优势
- 使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性。
- 支持AIX、BSDi、FreeBSD、HP-UX、Linux、Mac OS、Novell NetWare、NetBSD、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。
- 为多种编程语言提供了API。这些编程语言包括C、C++、C#、VB.NET、Delphi、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl等。
- 支持多线程,充分利用CPU资源,支持多用户。
- 优化的SQL查询算法,有效地提高查询速度。
- 既能够作为一个单独的应用程序在客户端服务器网络环境中运行,也能够作为一个程序库而嵌入到其他的软件中。
- 提供多语言支持,常见的编码如中文的GB 2312、BIG5、日文的Shift JIS等都可以用作数据表名和数据列名。
- 提供TCP/IP、ODBC和JDBC等多种数据库连接途径。
- 提供用于管理、检查、优化数据库操作的管理工具。
- 可以处理拥有上千万条记录的大型数据库。
4
如何学习MySQL ===
如何学习 MySQL 这是一个伪命题,每个人都有适合自己的一套学习方法,各不相同,所以如何学习 MySQL 这个活儿,我没有办法告诉你,我的这个学习方法就是你最好的学习方法,所以在学习 MySQL 数据库之前,需要找准自己学习 MySQL 最舒服的姿势。
我来分享一下我的学习方法,你可以做个参考,只能做个参考,因为我零基础,非计算机专业,没有这方面的使用场景和工作经验(从前是做设计后面转前端再到后端),套路相当深吧。说到这里很多新手兴奋了,因为他在想这孙子比我差呢,我还他妈计算机专业毕业的呢,我学肯定更快入手。恭喜你!您这么想就对了,因为的确如此,我是大约,一天就在项目中应用 MySQL 数据库,并且第二天就做出不错的功能了。
培养兴趣和动力
首先得培养兴趣爱好,不论学什么技术和什么知识点,兴趣是可以极大的提高学习效率和提供持久的战斗力。当然还有一种兴趣是被逼出来的,比如我现在为何使用 MySQL? 我是被项目进度,老板要求,朋友推荐,这才是我使用学习MySQL的兴趣点之一。再比如,写这个书也是有姑娘嫌弃我读书少(其实我估计人家嫌弃我学历,论读书指不定我读书比她多呢,虽然我只喜欢读计算机类别的书,那也是书吧,嘿嘿),刚好赶上我这个学习 MySQL 的机会,我想表现一下,这个是我写此书的动力及兴趣之一。
了解基础知识
我在计算机领域经常被人鄙视,经常有科班出身的人告诉我,“你得学计算机技术,计算机领域的技术非常强调基础,回去大学混两年”,这话你听听就可以了,首先你是个新人,其次,你要搞定多少并发、访问、IO,你现在还没有机会,有的人一辈子没有这个机会应用高级MySQL技术,当然我希望你去争取这样的机会。并不是没有这个机会就不去深入 MySQL 技术应用。如果你想在 MySQL 技术的道路上走的更快、更远,你不光计算机基础要夯实,还要玩儿好 SQL 语句。
利用好工具
我在学习绘画的时候,老师第一天就告诉你要买绘画笔、水粉、纸、画板、支架子,让你有一个正确的绘画姿势。其实就是准备工具,所以学习前不光要安装好环境,还得安装好工具,推荐使用前一章节推荐的命令行工具 MyCli 配合GUI来操作数据,利用这些工具的特点来掌握SQL语句,操控数据。除了这些软件工具之外还要正确、有效地利用搜索引擎这个牛逼,刚开始使用百毒,后面使用谷歌(如果你有翻墙能力可以一开始使用Google),你可通过搜索引起搜到很多相关的知识点。
掌握SQL语句
在学习绘画准备完工具之后,绘画老师就让我们开始对着一本基础的绘画书,临摹基本的笔法各种绘画线条,临摹石膏几何体,这样就能快速的掌握感觉。这个过程其实就是掌握好SQL语句基础,为啥 MySQL 首先要掌握好SQL语句,如果你作为一个程序员,在应用中读取数据都是通过 SQL语句来完成的。如果你是一个数据库管理员(DBA)那就更不用说了,靠GUI来混饭吃,我还头一次听说有这样的DBA,作为DBA你还有帮助检查SQL语句的职责。这样看来,掌握SQL语句义不容辞,也是你使用MySQL走得更远的必经之路啊伙计。
多动手实践操作
我个人最不喜欢“纸上谈兵派”,在我学习后端PHP和Node的时候,动不动就让我看个算法,看个计算机基础,我只是写个应用而已,我肩负出活儿的使命,我的宗旨动手实践操作,对于数据库来说它的操作性特别强,如果你不动手操作,在实际应用过程中很难发现问题。你在实际操作中发现问题,并通过各种方法解决问题,这样才能提高实战应用操作能力。在你实战操作的过程中顺带补充基础知识。
记录笔记
你有了上面快速敏捷的学习能力,你还得附带一个技能,才能更好、更快的入门MySQL数据库。这个技能就是做笔记,做笔记在我这里起到三个作用:第一,避免遗忘知识点。知识点太多,知识点偏冷,不常用也容易忘记,《21分钟入门MySQL》其实就是我做的笔记;第二,知识点分阶段吃透。当你理解的知识点越来越多的时候,还有一些一知半解的知识点,你都需要做一些笔记,记录之后找个时间点好好把这些一知半解的知识点吃透,在每个阶段去看你的笔记你会有一些不同的理解。第三,总结沉淀,当你入门之后总结沉淀很重要,一次总结沉淀很有可能在某个技术上你直接上升一个台阶。
高级进阶
这里是入门,高级进阶暂时没有,😄。
1
Mac平台下安装与配置MySQL ===
Mac 安装MySQL
官网下载安装包,选择相应的版本和格式,有 .dmg 和 tar压缩包两种。我选择了 Mac OS X 10.11 (x86, 64-bit), DMG Archive 的版本下载,目前网站下载需要你注册登录,这个完全免费注册登录进去,就可以下载了。
DMG 文件点开默认安装完成之后(新版需要重启操作系统),就可以在系统偏好设置里面看到 MySQL 的偏好设置面板。

Mac 卸载MySQL
通过下面命令删除干净MySQL,同时在进入 系统偏好设置 里面删除 MySQL 的图标的设置项,点击右键会弹出 移除MySQL偏好设置面板
sudo rm -rf /usr/local/mysql*
sudo rm -rf /Library/StartupItems/MySQLCOM
sudo rm -rf /Library/PreferencePanes/My*
sudo rm -rf /Library/Receipts/mysql*
sudo rm -rf /Library/Receipts/MySQL*
sudo rm -rf /var/db/receipts/com.mysql.*
vi /Library/Receipts/InstallHistory.plist # 进入搜素 mysql , “shif+:” 输入mysql
find / -name mysql -print 2> /dev/null
sudo find / | grep -i mysql
mysql命令不存在
有一个设置开机启动的勾选配置和一个服务启动和停止的按钮,管理MySQL服务。在命令行中就可以使用 MySQL 命令,新版 MySQL 如果没有mysql命令,提示 -bash: mysql: command not found 命令没有找到,你需要检测服务是否启动。
$ mysql -uroot -p
-bash: mysql: command not found
两种方式可以查看到服务是否启动,进入 系统偏好设置 查看服务运行状态。也可通过命令 ps -ef | grep mysql 查看服务是否启动,如果有多条记录输出到命令行面板,说明服务启动了。在服务启动中,MySQL 命令找不到,需要配置环境变量。
编辑 .bash_profile ,如果你命令行安装了 oh-my-zsh 命令行工具,你需配置 .zshrc 。
sudo vim ~/.bash_profile
在 .bash_profile 文件中添加下面文本
export PATH=${PATH}:/usr/local/mysql/bin
让 .bash_profile 配置文件立即生效:
source ~/.bash_profile
2
Centos平台安装与卸载MySQL ===
这里简单的介绍几种Linux平台(Centos)/Mac安装MySQL,基本上大同小异,通过一些平台的软件管理工具来快速安装MySQL。
在 Centos6 中直接使用 yum 命令去安装 mysql,极为简单,接下来介绍在Centos6中 通过 yum工具安装 mysql 的步骤。
检查是否已安装
# 检查 MySQL 是否已安装
yum list installed | grep mysql
yum list installed mysql*
# 查看当前 mysql 版本,看是否已安装
mysql --version
rpm -qa | grep mysql
更新安装源
经过查看你可以开始安装了,直接使用 yum 命令去安装 mysql,按之前可以先看一下源的版本,如果源的版本过低,可以在这里下载开发版新的源,发布吧源在这里更新,在安装的过程可以编辑vim /etc/yum.repos.d/mysql-community.repo选择发布系列版本,编辑如下,其中参数enabled的值为 0 的表示禁用,更改为 1 的时候你就可以默认安装 5.7,否则安装的将是 5.6 版。
# 安装如果上面编辑前没有看到你想要的版本
# 可以更新源
# ===== CentOS6 =====
# wget http://dev.mysql.com/get/mysql57-community-release-el6-8.noarch.rpm
# ===== CentOS7 =====
wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
yum localinstall mysql-community-release-el7-5.noarch.rpm
# 卸载方法
rpm -e mysql-community-common-5.7.16-1.el6.x86_64
检查是否下载成功
[root@localhost yum.repos.d]# yum repolist enabled | grep "mysql.*-community.*"
mysql-connectors-community/x86_64 MySQL Connectors Community 36
mysql-tools-community/x86_64 MySQL Tools Community 47
mysql56-community/x86_64 MySQL 5.6 Community Server 327
查看版本
选择要启用 MySQL 版本查看 MySQL 版本,执行
yum repolist all | grep mysql
可以看到 5.5, 5.7 版本是默认禁用的,因为现在最新的稳定版是 5.6
[root@localhost yum.repos.d]# yum repolist all | grep mysql
mysql-connectors-community/x86_64 MySQL Connectors Community enabled: 36
mysql-connectors-community-source MySQL Connectors Community - So disabled
mysql-tools-community/x86_64 MySQL Tools Community enabled: 47
mysql-tools-community-source MySQL Tools Community - Source disabled
mysql55-community/x86_64 MySQL 5.5 Community Server disabled
mysql55-community-source MySQL 5.5 Community Server - So disabled
mysql56-community/x86_64 MySQL 5.6 Community Server enabled: 327
mysql56-community-source MySQL 5.6 Community Server - So disabled
mysql57-community-dmr/x86_64 MySQL 5.7 Community Server Deve disabled
mysql57-community-dmr-source MySQL 5.7 Community Server Deve disabled
启动指定版本
可以通过类似下面的语句来启动某些版本
yum-config-manager --disable mysql56-community
yum-config-manager --enable mysql57-community-dmr
或者通过修改 /etc/yum.repos.d/mysql-community.repo 文件。
# Note: MySQL 5.7 is currently in development. For use at your own risk.
# Please read with sub pages: https://dev.mysql.com/doc/relnotes/mysql/5.7/en/
[mysql57-community-dmr]
name=MySQL 5.7 Community Server Development Milestone Release
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
其中 enabled=0 是指禁用,enabled=1 指启用。
注意: 任何时候,只能启用一个版本。
查看当前启用的版本
[root@localhost yum.repos.d]# yum repolist enabled | grep mysql
mysql-connectors-community/x86_64 MySQL Connectors Community 36
mysql-tools-community/x86_64 MySQL Tools Community 47
mysql57-community-dmr/x86_64 MySQL 5.7 Community Server Development 187
安装MySQL
yum install mysql-server
Retrieving key from file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
Importing GPG key 0x5072E1F5:
Userid : "MySQL Release Engineering <mysql-build@oss.oracle.com>"
Fingerprint: a4a9 4068 76fc bd3c 4567 70c8 8c71 8d3b 5072 e1f5
Package : mysql-community-release-el7-5.noarch (installed)
From : file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
Is this ok [y/N]: y
## 遇到上述提示,输入 y 继续,执行完成会提示“完毕!”。此时MySQL 安装完成,它包含了 mysql-community-server、mysql-community-client、mysql-community-common、mysql-community-libs 四个包。
......
Installed:
mysql-community-libs.x86_64 0:5.7.18-1.el7 mysql-community-libs-compat.x86_64 0:5.7.18-1.el7 mysql-community-server.x86_64 0:5.7.18-1.el7
Dependency Installed:
mysql-community-client.x86_64 0:5.7.18-1.el7 mysql-community-common.x86_64 0:5.7.18-1.el7 net-tools.x86_64 0:2.0-0.17.20131004git.el7
Replaced:
mariadb-libs.x86_64 1:5.5.44-2.el7.centos
执行
rpm -qi mysql-community-server.x86_64 0:5.6.24-3.el7
查看安装目录
whereis mysql
mysql: /usr/bin/mysql /usr/lib64/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz
可以看到 MySQL 的安装目录是 /usr/bin/
MariaDB切换MySQL
Centos7 上面默认是 MariaDB 不是MySQL了,所以 Centos6 安装会报错。在 Centos7 中,运行下面命令安装就不会有错误了,但是你的数据库被换成了MariaDB,MariaDB登录链接SQL语句等几乎一样。
# 安装 mariadb-server
yum install mariadb-server -y
# 启动 mariadb
systemctl start mariadb.service
systemctl enable mariadb.service
那在 Centos7 中默认安装 MySQL 会报错误,大概是我下面这样样子:
--> 正在处理依赖关系 libmysqlclient.so.18(libmysqlclient_18)(64bit),它被软件包 2:postfix-2.10.1-6.el7.x86_64 需要
---> 软件包 mysql-community-libs.x86_64.0.5.7.16-1.el6 将被 舍弃
--> 解决依赖关系完成
错误:软件包:2:postfix-2.10.1-6.el7.x86_64 (@anaconda)
需要:libmysqlclient.so.18(libmysqlclient_18)(64bit)
正在删除: 1:mariadb-libs-5.5.50-1.el7_2.x86_64 (@updates)
libmysqlclient.so.18(libmysqlclient_18)(64bit)
取代,由: mysql-community-libs-5.7.16-1.el6.x86_64 (mysql57-community)
....
如果你非要用 MySQL 那你先卸载 yum remove mariadb 和 yum remove mysql-libs 重新进行安装 yum install mysql-server 或许可解决 Centos7 安装mysql报上面错误的问题,具体问题还得具体看。
# 卸载 mariadb 和 mysql-libs
yum remove mariadb
yum remove mysql-libs
# 安装mysql
yum install mysql-server
安装发生依赖错误
--> Finished Dependency Resolution
Error: Package: mysql-community-server-5.7.19-1.el6.x86_64 (mysql57-community)
Requires: libsasl2.so.2()(64bit)
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
通过更新来解决
yum update
# 通过提示来解决错误,80%软件不能用,或者部分功能不能用
# 不建议下面方式解决
yum install mysql-server --skip-broken
rpm -Va --nofiles --nodiges
卸载 MySQL 软件
卸载mysql
通过下面这条命令查看本地mysql安装包
# Linux查看
rpm -qa | grep -i mysql
# 输出结果
perl-DBD-MySQL-4.013-3.el6.x86_64
mysql-community-libs-5.6.33-2.el6.x86_64
mysql-community-release-el6-5.noarch
mysql-community-client-5.6.33-2.el6.x86_64
compat-mysql51-5.1.54-1.el6.remi.x86_64
mysql-community-server-5.6.33-2.el6.x86_64
mysql-community-common-5.6.33-2.el6.x86_64
你下面命令将它删除
rpm -e mysql-community-server-5.6.33-2.el6.x86_64
rpm -e compat-mysql51-5.1.54-1.el6.remi.x86_64
删除mysql服务
chkconfig --list | grep -i mysql
chkconfig --del mysql
删除分散mysql文件夹
清空相关mysql的所有目录以及文件,whereis mysql 或者 find / -name mysql 找到所有文件夹。
rm -rf /usr/lib/mysql
rm -rf /usr/share/mysql
rm -rf /usr/my.cnf
3
Docker 安装 MySQL ===
通过 Docker 搭建 MySQL 数据库环境,同时能同时启动多个 MySQL 版本。在安装前,最好上 docker 官网上看一下 MySQL 的版本,更具具体需求版本安装 MySQL,假设你已经搭建好 Docker 环境下面介绍如何创建一个 MySQL 服务器实例。
快速启动一个 MySQL 服务器实例
下面,我们通过通过 docker 镜像,或者 MySQL 官方镜像,进行快速启动一个实例。
# Docker 官方镜像
$ docker image pull library/mysql:8.0.18
# MySQL 官方镜像
$ docker image pull mysql/mysql-server:8.0.18
上面命令中 docker image pull 是抓取 image 镜像的命令。library/mysql:8.0.18 是指定镜像仓库的位置和相对应的 tag 版本。由于 Docker 官方提供的 image 文件,都放在 library 组里面,所以它的是默认组,可以省略。因此,上面的 Docker 命令可以写成下面这样。
# Docker 官方镜像拉取,简写
$ docker image pull mysql:8.0.18
拉取镜像成功以后,就可以在本机看到这个 image 文件了。
$ docker image ls
现在,运行这个 image 文件。
# Docker 官方镜像
$ docker run --name mysqlname \
-p 3308:3306 \
-e MYSQL_ROOT_PASSWORD=my123456 \
-v /etc/localtime:/etc/localtime:ro \
--rm \
-d mysql:8.0.18 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
# MySQL 官方镜像
$ docker run -d --name mysqlname mysql/mysql-server:8.0.18 --character-set-server=utf8mb4 --collation-server=utf8mb4_col
上面命令的各个参数含义如下:
--name mysqlname容器的名字叫做mysqlname-p 3308:3306容器 MySQL 默认端口3306射到本机的3308端口。-d在后台运行容器并打印容器ID。--rm停止运行后,自动删除容器文件。-e MYSQL_ROOT_PASSWORD=my123456设置环境变量MYSQL_ROOT_PASSWORD值为my123456来设置root密码,更多环境变量参考。--character-set-server=utf8mb4 --collation-server=utf8mb4_col该命令以默认字符集utf8mb4和数据库默认排序规则utf8mb4启动MySQL服务,可以将许多配置选项作为标志传递给 mysqld。这将使您可以灵活地自定义容器,而无需cnf配置文件,配置MySQL Server的另一种方法是准备一个配置文件,并将其安装在容器内服务器配置文件的位置。有关详细信息,请参见持久数据和配置更改。-v /etc/localtime:/etc/localtime:ro是让容器的时钟与宿主机时钟同步,避免时区的问题,ro是read only的意思,就是只读。
可以通过 容器id/容器名称 查看 MySQL 日志
$ docker logs mysqlname
通过命令行访问 MySQL 容器
可以通过[容器名字]或者[容器 ID]进入 MySQL 容器
$ docker exec -it mysqlname bash
使用 MySQL 自定义配置文件
MySQL 的默认配置可以在 /etc/mysql/my.cnf 中找到,该目录可以包含附加目录,例如 /etc/mysql/conf.d 或 /etc/mysql/mysql.conf.d。 请检查 MySQL 镜像本身中的相关文件和目录,以获取更多详细信息。
如果 /my/custom/config-file.cnf 是自定义配置文件的路径和名称,则可以像这样启动 MySQL 容器(请注意,此命令仅使用自定义配置文件的目录路径):
$ docker run --name mysqlname \
--rm \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=my123456 \
-v /my/custom:/etc/mysql/conf.d \
-v /etc/localtime:/etc/localtime:ro \
-d mysql:8.0.18 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
上面命令将启动一个新的容器 mysqlname,其中 MySQL 实例使用 /etc/mysql/my.cnf 和 /etc/mysql/conf.d/config-file.cnf 中的组合启动设置,其中后者的设置优先。
配置修改,可以通过【容器名字】或者【容器 ID】来重启 MySQL,可让配置生效。
docker restart mysqlname
使用 stack 部署 MySQL
MySQL 的实例 stack.yml,下面实例使用 root/example 作为 用户/密码 凭据,default_authentication_plugin=mysql_native_password 这个是因 MySQL 8 的安全机制升级而需要修改的配置,不配置的话将无法登录管理:
version: '3.1'
services:
db:
image: mysql:8.0.18
command: --default-authentication-plugin=mysql_native_password
restart: always
ports:
- "3306:3306"
volumes:
# - /my/custom:/etc/mysql/conf.d
- /etc/localtime:/etc/localtime:ro
environment:
MYSQL_ROOT_PASSWORD: example
adminer:
image: adminer
restart: always
ports:
- 8080:8080
通过下面命令运行 stack,等待它初始化,然后可以访问 http://swarm-ip:8080,http://localhost:8080, 或者 http://host-ip:8080,web 界面来管理 MySQL,有 web 管理工具是因为,在这个 stack 中我们除了添加了 db 的 mysql 容器,还添加了个添加了个额外的 adminer 容器,对外暴露了 8080 端口。
$ docker stack deploy -c stack.yml mysql
# 或者使用 docker-compose,方便开发模式下调试。
$ docker-compose -f stack.yml up
参考资料
4
启动数据库设置初始密码 ===
这一小节介绍在Mac OS、Linux、Windows上启动关闭重启MySQL服务,以及部分图形化界面对服务的操控。安装完成后,可以使用 service 命令启动 mysql 服务,在Mac上service命令不存在。
命令行启动关闭重启MySQL服务
在命令行终端启动 MySQL 非常方便,下面大概介绍几个平台通过命令启动服务的方法。
查看服务是否启动
# 还可以这么查看,MySQL服务器是否启动
ps -ef | grep mysqld
# 查看服务运行的状态
service mysqld status
Mac OS X 下命令操作
在 Mac 系统下操作起来就非常方便了。安装完之后就可以在终端上运行全局命令 mysql.server 命令,假设这个命令没有,你在系统的MySQL安装目录中找到 mysql.server 命令,运行它是一样的效果。
mysqld start
mysql.server start # 1. 启动
mysql.server stop # 2. 停止
mysql.server restart # 3. 重启
当你安装过 MySQL 并没有找到 mysql.server 命令,那这时你需要找到安装目录中的 mysql.server 命令工具了,如 sudo /usr/local/mysql/support-files/mysql.server start
Linux 下命令操作
Linux生态系统中对服务的操作有点区别。其实在 Mac 系统下也可以直接 mysqld start 来启动服务。
- 启动:
service mysqld start - 停止:
service mysqld stop - 重启:
service mysqld restart - 查看状态:
service mysqld status - 查看状态:
systemctl status mysqld.service
systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器,在 Linux 系统中可以通过它来启动 mysql 服务。
启动过程中有可能会报错,错误处理,通过 systemctl status mysqld.service 和 journalctl -xe 命令查看服务启动失败的原因。
systemctl status mysqld.service
● mysqld.service - SYSV: MySQL database server.
Loaded: loaded (/etc/rc.d/init.d/mysqld)
Active: failed (Result: exit-code) since 三 2016-11-02 22:14:36 EDT; 11s ago
Docs: man:systemd-sysv-generator(8)
Process: 14940 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=1/FAILURE)
11月 02 22:14:34 localhost.localdomain systemd[1]: Starting SYSV: MySQL database server....
11月 02 22:14:35 localhost.localdomain mysqld[14940]: MySQL Daemon failed to start.
11月 02 22:14:35 localhost.localdomain mysqld[14940]: Starting mysqld: [FAILED]
11月 02 22:14:36 localhost.localdomain systemd[1]: mysqld.service: control process exited, code=exited status=1
11月 02 22:14:36 localhost.localdomain systemd[1]: Failed to start SYSV: MySQL database server..
11月 02 22:14:36 localhost.localdomain systemd[1]: Unit mysqld.service entered failed state.
11月 02 22:14:36 localhost.localdomain systemd[1]: mysqld.service failed.
# 查看配置文件 my.cnf 的位置
whereis my.cnf
# 输出: my: /etc/my.cnf
# 编辑
vi /etc/my.cnf
里面有个 log_error=/var/log/mysqld.log 的配置,通过命令 tail -25 /var/log/mysqld.log 查看 MySQL 错误日志
2016-01-20T10:00:19.935771Z 0 [ERROR] /usr/sbin/mysqld: Can't create/write to file '/var/run/mysqld/mysqld.pid' (Errcode: 2 - No such file or directory)
2016-01-20T10:00:19.935795Z 0 [ERROR] Can't start server: can't create PID file: No such file or directory
160120 18:00:20 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
上面日志错误说,MySQL服务在启动的时候,不能创建pid文件。前去看一下 mysqld 文件是否存在,不存在创建 mysqld 目录。
# 创建 mysqld 目录
mkdir -p /var/run/mysqld/
# 启动MySQL
/etc/init.d/mysqld start
# 输出下面内容
# Starting mysqld (via systemctl): Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
# [FAILED]
创建 mysqld 目录还是启动报错,按照下面命令尝试解决问题
ls -ld /var/run/mysqld/
# mysqld 文件夹如果不存在通过命令创建
mkdir /var/run/mysqld
# 会输出下面内容
# drwxr-xr-x. 2 mysql mysql 60 11月 2 22:15 /var/run/mysqld/
chown mysql.mysql /var/run/mysqld/
/etc/init.d/mysqld start
通过查看目录 /var/run/mysqld/ 的属主和属组还是root,mysql并不能在其中创建文件,后修改该目录的属主和属组,启动OK。
创建脚本cat start-mysql.sh,这个问题每次都会出现,因为Centos7上MySQL5.7.12系统不兼容启动失败, 每次开机后手动执行,或放在定时调度里。
#!/bin/bash
mkdir -p /var/run/mysqld/
chown mysql.mysql /var/run/mysqld/
/etc/init.d/mysqld start
Windows 下命令操作
Windows平台操作起来有点不顺手,个人感觉 Windows 的DOS太难用了,下面简单的介绍一下操作过程。先找到 MySQL 的安装位置,如我的电脑的安装位置是:C:\Program Files\MySQL\MySQL Server 5.7,我就执行这样的操作:开始->运行->输入“cmd”开启命令行,然后输入“C:”。通过命令进入到 MySQL Server 5.7 的 bin 目录下,输入 MySQL 命令行的服务启用命令,如下:
# net start [mysql服务名]
# 启动 mysql 服务
net start mysql
# 停止 mysql 服务
net stop mysql
有很多情况可能导致无法启动 MySQL,常见解决方法如下:
- 在 CMD 命令中断运行这条命令 C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqladmin-u root -p shutdown 来关闭MYSQL,如果有密码根据提示输入密码即可。
- 在 CMD 命令中断,执行net start mysql启动 MySQL,参考上面方法来启动 MySQL 服务。
图像界面启动关闭重启MySQL服务
Mac OS X 下操作
在 Mac 系统下如果你官方下载安装就可以在系统偏好设置 > MySQL 里面点击 Stop MySQL Server 按钮进行启动关闭。

通过 XAMMPP 安装的 MySQL ,这个软件安装之后会自动安装 Apache + MySQL + PHP 对于初学者特别方便,新版本是默认安装Apache + MariaDB + PHP + Perl。
Windows 下操作
Windows 系统下启动关闭重启MySQL服务。
查看初始密码
默认情况下MySQL是有个初始密码,知道了初始密码才能改密码。
[root@localhost home]# grep 'temporary password' /var/log/mysqld.log
2017-07-17T13:40:11.842835Z 1 [Note] A temporary password is generated for root@localhost: b&iu(sf;>ws
设置初始化密码
启动后我们需要简单配置一下 mysql ,默认安装以后 mysql 的 root 用户是没有密码的,对于生产环境来说,这肯定是不行的,另外还有一些安全相关的设置,可以使用下面这行命令去配置一下,它是一个向导,问你一些问题,你要给出答案,比如是否要设置 root 用户的密码, 密码是什么等等。
mysql_secure_installation
Enter current password for root (enter for none):
# 解释:输入当前 root 用户密码,默认为空,直接回车。
Set root password? [Y/n] y
# 解释:要设置 root 密码吗?输入 y 表示愿意。
Remove anonymous users? [Y/n] y
# 解释:要移除掉匿名用户吗?输入 y 表示愿意。
Disallow root login remotely? [Y/n] y
# 解释:不想让 root 远程登陆吗?输入 y 表示愿意。
Remove test database and access to it? [Y/n] y
# 解释:要去掉 test 数据库吗?输入 y 表示愿意。
Reload privilege tables now? [Y/n] y
# 解释:想要重新加载权限吗?输入 y 表示愿意。
你安装成功后,可以查看一下 MySQL 版本,mysql --version,如果版本并非你所使用的版本,你可以参考这里进行升级数据库操作Centos6下升级MySQL数据库。
启动报错处理
下面是我尝试在Mac上启动MySQL报错
启动失败
sudo /usr/local/mysql/support-files/mysql.server start
Password:
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/mysql/data/localhost.pid
通过日志查看报错信息
# 编辑配置文件
sudo vim /etc/my.cnf
# 在配置文件最后添加一行错误日志输入的配置
log_error = /usr/local/mysql/data/error.log
上面添加完成之后,重新启动再查看日志
sudo /usr/local/mysql/support-files/mysql.server start
tail -100 /usr/local/mysql/data/error.log
日志显示错误一
2017-01-19T03:48:24.695505Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 35
2017-01-19T03:48:24.695540Z 0 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.
日志显示 mysqld 进程使用相同的InnoDB data 文件或日志文件,通过 ps -ef | grep mysql | grep -v grep 查看是否有该进程,发现果然有,这时候你需要杀掉该进程,我在我本地是杀不掉的,于是我尝试使用 mysqld 启动MySQL,启动成功。
sudo /usr/local/mysql/bin/mysqld restart
日志显示错误二
[ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable
上面的错误信息说的是 ibdata1 文件不可写。ibdata1 是InnoDB的共有表空间,默认情况下会把表空间存放在一个文件ibdata1中,(此原因会造成这个文件越来越大)。所以大概能猜测是 mysql 用户的权限不够了。所以再给 ibdata1 目录分配一下权限即可。
这个时候需要查看一下mysql 安装目录权限。使用 chown 改变了整个 mysql 目录的权限,这是一个非常不好的习惯。
cd /usr/local/mysql
sudo chown -R _mysql:_mysql *
这里需要注意的是,Mac OS系统下,mysql 的用户组和用户名都是 _mysql,Linux 是 mysql。然后再重启 MySQL 你就完事大吉了。
上面调试定位错误的方法非常有用。我通过这个方法多次解决各种问题。
5
MySQL 工具 ===
由于 MySQL 软件是基于 C/S 模式的数据库管理系统(一个客户机—服务器DBMS),因此在日常各种工作中,可以通过各种客户端软件来与 MySQL 数据库管理系统关联。MySQL,需要有一个客户机,即你需要用来与MySQL打交道(给MySQL 提供要执行的命令)的一个应用。有许多客户机应用可供选择,但在学习MySQL(确切地说,在编写 和测试MySQL脚本时),最好是使用专门用途的实用程序。官方自带 MySQL Command Line Client 和 MySQL-Workbench 客户端。
MySQL 官方数据库管理系统提供了许多的命令工具,这些工具可以用来管理 MySQL 服务器,对数据库进行访问、管理 MySQL 用户以及数据库备份和恢复工具等。而且 MySQL 提供图形化管理工具,这样操作更简单。
命令行使用程序
每个 MySQL 安装都有一个名为 MySQL 的简单命令行实用程序。这 个实用程序没有下拉菜单、流行的用户界面、鼠标支持或任何类似的东西。
MySQL 服务器端使用工具程序
mysqld- SQL 后台程序(即 MySQL 服务器进程)。该程序必须启动运行,才能连接服务器来访问数据库。mysqld_safe- 服务器启动脚本,可以通过 mysqld_safe 来启动 mysqld 服务器。mysqld_safe 增加了一些安全特性,例如当前出现错误时重启服务器并向错误日至文件写入运行时间信息。mysql.server- 服务器启动脚本。该脚本用于使用包含为特定级别的运行启动服务的脚本的运行目录的系统。mysqld_multi- 服务器启动脚本,可以启动或停止系统上安装的多个服务器。
MySQL 安装相关程序
comp_err- 编译MySQL错误信息文件。mysql_install_db- 该脚本用默认权限创建MySQL授权表。通常只是在系统上首次安装MySQL时执行一次。mysql_plugin- 配置MySQL服务器插件。mysql_secure_installation- 提高MySQL安装的安全性。mysql_ssl_rsa_setup- 创建 SSL/RSA 文件。mysql_tzinfo_to_sql- 加载时区表。mysql_upgrade- 检查并升级MySQL表。
MySQL 客户端使用工具程序
mysql- MySQL命令行工具。mysqladmin- 用于管理MySQL服务器客户端。mysqlcheck- 表维护程序。mysqldump- 数据库备份程序。mysqlimport- 数据导入程序。mysqlpump- 数据库备份程序。mysqlsh- Shell下执行 mysql 命令。mysqlshow- 显示数据库、表和列的信息,。mysqlslap- 负载仿真客户端。
MySQL 程序开发工具
mysql_config- 编译客户端的显示选项。my_print_defaults- 显示选项文件的选项。resolve_stack_dump- 解析数字堆栈跟踪转储到符号。
MySQL 管理实用程序
innochecksum- 离线InnoDB文件校验工具。myisam_ftdump- 显示全文索引信息。myisamchk- MyISAM表维护实用工具。myisamlog- 显示MyISAM日志文件内容。myisampack- 产生压缩,只读MyISAM表。mysql_config_editor- MySQL的配置实用程序。mysqlbinlog- 处理二进制日志文件的效用。mysqldumpslow- 总结慢查询日志文件。
杂项程序
lz4_decompress- 解压缩mysqlpump lz4压缩输出。perror- 解释错误代码。replace- 一个字符串替换工具。resolveip- 解析主机名到IP地址或反之亦然。zlib_decompress- 解压缩mysqlpump zlib压缩输出。
MySQL 命令行实用程序是使用最多的实用程序之一,它对于快速测试 和执行脚本非常有价值。事实上,本书中使用的所有输出例子都是从 MySQL 命令行输出中抓取的。
MySQL Workbench客户端
对于命令行客户端软件,想熟悉使用,必需对每一个相关命令需要非常熟悉,这对于现在初级 MySQL 用户来说,还得玩儿上好长一段时间。于是官方专卖开发了图形化客户端软件 MySQL Workbench,进入 MySQL Workbench 进行下载安装程序,这里安装我是按照默认选项安装,直接不停的下一步。

MySQL Workbench 主要是为数据库管理员和开发人员提供了一整套可视化数据看操作环境,主要有以下功能:
- 数据看设计和模型建立
- SQL开发(取代MySQL Query Browser)
- 数据看管理(取代MySQL Administrator)
MySQL Workbench以前老版本分两个版本,MySQL Workbench Community Edition(也叫 MySQL Workbench OSS,社区版本)和 MySQL Workbench Standard Edition (MySQL Workbench SE,商业版),商业版是收费的,现在官网只看到社区版,官网不在提供商业版的技术支持和更新了。
常用图形管理工具
MySQL Workbench 功能繁缛,操作复杂,而且在 Mac 上面启动慢操作不方便。对于太多大段英文操作界面十分不友好,长得也特别丑陋,所以在 Mac 上推荐一款界面简单、大方、好用的图形管理工具 Sequel Pro 。这也是一个开源免费的软件,源码在这里 如果你有兴趣可研究研究它的源码,做出你的一点贡献。
Sequel Pro 安装也特别简单,有着 Mac 安装应用的风范,下载之后打开 dmg 拖拽 APP 到你的应用程序文件夹即可安装成功,下面是它漂亮的界面:

我在开发过程中一直使用它来配合命令行终端来使用。在这个过程中熟悉了不少命令,为今后在 Linux 服务器中也玩儿得如鱼得水,非常happy!个人小建议,终归是要熟悉一些命令行的,因为部署到生产环境,极为可能连操作系统都没有图形界面。
MyCli替代MySQL的mysql命令行工具
MyCli 是一个 MySQL 命令行工具,支持自动补全和语法高亮。也可用于 MariaDB 和 Percona。推荐好用的图形界面也得推荐好用的命令行工具,这个工具也是免费开源的,源码在这里

看上图就已经高潮了吧,它的安装也毫无压力,不费吹灰之力就搞定安装,没有复杂的配置,MyCli实在太厉害了,不得不推荐它。安装方法如下:
# 如果你已会安装 Python 包,那就简单了:
$ pip install mycli
# 只能在 Mac OS X 中安装
$ brew update && brew install mycli
# 只能在debian 或者 ubuntu 系统中安装
$ sudo apt-get install mycli
工具的帮助文档,在命令行中运行mycli --help就可以输出帮助文档
$ mycli --help
Usage: mycli [OPTIONS] [DATABASE]
Options:
-h, --host TEXT 数据库的主机地址。
-P, --port INTEGER 用于连接的端口号。 Honors $MYSQL_TCP_PORT
-u, --user TEXT 连接到数据库的用户名。
-S, --socket TEXT 用于连接的套接字文件。
-p, --password TEXT 连接到数据库的密码。
--pass TEXT 连接到数据库的密码。
-v, --version mycli的版本输出。
-D, --database TEXT 使用数据库。
-R, --prompt TEXT 提示格式 (Default: "\t \u@\h:\d> ")
-l, --logfile FILENAME 将每一个查询和它的结果记录到一个文件中。
--defaults-group-suffix TEXT 读取指定的后缀的配置组。
--defaults-file PATH 只从给定文件中读取默认选项。
--auto-vertical-output 如果结果比终端更宽,自动切换到垂直输出模式。
--login-path TEXT 从登录文件中读取此路径。
--help 显示此帮助消息
使用例子
$ mycli local_database
$ mycli -h localhost -u root app_db
$ mycli mysql://amjith@localhost:3306/django_poll
6
MySQL 配置修改 ===
安装完了之后更改配置的需求比较少,所以你需要根据实际使用过程中来修改 MySQL 配置参数,MySQL提供了两个更改配置的方式。
- 通过配置想来修改,听说在windows上面有个配置工具(MySQL server instance config) 提供了自动配置服务,真嗨皮。
- 另一种是手工修改配置文件来修改。
对于初学者刚接触MySQL来说,使用工具来修改配置是非常好的,但是在 Mac 系统下面没有找到这样的工具,如果你部署到Linux下面好像没有这种工具,所以在真正的生产环境还是得修改配置来更改 MySQL 配置。接下来只讲解配置文件来修改,为你将来在 Mac 或者 Linux ,包括windows平台系统下容易配置做点准备吧,通过配置文件来配置,让你做跨平台玩儿 MySQL ,让你逼格更高一点,哈哈。
MySQL安装目录说明
MySQL 不同的版本安装目录会有一点不一致,但是大致会差不多,会有一点差异,我这个是 Mac OS X 系统中的安装目录,在这里/usr/local/mysql
| 目录 | 目录内容 |
|---|---|
| bin/ | 客户端程序和mysqld服务器,相关命令 |
| data/ | |
| docs/ | |
| include/ | 包含头文件 |
| lib/ | 库 |
| man/ | |
| share/ | |
| support-files/ | 存在一些默认配置文件,如my-default.cnf |
配置文件的位置
从命令行终端运行此命令,将在寻找Linux/BSD / OS X系统中的MySQL配置文件 my.cnf 文件:
mysql --help | grep 'Default options' -A 1
上面命令执行后,会有这样的输出:
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
现在,可以检查你正在使用的 my.cnf 文件是否存在。在 Mac OS X 中默认式没有 my.cnf 文件的。你可以从这个地方复制一份过去 /usr/local/mysql/support-files/my-default.cnf 每个版本都不一样,你只需要找到一个 .cnf 后缀结尾的文件即可。复制到/etc/目录下并重新命名为 my.cnf
Windows系统配置文件读取
在Windows上,MySQL的程序读取从下表中显示的文件,按照指定的顺序启动配置选项(顶部文件首先被读取,文件读取后优先)。
| 文件名字 | 作用 |
|---|---|
| %PROGRAMDATA%\MySQL\MySQL Server 5.6\my.ini, %PROGRAMDATA%\MySQL\MySQL Server 5.6\my.cnf | 全局配置 |
| %WINDIR%\my.ini, %WINDIR%\my.cnf | 全局配置 |
| C:\my.ini, C:\my.cnf | 全局配置 |
| BASEDIR\my.ini, BASEDIR\my.cnf | 全局配置 |
| defaults-extra-file | 如果有的话指定该文件--defaults-extra-file=文件名字 |
| %APPDATA%\MySQL\.mylogin.cnf | 登录路径选项(仅适用于客户端) |
- %PROGRAMDATA% 这个路径默认为
C:\ProgramData老版本的Windows系统, 默认在C:\Documents and Settings\All Users\Application Data\MySQL - %WINDIR% 表示Windows的目录位置。使用下面的命令从windir环境变量的值确定其精确位置
C:\> echo %WINDIR% - BASEDIR 表示MySQL的安装目录。
- %APPDATA% 表示Windows的目录位置。使用下面的命令从windir环境变量的值确定其精确位置
C:\> echo %WINDIR%
MySQL 提供的二进制安装代码所创建的默认目录,在Windows中,默认安装路径是C:\Program Files\MySQL\MySQL Server 5.7
Linux系统配置文件读取
| 文件名字 | 作用 |
|---|---|
| /etc/my.cnf | 全局配置 |
| /etc/mysql/my.cnf | 全局配置 |
| SYSCONFDIR/my.cnf | 全局配置 |
| $MYSQL_HOME/my.cnf | Server-specific 服务器特定的选项 (仅适用于服务端) |
| defaults-extra-file | 如果有的话指定该文件--defaults-extra-file=文件名字 |
| ~/.my.cnf | Server-specific 服务器特定的选项 |
| ~/.mylogin.cnf | User-specific 登录路径选择 (仅适用于客户端) |
- $HOME 上表中表示用户的主目录,即用户的根目录。
- SYSCONFDIR 代表指定的目录与SYSCONFDIR配置文件的安装路径,默认情况这个是位于安装目录里面的目录。
- $MYSQL_HOME 是包含在该服务器的具体my.cnf文件所在的目录的路径环境变量。如果 $MYSQL_HOME 没有设置,你启动服务器使用mysqld_safe程序,mysqld_safe试图设置 $MYSQL_HOME
工具 mysqld_safe 使用注意:
- 让BASEDIR和DATADIR分别代表MySQL的基本目录和数据目录的路径名。
- 如果my.cnf文件在DATADIR但不是在BASEDIR中,mysqld_safe设置MYSQL_HOME到DATADIR。
- 否则,如果MYSQL_HOME未设置并且在DATADIR没有my.cnf文件,mysqld_safe设置MYSQL_HOME到BASEDIR。
配置文件内容
# 以下选项会被MySQL客户端应用读取。
# 注意只有MySQL附带的客户端应用程序保证可以读取这段内容。
# 如果你想你自己的MySQL应用程序获取这些值。
# 需要在MySQL客户端库初始化的时候指定这些选项。
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.
# mysqld程序
[mysqld]
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
# ★★★这里很重要️能让MySQL登陆链接变快速
skip-name-resolve
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
# These are commonly set, remove the # and set as required.
# 使用给定目录作为根目录(安装目录)。
# basedir = .....
# 从给定目录读取数据库文件。
# datadir = .....
# 为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统);
# pid-file = .....
# 指定MsSQL侦听的端口
# port = .....
# server_id = .....
# 为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(Linux下默认是/var/lib/mysql/mysql.sock文件)
# socket = .....
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
# 一般配置选项
basedir = /data/apps/mysql
datadir = /data/appData/mysql
port = 3306
socket = /var/run/mysqld/mysqld.sock
# 设置
character-set-server=utf8
# 指定MySQL可能的连接数量。
# 当MySQL主线程在很短时间内接收到非常多的连接请求,该参数生效,主线程花费很短时间检查连接并且启动一个新线程。
# back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。
# 如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小。
# 试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。
# back_log 是操作系统在监听队列中所能保持的连接数,
# 队列保存了在 MySQL 连接管理器线程处理之前的连接.
# 如果你有非常高的连接率并且出现 “connection refused” 报错,
# 你就应该增加此处的值.
# 检查你的操作系统文档来获取这个变量的最大值.
# 如果将back_log设定到比你操作系统限制更高的值,将会没有效果
back_log = 300
# 不在 TCP/IP 端口上进行监听.
# 如果所有的进程都是在同一台服务器连接到本地的 mysqld,
# 这样设置将是增强安全的方法
# 所有 mysqld 的连接都是通过 Unix Sockets 或者命名管道进行的.
# 注意在 Windows下如果没有打开命名管道选项而只是用此项
# (通过 “enable-named-pipe” 选项) 将会导致 MySQL 服务没有任何作用!
#skip-networking
# MySQL 服务所允许的同时会话数的上限
# 其中一个连接将被 SUPER 权限保留作为管理员登录.
# 即便已经达到了连接数的上限.
max_connections = 3000
# 每个客户端连接最大的错误允许数量,如果达到了此限制.
# 这个客户端将会被 MySQL 服务阻止直到执行了 “FLUSH HOSTS” 或者服务重启
# 非法的密码以及其他在链接时的错误会增加此值.
# 查看 “Aborted_connects” 状态来获取全局计数器.
max_connect_errors = 50
# 所有线程所打开表的数量.
# 增加此值就增加了 mysqld 所需要的文件描述符的数量
# 这样你需要确认在 [mysqld_safe] 中 “open-files-limit” 变量设置打开文件数量允许至少等于 table_cache 的值
table_open_cache = 4096
# 允许外部文件级别的锁. 打开文件锁会对性能造成负面影响
# 所以只有在你在同样的文件上运行多个数据库实例时才使用此选项(注意仍会有其他约束!)
# 或者你在文件层面上使用了其他一些软件依赖来锁定 MyISAM 表
#external-locking
# 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的 BLOB 字段一起工作时相当必要)
# 每个连接独立的大小,大小动态增加
max_allowed_packet = 32M
# 在一个事务中 binlog 为了记录 SQL 状态所持有的 cache 大小
# 如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能.
# 所有从事务来的状态都将被缓冲在 binlog 缓冲中然后在提交后一次性写入到 binlog 中
# 如果事务比此值大, 会使用磁盘上的临时文件来替代.
# 此缓冲在每个连接的事务第一次更新状态时被创建
binlog_cache_size = 4M
# 独立的内存表所允许的最大容量。
# 此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源。
max_heap_table_size = 128M
# 随机读取数据缓冲区使用内存(read_rnd_buffer_size):和顺序读取相对应,
# 当 MySQL 进行非顺序读取(随机读取)数据块的时候,会利用>这个缓冲区暂存读取的数据
# 如根据索引信息读取表数据,根据排序后的结果集与表进行 Join 等等
# 总的来说,就是当数据块的读取需要满足>一定的顺序的情况下,MySQL 就需要产生随机读取,进而使用到 read_rnd_buffer_size 参数所设置的内存缓冲区
read_rnd_buffer_size = 16M
# 排序缓冲被用来处理类似 ORDER BY 以及 GROUP BY 队列所引起的排序
# 如果排序后的数据无法放入排序缓冲,一个用来替代的基于磁盘的合并分类会被使用
# 查看 “Sort_merge_passes” 状态变量。
# 在排序发生时由每个线程分配
# 每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。
# 注意:该参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100×6=600MB
sort_buffer_size = 16M
# 此缓冲被使用来优化全联合(FULL JOINS 不带索引的联合)。
# 类似的联合在极大多数情况下有非常糟糕的性能表现,但是将此值设大能够减轻性能影响。
# 通过 “Select_full_join” 状态变量查看全联合的数量
# 当全联合发生时,在每个线程中分配
join_buffer_size = 16M
# 缓存可重用的线程数
# thread_cache = 8
# 避免MySQL的外部锁定,减少出错几率增强稳定性。
# skip-locking
# 我们在 cache 中保留多少线程用于重用
# 当一个客户端断开连接后,如果 cache 中的线程还少于 thread_cache_size,则客户端线程被放入cache 中。
# 这可以在你需要大量新连接的时候极大的减少线程创建的开销
# (一般来说如果你有好的线程模型的话,这不会有明显的性能提升。)
thread_cache_size = 16
# 此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量。
# 此值只对于支持 thread_concurrency() 函数的系统有意义( 例如Sun Solaris)。
# 你可可以尝试使用 [CPU数量]*(2..4) 来作为 thread_concurrency 的值
#****(此属性对当前环境无效)****
# thread_concurrency = 8
# 查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果。
# 打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表。
# 查看 “Qcache_lowmem_prunes” 状态变量来检查是否当前值对于你的负载来说是否足够高。
# 注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同,
# 查询缓冲也许引起性能下降而不是性能提升。
query_cache_size = 128M
# 只有小于此设定值的结果才会被缓冲
# 此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖。
query_cache_limit = 4M
# 被全文检索索引的最小的字长。
# 你也许希望减少它,如果你需要搜索更短字的时候。
# 注意在你修改此值之后,你需要重建你的 FULLTEXT 索引
ft_min_word_len = 8
# 如果你的系统支持 memlock() 函数,你也许希望打开此选项用以让运行中的 mysql 在在内存高度紧张的时候,数据在内存中保持锁定并且防止可能被 swapping out
# 此选项对于性能有益
#memlock
# 当创建新表时作为默认使用的表类型,
# 如果在创建表示没有特别执行表类型,将会使用此值
#****(此属性对当前环境无效)****
#default_table_type = InnoDB
# 线程使用的堆大小. 此容量的内存在每次连接时被预留.
# MySQL 本身常不会需要超过 64K 的内存
# 如果你使用你自己的需要大量堆的 UDF 函数或者你的操作系统对于某些操作需要更多的堆,你也许需要将其设置的更高一点.
thread_stack = 512K
# 设定默认的事务隔离级别.可用的级别如下:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
transaction_isolation = REPEATABLE-READ
# 内部(内存中)临时表的最大大小
# 如果一个表增长到比此值更大,将会自动转换为基于磁盘的表。
# 此限制是针对单个表的,而不是总和。
tmp_table_size = 128M
# 打开二进制日志功能。
# 在复制(replication)配置中,作为 MASTER 主服务器必须打开此项
# 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志。
log-bin=mysql-bin
# 如果你在使用链式从服务器结构的复制模式 (A->B->C),
# 你需要在服务器B上打开此项。
# 此选项打开在从线程上重做过的更新的日志, 并将其写入从服务器的二进制日志。
#log_slave_updates
# 打开全查询日志。 所有的由服务器接收到的查询 (甚至对于一个错误语法的查询)
# 都会被记录下来。 这对于调试非常有用, 在生产环境中常常关闭此项。
#log
# 将警告打印输出到错误 log 文件。 如果你对于 MySQL 有任何问题
# 你应该打开警告 log 并且仔细审查错误日志,查出可能的原因。
#log_warnings
# 记录慢速查询。 慢速查询是指消耗了比 “long_query_time” 定义的更多时间的查询。
# 如果 log_long_format 被打开,那些没有使用索引的查询也会被记录。
# 如果你经常增加新查询到已有的系统内的话。 一般来说这是一个好主意,
#log_slow_queries
# 有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询。
# 不要在这里使用“1″, 否则会导致所有的查询,甚至非常快的查询页被记录下来(由于 MySQL 目前时间的精确度只能达到秒的级别)。
long_query_time = 6
# 在慢速日志中记录更多的信息。
# 一般此项最好打开。
# 打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里
#log_long_format
# 此目录被MySQL用来保存临时文件。例如,
# 它被用来处理基于磁盘的大型排序,和内部排序一样。
# 以及简单的临时表。
# 如果你不创建非常大的临时文件,将其放置到 swapfs/tmpfs 文件系统上也许比较好
# 另一种选择是你也可以将其放置在独立的磁盘上。
# 你可以使用”;”来放置多个路径
# 他们会按照 roud-robin 方法被轮询使用。
#tmpdir = /tmp
# *** 主从复制相关的设置
# 唯一的服务辨识号,数值位于 1 到 2^32-1之间。
# 此值在master和slave上都需要设置。
# 如果 “master-host” 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master生效。
server-id = 1
# 复制的Slave (去掉master段的注释来使其生效)
#
# 为了配置此主机作为复制的slave服务器,你可以选择两种方法:
#
# 1) 使用 CHANGE MASTER TO 命令 (在我们的手册中有完整描述) -
# 语法如下:
#
# CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,
# MASTER_USER=, MASTER_PASSWORD= ;
#
# 你需要替换掉,等被尖括号包围的字段以及使用master的端口号替换 (默认3306)。
#
# 例子:
#
# CHANGE MASTER TO MASTER_HOST=’125.564.12.1′, MASTER_PORT=3306,
# MASTER_USER=’joe’, MASTER_PASSWORD=’secret’;
#
# 或者
#
# 2) 设置以下的变量. 不论如何, 在你选择这种方法的情况下, 然后第一次启动复制(甚至不成功的情况下,
# 例如如果你输入错密码在master-password字段并且slave无法连接),
# slave会创建一个 master.info 文件,并且之后任何对于包含在此文件内的参数的变化都会被忽略
# 并且由 master.info 文件内的内容覆盖, 除非你关闭slave服务, 删除 master.info 并且重启slave 服务。
# 由于这个原因,你也许不想碰一下的配置(注释掉的) 并且使用 CHANGE MASTER TO (查看上面) 来代替
#
# 所需要的唯一id号位于 2 和 2^32 – 1之间
# (并且和master不同)
# 如果master-host被设置了.则默认值是2
# 但是如果省略,则不会生效
#server-id = 2
#
# 复制结构中的master – 必须
#master-host =
#
# 当连接到master上时slave所用来认证的用户名 – 必须
#master-user =
#
# 当连接到master上时slave所用来认证的密码 – 必须
#master-password =
#
# master监听的端口.
# 可选 – 默认是3306
#master-port =
# 使得slave只读。只有用户拥有SUPER权限和在上面的slave线程能够修改数据。
# 你可以使用此项去保证没有应用程序会意外的修改slave而不是master上的数据
#read_only
#*** MyISAM 相关选项
# 关键词缓冲的大小, 一般用来缓冲 MyISAM 表的索引块。
# 不要将其设置大于你可用内存的30%,
# 因为一部分内存同样被OS用来缓冲行数据
# 甚至在你并不使用 MyISAM 表的情况下, 你也需要仍旧设置起 8-64M 内存由于它同样会被内部临时磁盘表使用。
# key_buffer_size = 128M
# 用来做 MyISAM 表全表扫描的缓冲大小.
# 当全表扫描需要时,在对应线程中分配.
# read_buffer_size = 8M
# 当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道.
# 如果你增高此值,可以提高很多 ORDER BY 的性能.
# 当需要时由每个线程分配
# read_rnd_buffer_size = 64M
# MyISAM 使用特殊的类似树的 cache 来使得突发插入
# (这些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATA INFILE) 更快.
# 此变量限制每个进程中缓冲树的字节数.
# 设置为 0 会关闭此优化.
# 为了最优化不要将此值设置大于 “key_buffer_size”.
# 当突发插入被检测到时此缓冲将被分配.
# bulk_insert_buffer_size = 256M
# 此缓冲当 MySQL 需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到一个空表中引起重建索引时被分配.
# 这在每个线程中被分配.所以在设置大值时需要小心.
# myisam_sort_buffer_size = 256M
# MySQL 重建索引时所允许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).
# 如果文件大小比此值更大,索引会通过键值缓冲创建(更慢)
# myisam_max_sort_file_size = 10G
# 如果被用来更快的索引创建索引所使用临时文件大于制定的值,那就使用键值缓冲方法.
# 这主要用来强制在大表中长字串键去使用慢速的键值缓冲方法来创建索引.
# myisam_max_extra_sort_file_size = 10G
# 如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们.
# 这对于拥有多个 CPU 以及大量内存情况的用户,是一个很好的选择.
# myisam_repair_threads = 1
# 自动检查和修复没有适当关闭的 MyISAM 表.
# myisam_recover
# 默认关闭 Federated
# skip-federated
# *** BDB 相关选项 ***
# 如果你运行的MySQL服务有BDB支持但是你不准备使用的时候使用此选项. 这会节省内存并且可能加速一些事.
#****(此属性对当前环境无效)****
#skip-bdb
# *** INNODB 相关选项 ***
# 如果你的 MySQL 服务包含 InnoDB 支持但是并不打算使用的话,
# 使用此选项会节省内存以及磁盘空间,并且加速某些部分
#skip-innodb
# 附加的内存池被 InnoDB 用来保存 metadata 信息(5.6中不再推荐使用)
# 如果 InnoDB 为此目的需要更多的内存,它会开始从 OS 这里申请内存.
# 由于这个操作在大多数现代操作系统上已经足够快, 你一般不需要修改此值.
# SHOW INNODB STATUS 命令会显示当先使用的数量.
#****(此属性对当前环境无效)****
#innodb_additional_mem_pool_size = 64M
# InnoDB使用一个缓冲池来保存索引和原始数据, 不像 MyISAM.
# 这里你设置越大,这能保证你在大多数的读取操作时使用的是内存而不是硬盘,在存取表里面数据时所需要的磁盘 I/O 越少.
# 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80%
# 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸.
# 注意在32位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制,
# 所以不要设置的太高.
innodb_buffer_pool_size = 6G
# InnoDB 将数据保存在一个或者多个数据文件中成为表空间.
# 如果你只有单个逻辑驱动保存你的数据,一个单个的自增文件就足够好了.
# 其他情况下.每个设备一个文件一般都是个好的选择.
# 你也可以配置 InnoDB 来使用裸盘分区 – 请参考手册来获取更多相关内容
innodb_data_file_path = ibdata1:10M:autoextend
# 设置此选项如果你希望InnoDB表空间文件被保存在其他分区.
# 默认保存在MySQL的datadir中.
#innodb_data_home_dir =
# 用来同步IO操作的IO线程的数量.
# 此值在Unix下被硬编码为8,但是在Windows磁盘I/O可能在一个大数值下表现的更好.
#innodb_file_io_threads = 8
# 如果你发现 InnoDB 表空间损坏, 设置此值为一个非零值可能帮助你导出你的表.
# 从1开始并且增加此值知道你能够成功的导出表.
#innodb_force_recovery=1
# 在 InnoDb 核心内的允许线程数量.
# 最优值依赖于应用程序,硬件以及操作系统的调度方式.
# 过高的值可能导致线程的互斥颠簸.
innodb_thread_concurrency = 16
# 如果设置为1 ,InnoDB 会在每次提交后刷新(fsync)事务日志到磁盘上,
# 这提供了完整的 ACID 行为.
# 如果你愿意对事务安全折衷, 并且你正在运行一个小的事物, 你可以设置此值到0或者2来减少由事务日志引起的磁盘I/O
# 0代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘.
# 2代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上.
innodb_flush_log_at_trx_commit = 2
#(说明:如果是游戏服务器,建议此值设置为2;如果是对数据安全要求极高的应用,建议设置为1;
#设置为0性能最高,但如果发生故障,数据可能会有丢失的危险!
#默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。
#特别是使用电池供电缓存(Battery backed up cache)时。
#设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。
#日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。
#设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统挂了时才可能丢数据。)
# 加速 InnoDB 的关闭. 这会阻止 InnoDB 在关闭时做全清除以及插入缓冲合并.
# 这可能极大增加关机时间, 但是取而代之的是 InnoDB 可能在下次启动时做这些操作.
#innodb_fast_shutdown
# 用来缓冲日志数据的缓冲区的大小.
# 当此值快满时, InnoDB 将必须刷新数据到磁盘上.
# 由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言)
innodb_log_buffer_size = 16M
# 在日志组中每个日志文件的大小.
# 你应该设置日志文件总合大小到你缓冲池大小的25%~100%
# 来避免在日志文件覆写上不必要的缓冲池刷新行为.
# 不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间.
innodb_log_file_size = 512M
# 在日志组中的文件总数.
# 通常来说2~3是比较好的.
innodb_log_files_in_group = 3
# InnoDB 的日志文件所在位置. 默认是 MySQL 的 datadir.
# 你可以将其指定到一个独立的硬盘上或者一个RAID1卷上来提高其性能
#innodb_log_group_home_dir
# 在 InnoDB 缓冲池中最大允许的脏页面的比例.
# 如果达到限额, InnoDB 会开始刷新他们防止他们妨碍到干净数据页面.
# 这是一个软限制,不被保证绝对执行.
innodb_max_dirty_pages_pct = 90
# InnoDB 用来刷新日志的方法.
# 表空间总是使用双重写入刷新方法
# 默认值是 “fdatasync”, 另一个是 “O_DSYNC”.
# 一般来说,如果你有硬件 RAID 控制器,并且其独立缓存采用 write-back 机制,并有着电池断电保护,那么应该设置配置为 O_DIRECT
# 否则,大多数情况下应将其设为 fdatasync
#innodb_flush_method=fdatasync
# 在被回滚前,一个 InnoDB 的事务应该等待一个锁被批准多久.
# InnoDB 在其拥有的锁表中自动检测事务死锁并且回滚事务.
# 如果你使用 LOCK TABLES 指令, 或者在同样事务中使用除了 InnoDB 以外的其他事务安全的存储引擎
# 那么一个死锁可能发生而 InnoDB 无法注意到.
# 这种情况下这个 timeout 值对于解决这种问题就非常有帮助.
innodb_lock_wait_timeout = 120
# 这项设置告知InnoDB是否需要将所有表的数据和索引存放在共享表空间里(innodb_file_per_table = OFF) 或者为每张表的数据单独放在一个.ibd文件(innodb_file_per_table = ON)
# 每张表一个文件允许你在drop、truncate或者rebuild表时回收磁盘空间
# 这对于一些高级特性也是有必要的,比如数据压缩,但是它不会带来任何性能收益
innodb_file_per_table = on
[mysqldump]
# 不要在将内存中的整个结果写入磁盘之前缓存. 在导出非常巨大的表时需要此项
quick
max_allowed_packet = 32M
[mysql]
no-auto-rehash
default-character-set=utf8
# 仅仅允许使用键值的 UPDATEs 和 DELETEs .
safe-updates
[myisamchk]
key_buffer = 16M
sort_buffer_size = 16M
read_buffer = 8M
write_buffer = 8M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
# 增加每个进程的可打开文件数量.
# 警告: 确认你已经将全系统限制设定的足够高!
# 打开大量表需要将此值设大
open-files-limit = 8192
#
# MySQL 服务端
#
[client]
default-character-set=utf8
配置好定制配置文件 my.cnf 之后需要初始化一下
mysqld --initialize
初始化之后需要重启服务
# 重启服务
mysql.server restart
# Linux 这么运行,启动服务
service mysqld start
# Mac 运行去掉 service
mysqld start
# Linux 查看服务运行的状态
service mysqld status
1
连接数据库 ===
登录MySQL数据库有多种方式,GUI登录最方便,有特别多的App可以提供图形化工具登录MySQL,并且方便的查看数据信息,这里推荐一些APP,你可以尝试下载,有些APP还提供命令执行功能。图形化界面就不一样讲解了,就介绍一下命令行下面登录MySQL数据库,这样你可以配合App来学习SQL语言,更快掌握这门语言。
MySQL命令语法
用户名是你登录的用户,主机名或者IP地址为可选项,如果是本地连接则不需要,远程连接需要填写,密码是对应用户的密码。
mysql –u用户名 [–h主机名或者IP地址,-P端口号] –p密码
- 该命令是在命令行窗口下执行,而不是MySQL的命令行;
- 输入-p后可以直接跟上密码,也可以按回车,会提示你输入密码,二者都是相同的效果;
- –p密码选项不一定是要在最后;
- –u、-h、-p后无空格。
MySQL命令连接数据库
首先将这个使用率高达80%以上的“mysql”命令工具简单的做一个讲解,在操作系统命令终端提示符下输入 mysql -h 127.0.0.1 -u用户名 -p密码,将出现一个如下的简单提示:
→ mysql -h127.0.0.1 -P3306 -uroot -prootpassword
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 99
Server version: 5.7.14 MySQL Community Server (GPL)
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
-h127.0.0.1其中“-h”是参数,“127.0.0.1” 是 IP 地址,默认本地参数可忽略-P3306其中“-P”是参数(注意大写),“3306” 是端口号,默认本地参数可忽略-uroot其中“-u”是参数,“root” 是用户名。-prootpassword其中“-p”是参数,“rootpassword” 是密码。Commands end with ; or \g.命令的结束符,用“;”或者“\g”符号结束,但是冒号结束退出是不行的。Your MySQL connection id is 99其中 id 表示客户端的连接 ID,该数据记录了 MySQL 服务到目前为止的连接次数,每次新连接都会自动加 1。由于数据库服务是我安装了好久的,所以当前 ID 值为 99。Server version: 5.7.14 MySQLMySQL的版本。Community Server (GPL)表示 MySQL 软件是社区版。Type 'help;' or '\h' for help.表示输入 “help;” 或者 “\h” 命令可以查看帮助信息。Type '\c' to clear the current input statement.表示输入“\c” 命令可以清除前面的命令。
你只需要在mysql>命令中输入 SQL 语句,同时并以分号“;”结束。最后摁Enter键即可操作 MySQL软件。
当然,具体的版本和连接信息可能不同,但都可以使用这个实用程序。请注意:
- 命令输入在
mysql>之后; - 用
q\、quit、exit三种命令可以退出命令行实用程序; - 帮助命令,输入
help或\h获得帮助,可以获得其它特定的命令的帮助(如,输入help select获得使用SELECT语句的帮助);
开启MySQL的远程帐号
用GUI连接数据库如果报下面错误,是你的 MySQL远程连接账号没有开启。
Unable to connect to host 192.168.188.114, or the request timed out.
Be sure that the address is correct and that you have the necessary privileges, or try increasing the connection timeout (currently 10 seconds).
MySQL said: Host '192.168.188.106' is not allowed to connect to this MariaDB server
通过下面的命令,解决不能连接的错误,进入 MySQL 执行下面语句。
# 你想root使用123456从'192.168.188.106'主机连接到mysql服务器 wabg库下面所有表的话。
MySQL> grant all PRIVILEGES on wabg.* to root@'192.168.188.106' identified by '123456' WITH GRANT OPTION;
# 你想myuser使用mypassword从任何主机连接到mysql服务器的话
MySQL> grant all PRIVILEGES on *.* to 'myuser'@'%' identified by 'mypassword' WITH GRANT OPTION;
上面的语句表示将 wabg 数据库的所有权限授权给 root 这个用户,允许 root 用户在 192.168.1.106 这个 IP 进行远程登陆,并设置 root 用户的密码为 123456 。
- all PRIVILEGES 表示赋予所有的权限给指定用户,这里也可以替换为赋予某一具体的权限
- wabg. 表示上面的权限是针对于哪个表的,wabg指的是数据库,后面的 表示对于所有的表,由此可以推理出:
- 对于全部数据库的全部表授权为“ *.* ”
- 对于某一数据库的全部表授权为“ 数据库名.* ”
- 对于某一数据库的某一表授权为“数据库名.表名”
- root 表示你要给哪个用户授权,这个用户可以是存在的用户,也可以是不存在的用户。
- 192.168.188.106 表示允许远程连接的 IP 地址,如果想不限制链接的 IP 则设置为“%”即可。
- 123456 为用户的密码。
如何开启MySQL的远程帐号?执行了上面的语句后,再执行下面的语句,方可立即生效。
MySQL> flush privileges;
当你报下面错误,提示您的密码不满足当前的策略要求。错误如下:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
# 或者
mysqladmin: unable to change password; error: 'Your password does not satisfy the current policy requirements'
解决方法:可以按照现有策略设置密码,也可以更改密码策略。
# 更改密码策略为LOW
MySQL> set global validate_password_policy=0;
# 更改密码长度 密码最小长度为4
MySQL> set global validate_password_length=4;
进入 MySQL 查看你的密码验证策略
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------+-------+
| validate_password_check_user_name | OFF |
| validate_password_dictionary_file | |
| validate_password_length | 4 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | LOW |
| validate_password_special_char_count | 1 |
+--------------------------------------+-------+
7 rows in set (0.00 sec)
- validate_password_check_user_name 不得使用当前会话用户名作为密码的一部分
- validate_password_dictionary_file 验证密码强度的字典文件路径
- validate_password_length 密码最小长度
- validate_password_mixed_case_count 密码至少要包含的小写字母个数和大写字母个数
- validate_password_number_count 密码至少要包含的数字个数
- validate_password_policy 密码强度检查等级,0/LOW、1/MEDIUM、2/STRONG
- 0/LOW:只检查长度。
- 1/MEDIUM:检查长度、数字、大小写、特殊字符。
- 2/STRONG:检查长度、数字、大小写、特殊字符字典文件。
- validate_password_special_char_count 密码至少要包含的特殊字符数
MySQL修改密码
mysqladmin -uroot -p password
2
查看选择数据库 ===
查看数据库
MySQL数据库连接成功之后,就可以使用SQL语句来查看当前所有存在的数据库,显示的一些默认的数据库是在 MySQL安装完成之后,在其目录 data 自动创建的几个必要的数据库,输入SQL语句如下:
mysql> SHOW DATABASES;
+--------------------+
| Database |
|--------------------|
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set
Time: 0.031s
使用“SHOW DATABASES;” 语句之行完之后,就可以看到,数据库表包含了5个数据库,mysql是必须的,它主要描述用户访问权限,用户经常使用test数据库做测试的工作,其他数据库将在后面的章节做一些介绍。这个命令起到一些小作用,可以帮助你查看创建的数据库是否创建成功,选择你创建的数据库等操作。
选择数据库
如果你在你创建好的数据库里面创建表,对表坐一系列的操作,这个时候你需要使用到选择命令“USE”。比如我进入 test 数据库,输入语句如下:
mysql> USE test;
You are now connected to database "test" as user "root"
Time: 0.003s
使用“USE test;”语句之后,反馈出连接数据库成功,可以看出使用 root 用户连接到 "test" 数据了,并且输出连接时间。
3
创建数据库 ===
我们上一节已经学会“SHOW DATABASES;”查看到本地数据库,MySQL安装好以后,首先需要创建数据库,你可以创建自己的数据库,这是使用 MySQL 各种功能的前提。
SQL语句创建数据库
创建一个已知不存在的数据库
连接好 MySQL 之后运行下面SQL语句创建数据库:
CREATE DATABASE test;
运行上面SQL语句将输出下面信息
Query OK, 1 row affected
Time: 0.011s
数据库创建之后可以使用 “SHOW CREATE DATABASE” 声明查看数据库的定义。运行下面SQL语句:
SHOW CREATE DATABASE test\G;
运行上面SQL语句将输出下面信息:
***************************[ 1. row ]***************************
Database | test
Create Database | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */
1 row in set
Time: 0.001s
创建一个不确定存在的数据库
如果你刚创建 test 这个数据,或者你的这个数据库已经存在,执行创建数据库的SQL语句 “CREATE DATABASE test;” 结果会输出一条错误信息,即不能创建数据库 test ,已经存在于数据库中。输出结果如下:
mysql> CREATE DATABASE test;
ERROR 1007 (HY000): Can't create database 'test'; database exists
为了不产生错误,在创建数据库的时候可以加上一些简单的逻辑判断,判断数据库是否存在,不存在也不产生错误。会产生一个警告,如下:
mysql> CREATE DATABASE if not exists test;
Query OK, 1 row affected, 1 warning (0.00 sec)
管理工具创建数据库
使用普通用户登陆 MySQL 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库。所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 mysql mysqladmin 命令来创建数据库。
$ mysqladmin -uroot -p create test
Enter password:***
如果数据库存在则提示下面信息:
$ mysqladmin -uroot -p create test
Enter password:****
mysqladmin: CREATE DATABASE failed; error: 'Can't create database 'test'; database exists'
4
删除数据库 ===
删除数据库是将已经存在的数据库从磁盘空间上清除,清除之后,数据库中的所有数据也将一同被删除。所以删除数据库需要特别谨慎,建议先备份数据。
SQL语句删除数据库
删除一个已经确定存在的数据库
MySQL 中删除数据库的基本SQL语句:
DROP DATABASE test2;
运行之后会询问是否删除,运行输出如下:
You're about to run a destructive command.
Do you want to proceed? (y/n): y
Your call!
Query OK, 0 rows affected
Time: 0.004s
删除一个不确定存在的数据库
如果你没有创建 test2 这个数据,或者你的这个数据库被删除了,再次执行查看数据库的定义 “SHOW CREATE DATABASE” 结果会输出一条错误信息,即数据库 test2 已经不存在。输出结果如下:
mysql> SHOW CREATE DATABASE test2;
ERROR 1049 (42000): Unknown database 'test2'
为了不产生错误,在删除数据库的时候可以加上一些简单的逻辑判断,判断数据库是否存在,不存在也不产生错误。
mysql> drop database if exists test2;
Query OK, 0 rows affected, 1 warning (0.00 sec)
产生一个警告说明此数据库不存在。
管理工具删除
使用普通用户登陆 MySQL 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库。所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 mysql mysqladmin 命令来创建数据库,也可以通过这个命令来删除数据库。
mysqladmin -uroot -p drop test
Enter password:******
上面命令,会出现输出两句提示来提示你删除数据带来的风险,同时会输出一个确认删除的提示,来确认是否真的删除数据库,当数据库 test 存在,并且你输入 y 摁下了Enter键的时候,会提示删除成功。
Dropping the database is potentially a very bad thing to do.
Any data stored in the database will be destroyed.
Do you really want to drop the 'test' database [y/N] y
Database "test" dropped
如果数据库不存在则提示下面信息:
mysqladmin: DROP DATABASE test failed;
error: 'Can't drop database 'test'; database doesn't exist'