共计 3888 个字符,预计需要花费 10 分钟才能阅读完成。
根底篇
1、装置 Mysql
在 windows 上装置 Mysql
zip 包解压装置
1. 下载 mysql 压缩包
下载地址:https://dev.mysql.com/downloa…
2. 解压下载的 zip 包
3. 在解压后的根目录新建 my.ini 文件,批改文件内容
留神:目录名不要以 t、s、n 结尾,会被默认辨认为 \t、\s、\n 等,导致 my.ini 文件报错
文件内容:
[mysqld]
#设置时区为东八区,此项设置后,在连贯 MySQL 的时候能够不必每次都手动设置时区
default-time-zone = '+8:00'
# 设置 3306 端口
port=3306
# 设置 mysql 的装置目录,记得切换成本人的门路
basedir=D:\Learn\Tools\mysql-8.0.29-winx64
# 设置 mysql 数据库的数据的寄存目录
datadir=D:\Learn\Tools\mysql-8.0.29-winx64\data
# 容许最大连接数
max_connections=200
# 容许连贯失败的次数。这是为了避免有人从该主机试图攻打数据库系统
max_connect_errors=10
# 服务端应用的字符集默认为 UTF8
character-set-server=utf8
# 创立新表时将应用的默认存储引擎
default-storage-engine=INNODB
# 默认应用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置 mysql 客户端默认字符集
default-character-set=utf8
[client]
# 设置 mysql 客户端连贯服务端时默认应用的端口
port=3306
default-character-set=utf8
4. 以管理员身份进入 mysql 的 bin 目录
形式一:win+r
输出 cmd
,而后Ctrl+Shift+Enter
即可用管理员权限运行。
形式二:
5. 执行 MySQL 初始化命令
mysqld --initialize
6. 执行 MySQL 装置命令
mysqld --install mysql8
7. 查看 MySQL 默认的明码
关上【mysql 装置目录】\data*.err 文件,找到 A temporary password is generated for root@localhost:【默认明码】
8. 批改明码
应用默认明码登录 mysql
mysql -uroot -p
请输出明码:【默认明码】
执行
use mysql;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
在 Linux 上装置 Mysql
yum 装置
1. 查看是否曾经装置了 mysql
[root@localhost ~]# rpm -qa|grep mysql #无输入阐明没有装置
2. 找到对应 linux 的版本
下载地址:https://dev.mysql.com/downloa…
3. 装置 mysql 源
# 下载查看操作系统版本
[root@localhost ~] cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
#下载和装置 mysql 源
[root@localhost ~] wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
#如果显示 wget 未找到命令,则须要先装置 wget
[root@localhost ~] yum -y install wget
#装置 mysql 源
[root@localhost ~]# sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm
查看是否装置胜利:
执行胜利后会在 /etc/yum.repos.d/ 目录下生成两个 repo 文件 mysql-community.repo 及 mysql-community-source.repo
4. 装置 mysql
[root@localhost ~]# sudo yum install mysql-community-server
5. 启停 / 批改明码 / 开机自启
[root@localhost ~]# systemctl start mysqld.service
[root@localhost ~]# systemctl status mysqld.service
[root@localhost ~]# systemctl stop mysqld.service
[root@localhost ~]# systemctl restart mysqld.service
#初始密码
[root@localhost ~]# grep 'temporary password' /var/log/mysqld.log
# 批改明码
# 先进行登录
[root@localhost ~]# mysql -uroot -p
Enter password:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'newPassword';
#明码太弱
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
#设置开机启动
[root@localhost ~]# systemctl enable mysqld
[root@localhost ~]# systemctl daemon-reload
6. 设置近程拜访,增加用户
# 设置 root 用户近程拜访
mysql> use mysql;
mysql> select user,host from user;
mysql> update user set host = '%' where user = 'root';
mysql> flush privileges;
#增加 mysql 用户,设置 mysql 用户近程拜访
mysql> create user 'mysql'@'%' identified with mysql_native_password by 'Lg5181349!';
mysql> grant all privileges on *.* to 'mysql'@'%' with grant option;
mysql> flush privileges;
2、mysql 的执行过程
连贯治理
连贯形式
- TCP/IP
- 命名管道
- 共享内存
- UNIX 域套接字
连贯原理
当一个客户端过程连贯到服务器时,服务器会开启一个线程专门处于与该客户端的申请,与该客户端交互。当客户端断开连接后,服务端并不会间接销毁该线程,而是将它缓存起来,在另一个新的客户端在进行连贯时,把这个缓存的线程调配给新的客户端。这样做是为了缩小线程的频繁创立和销毁,从而节俭开销。
当建设连贯后,服务端会始终期待客户端发送过去的申请,该申请只是一个文本音讯,mysql 还须要将文本音讯通过各种解决。
解析与优化
查问缓存
- mysql 会将查问申请的后果缓存下来,当有雷同的申请过去时,mysql 会当初缓存中查找后果,而且这个缓存能够在不同的客户端之间共享。
- 如果两个申请有任何字符上的一点不一样,都会导致缓存不会命中。
- 如果查问申请中蕴含零碎函数或者用户定义变量和函数、零碎表,申请后果就不会被缓存,例如 NOW()函数返回的数据,自身就不应该缓存。
- 如果表的数据和表的构造更新了,所有与该表相干的查问缓存也将生效。比方(update\insert\delete\truncate table\alert table\drop table\drop databases)等语句执行后,那么该表缓存的 select 后果就会更新。
- mysql8 中将缓存删除了
语法解析
- 语法解析就是先判断客户端发送过去的文本信息的正确性,而后将文本编译为 mysql 服务器外部应用的一些数据结构上。
- 从实质上将,从文本中提取可用信息的过程,其实属于一个编译的过程,设计词法解析、语法分析、语义剖析等阶段。
查问优化
- mysql 会将咱们编写的 sql 语句优化为它认为执行效率更高的样子。
- 优化的后果其实就是生成一个执行打算,咱们能够应用 explain 语句来查看某一个 sql 语句的执行打算。
存储引擎
实践反对
- 在查问优化实现之后,其实 mysql 还没有真正的去拜访实在的数据,mysq 服务器将数据的存储和提取操作都封装到了一个名为存储引擎的模块中。
- 存储引擎的实质其实就是接管下层传下来的指令,而后对表中的数据进行读取或者写入操作。
-
为了方便管理,mysql 服务器将解决申请的过程分为 server 层和存储引擎层
- server 层负责不波及实在数据的解决,如连贯治理、查村缓存、语法解析、查问优化等,
- 存储引擎层负责实在的数据存取
- 各个不同的存储引擎为 server 层提供雷同的调用接口,其中蕴含几十个不同用处的底层函数
- 在 server 层实现优化后,只须要依照生产的执行打算调用底层存储引擎提供的节后获取后果返回客户端就好了
- server 层和存储引擎层交互个别是以记录为单位,也就是 server 层先向存储引擎层取一条数据,而后判断是否符合条件,若合乎,就返回到缓冲区,缓冲区满了则返回给客户端,若不合乎,就跳过该记录,取下一条记录。
存储引擎的操作
# 创立表时指定存储引擎
CREATE TABLE [TABLENAME](...)ENGINE = [ENGINENAME];
#批改表的存储引擎
ALERT TABLE [TABLENAME] ENGINE = [ENGINENAME];
#查看表的存储引擎
SHOW CREATE TABLE [TABLENAME]\G