数据库
数据库,其实是数据库管理系统dbms。
数据库管理系统,
常见:
- 关系型数据库: mysql、pg、
- 库的表,表与表之间有关联关系; 表二维表
- 统一标准的SQL(不局限于CRUD)
- 非关系型数据库:redis、mongodb
- 表之间没有强关联,表中数据,也没有统一的结构。
- redis: key-value
- mongodb:bson(类似json)文档
- 没有统一标准sql,不同的非关系型数据,sql语句不一样
- 时序数据:
- Prometheus 以时间序列来存储数据
数据库管理系统,管理数据。
数据:一切可以用计算书来存储都是数据。
数据对于一个项目是非常非常重要的,所以对数据的保存、数据的稳定性、数据的安全性要求是比较 高的。
如果数据存在磁盘上,希望磁盘的稳定性就要求比较高。----所以,数据库的数据存的磁盘,一般选择机械硬盘。
关系型数据库:库和表 库是数据的一个整体。
mysql数据库,库名称,就是一个文件夹名称。一个库就是一个文件夹。 表用二维表的方式栅格化数据,进行存储。
select语言的性能分析是的重点:项目中获取数据频率远远高于对数据变更的操作。
获取数据,从磁盘上读取你想要的数据。从一张表中来获取想要数据。
mysql数据库,表在磁盘上,就是文件。
我们从表中获取一条数据的过程,找到文件夹(库),找到文件(表),打开磁盘的文件(读文件),跳转到对应的位置(表中一行) 学习数据库的时候还需要有磁盘知识。
数据库安装(linux)
数据库安装: wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm yum install -y mysql80-community-release-el7-7.noarch.rpm
如果此时 直接安装安装的就是mysql8.0.x版本,数据库安装要安装 mysql5.7.x版本
目前企业中用的mysql数据库的版本,主要是:mysql5.7.x版本或mysql8.x版本
mysql数据库在5.7的版本开始,有非常大的变化。
从mysql的官网上下载,都是mysql8.x版本。mysql5.7.37之前的版本,版本的有效时间已经过期,现在 安装的mysql版本是5.7.37以后。
yum repolist all | grep mysql 查看到当前系统mysql的源支持的mysql版本。现在是mysql8的版本
vim /etc/yum.repos.d/mysql-community.repo
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch
enabled=1 # 由0改成了1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch
enabled=0 # 由1改成了0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
# 安装mysql5.7
yum install mysql-community-server -y
这样就能安装到最新的mysql5.7.x版本。
如果你要用mysql的rpm包安装,安装的顺序
mysql-community-common-5.7.41-1.el7.x86_64
1/6
mysql-community-libs-5.7.41-1.el7.x86_64
2/6
mysql-community-client-5.7.41-1.el7.x86_64
3/6
mysql-community-server-5.7.41-1.el7.x86_64
4/6
mysql-community-libs-compat-5.7.41-1.el7.x86_64
systemctl restart mysqld
systemctl enable mysqld
这种方式安装的mysql数据库的配置文件: /etc/my.cnf
不同方式安装mysql数据库,配置文件的路径是不一样的。所以不要死记。
调整密码等级 0弱密码 1 一般 2强密码 validate_password_policy 是否开启校验
vim /etc/my.cnf
# 添加validate_password_policy配置 0(LOW),1(MEDIUM),2(STRONG)
validate_password_policy=0
# 关闭密码策略
validate_password = off
修改了mysql的配置文件,要重启,才生效。
此时,不知道root密码的,找到root命令
从mysql的日志获取随机生成的root密码: grep "password" /var/log/mysqld.log
登录数据库: mysql -uroot -p 回车,输入密码,
修改密码:
alter user 'root'@'localhost' identified by '新密码';
# 开启远程访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的新密码' WITH GRANT
OPTION;
FLUSH PRIVILEGES;
exit;
数据库,默认端口:3306,
数据库的运行日志:/var/log/mysqld.log
数据库的配置文件:/etc/my.cnf
数据库数据文件:/var/lib/mysql
磁盘
- 机械硬盘
- 光盘----可以反复擦写
- 机械臂
- 转子:现在的机械硬盘,转子的转速一般在7200r/m 14000r/m。 转速越高,从磁盘读数据 的速度,就会越快。但是因为是机械运动,不可能无限快,转速快,会发热。
- 固态硬盘
- 光盘:
- 先理解为一张白纸
- 光盘的格式化。先分区,然后格式化。
- 硬盘做分区,是可以提升数据存取速度。
- 做分区的时候,就会选择格式化。NTFS、ext4
- 磁盘的格式化,可以提高磁盘利用率,获取数据的时候,速度也更快
扇区:磁盘上的一段弧形
块:相邻的多个扇区构成块。 操作系统与磁盘进行数据交换的单位。
页page:操作系统与内存进行数据交换的单位。一页是由多个块构成。
CPU的速度是最快的,内存的速度居中,磁盘的速度是最慢的。为了配合cpu的速度,需要缓存。
- 缓存:
- buff缓冲区:由磁盘虚拟出来的,加快从磁盘读数据的速度。
- cache缓存:内存中一部分和cpu寄存器
用虚拟化参数都硬盘,都是机械硬盘,在linux中,标识机械硬盘 sd,后面跟一个字母,代表第几个硬盘 (sda第1块机械硬盘),再跟一个数字,数字代表硬盘的第几个分区(sda2第1个硬盘的第2个分区) sdb2
fdsk -l 可以看硬盘的信息,但是fdisk命令,谨慎使用(有可能符导致磁盘格式化)。
RAID磁盘矩阵:做这个,也是为了提升磁盘的性能,也可以做磁盘数据的备份。 矩阵:就会要用到多个磁盘。
RAID0:数据分片存在2块磁盘,读写速度提升2倍,主要用于SWAP\TMP,但是数据不冗余,数据恢复难
RAID1:相同数据冗余存入2块磁盘,写速度不变,读速度提升2倍,数据冗余1份,主要用于数据备份, 但磁盘利用率低
RAID5:数据分片和校验码混合存储3份,读写速度提升2倍,主要在要求高速时用,可以用于数据还原 RAID10:2块磁盘1组先做RAID1,多组RAID1,再做RAID0。读写速度N倍 n为组数
读磁盘
dd 命令
命令: dd if=/dev/sda of=/dev/null bs=20MB count=100
if 输出文件 /dev/sda 读整个磁盘
of 输出文件 /dev/null 回收站,是一个伪设备,不会有磁盘的写操作
bs 每次操作文件的大小
count 执行次数
这个命令用来测试磁盘在只有读的时候,磁盘的性能。
vmstat 命令可以看到 buff 和 cache
vmstat 1
清空缓存: echo 3 > /proc/sys/vm/drop_caches 清空缓存
执行之后,会buff清空,cache会变小。
dd if=/dev/sda of=/dev/null bs=20MB count=100
vmstat 1
一般情况下机械硬盘的读磁盘的速度,一般在小几百MB每秒。多次测试会有偏差。
写磁盘
先清空缓存: echo 3 > /proc/sys/vm/drop_caches
vmstat 1
写磁盘: dd if=/dev/zero of=$PWD/outf bs=16MB count=100
buff没有变,cache是变大了。
vmstat 1
磁盘的写的速度,一般也是小几百MB每秒
同时读写磁盘
这些这些命令之前,都要去先清空缓存
dd if=/dev/sda of=$PWD/otf bs=14MB count=100 同时有读和写磁盘操作。
这个操作buff和cach都会增大,速度,也是在小几百MB每秒,一般还会比单独的读或写的速度要慢。
内存速度测试
dd if=/dev/zero of=/dev/null bs=15MB count=100 没有读和写磁盘 ---这些数据都在内存中交换,这个命令可以测试内存的速度。
执行这个命令,看到buff和cach基本没变,得到内存的速度大概是:小几十GB每秒
内存的速度,大概是磁盘速度的十几倍。
你项目中同时有读写操作,你可以用iostat这个命令,看读写速度和等待wait,看是否有磁盘瓶颈。
现在的数据库,因为要大量读磁盘操作,读速度跟不上行,就可能导致,获取数据的响应时间偏 长,导致性能偏低。
这其实就会被大多人理解为慢sql,慢查询。
一般数据库因为磁盘瓶颈,导致的性能问题,一般比较少的换磁盘,而是考虑优化数据库。