前言:
数据库是程序员的数据源泉,加上近期 要开发DB可视化、性能分析的功能 重新回顾一下MySQL知识,以下是笔记;
MySQL架构
MySQL基础理论
1.什么是关系型数据库?
关系型数据库,这个关系怎么讲呢?简单来说关系就是 通过行、列组成一张二维表 把所有数据关联、表现出来;
列:从不同方面描述1类实体数据的属性;
行:1行=1条实体数据;
2.为什么要使用数据库管理系统(DBMS)?
如果我们的数据只是像/etc/password/这样大小的一个文件,我们使用文本文件存储数据是完全没有问题的;
但是使用文件的方式存储数据有下列缺陷:
数据冗余
无法简单描述数据之间的关联性(外键、多对多、1对1)在文件中实现起来困难
文本文件无法保存数值数据(浮点、整型)丢失精度、无法计算
最重要的是 当文件中数据每人剧增变得异常庞大的时候,我们从中查找符合条件的内容将会变得异常困难;
比如:/etc/password这个文件变成100G的时候,我们从中查找出 …^r的用户,怎么查找?。
也许你会想到使用grep/egrep命令去查找,是的我能找到没有任何问题;
但是在100G的文件中寻找符合条件的行会遇到以下问题:
grep/egrep也是程序 如果想要 查询 就需要把100G的文件载入内容,需要多大的内存?,即便有这么大的内存会产生多大IO?花销多大时间?
基于以上内容使用一个简单的文件来存储数据,只能 在早期 满足1个简单数据模型的应用程序;
3.什么是搜素引擎?
如果1个python程序使用文件来保存数据,数据都存储在硬盘上,python和数据打交道的接口是什么?文件系统的系统调用接口;
文件存储在硬盘上,我们通过系统调用调用到的数据都是数据流(只不过通过文件系统抽象之后才表现为文件)如果和文件数据流打交道这就意味着你的python程序就需要维护文件句柄、内容指针(读到第几行了?)、何时关闭文件、关闭之前清理缓冲区....管理;
我们都知道文件系统把数据放在磁盘的某1个块上的,假如说这个python程序想要访问某1数据块,python也需要将这个文件的所有内容载入到内存中才能访问的;
为什么是所有文件内容?因程序本身无法界定符合条件的内容到底存储在 哪个数据块上?
于是在文件系统之上又封装了一层管理功能,这个管理工具向下可以和文件系统打交道,将N个文件系统的块 组织成1个更高级别的逻辑存储块。
划分出这些逻辑块之后,就可以知道那些数据存储在哪个数据块上并记录下来;所以比如当我们查询/etc/password的1-5行时就可以载入部分数据块了;因为现在已经知道了那些数据在哪个数据块上,无需在访问部分数据时加载全部文件的数据块了;
但是还有1个问题 如果 我们要查询 /etc/password 以^r开头的用户
那么就会出现1个问题即使你知道 某1行数据在哪1数据块?但也需要载入全部数据块(如果1个数据块对应1行数据)去每个块上找1下;
所以我们可以把一些搜素条件单独组合成搜素码,单独存储在1个数据块上,这样用户搜素的时候就可以只载入1个数据块而不是全部了!
如果 我们要查询 /etc/password 以^r开头的用户所有信息包含家目录、登录shell
所以我们不仅要把搜素码单独存储起来,还有存储它相关信息所在搜素块的映射关系;这就是索引
索引分级:
如果把所有搜素条件都做成搜素块(索引)那么数据库每次启动加载所有所有索引信息也是非常慢慢的,索引也需要分级;
数据库缓冲区:
加载索引 、经常访问的数据到内存加速用户访问速度;
搜素引擎:
以上内容 将数据从1个物理模型转换成数据库能理解的数据库模型、根据上层程序调用不加载全部数据块而非全部数据的 就是数据库引擎;
读锁:共享锁
写锁:独占锁
httpMPM
multi-processing module 并发响应模型
http支持三种方式解决并发问题:
prefork:1个进程处理1个请求
worker:多个进程处理1个请求
event:1个线程处理多个请求(IO多路复用 + 协程)时间通知回调 协程切换
mysq并发:1个线程响应1个用户请求;
为啥不用1个线程处理多个数据库用户呢?1的用户的请求处理逻辑复杂开发难度比较大;
4.为什么要用mysql线程池?
因为mysql的线程比较重量级,在大并发的场景下线程的创建、释放、销毁都需要一定时间,所以为了最大限度复用线程就有了进程池,用户使用完线程之后清除该用户的数据但不销毁而是把该线程回收到线程池中,留个下1个用户继续使用;
还有1点就是可以限制并发的数量;
5.sql语句分类
DML:对数据库数据数据的操作Insert、Update、Delete、Select
DDL:对数据库对象(表、视图、索引、存储过程、存储函数)创建、删除、修改操作;Create Drop Al
Alter
DCL:Grant、Revoke 用户授权和回收权限
6.事物是什么?
一组DML就是一个事物,它具有以下特性:
原子性:一组DML(多条增、删、改、查的sql语句)要么都执行,要么都不执行;(当做1个整体来管理)
一致性:事物操作数据总量保存不变A向B转账100, A的账户少了100,B的账户就要加100,就这么简单;
隔离性:隔离多个事物,避免多个事物同时进行;
隔离级别
读未提交
读提交
可重读
可串行化
持久性:事物的数据一旦提交之后不能丢失,中间出现问题可以回滚;通过事物日志来保证;
7.Mysql的日志类型
错误日志
查询日志
慢查询日志
事物日志
二进制日志
中间日志
8.DBA职责
设计表结构、安全性和授权、保障数据库可用性、故障恢复、数据库调优
二、关系型数据库索引、数据库文件的组织方式
1.mysql的数据类型 CHAR(定长)和VARVHAR(变长)
CHAR数据类型的长度是固定的,VARCHAR数据类型的长度是可变、非固定的,
变长:VARCHAR(20) 存储root字符串占用数据库5字节空间, 优势:节省空间、其长度可变占用空间可扩展;应用在数据最大和最小长度相差太大的场景;
定长:CHAR(20) 存储root字符串占用数据库20字节空间,优势:方便搜素引擎存储、索引查找,数据最大和最小长度相差不太大的场景都要尽量使用CHAR类型;
2.数据库文件
数据文件:堆文件(组织无序)、有序文件(组织有序)、散列组织(hash函数+hash桶)
索引文件:有序索引文件、无序索引文件
日志文件:存储搜素引擎的操作记录,便于追溯、恢复数据;
3.数据库索引
聚簇索引
搜索引擎 把数据 存储在索引上所指向数据库块位置,如果索引本身有序,数据记录也是有序的,这种索引就是聚簇索引,按这种方式组织的数据库文件也叫有序数据、聚簇文件;(有序文件+有序索引文件+存储在一起)
非聚簇索引
与相反如果索引本身无序 于是数据记录就是无序的,或者索引有序、数据记录无序 这种索引就是非聚簇索引,按这种方式组织的数据库文件也叫无序数据、堆文件;
非聚簇索引包含散列(hash)索引
如果散列文件组织就使用hash算法去存储和查找;注意hash算法的时间复杂度=o(1),但不适合范围查找;因为即使数据会被hash算法随机分配到不同的hash桶里;
小结
索引和数据库文件结构关联性很大
一般树状结构索引都是有序的称为聚簇索引,辅助索引、hansh索引无序称为非聚簇索引。
4. 两大引擎存储数据库、索引文件的特征
每张表都有3个文件;
MyISM: 数据文件=表名.MYD,索引文件=表名.MYI ,表定义文件=表名.frm
InnoDB:
每张表的所有数据都放在表空间中(ibdata),表空间可以被多个位于不同数据库的表共享;
定义文件在数据库目录中;
5.MySQL数据字典
保存数据库的元数据
关系的名字
张表中各列的名字
每列的数据类型和长度
每张表上的视图名称
授权用户的名字
用户授权和账户信息
以上信息存储在mysql库;
统计类数据
每个库中属性的个数
每个表中行的个数
每个关系的存储组织方法
infomation_schema存储统计类信息;
Mysql安装自带以下3个库就是用来存储数据字典信息的;
mysql库:账号授权
information_schema库:统计类信息
performance_schema 库:存储性能相关信息
总结:^_^ 有了以上自带的3个库仿佛看到了DB可视化功能的大门~~~~
import pymysql db = pymysql.connect("172.17.10.112", "webproject", "xxxxxx1234","web") cursor = db.cursor() cursor.execute(" show variables like 'max_connections';") #查当前登录用户声明的变量 cursor.execute(" show global variables") #查当前全局声明的变量 cursor.execute("show status like '%Threads_connected%'") #查看MySQL运行状态 https://www.cnblogs.com/zuxing/articles/7761262.html print(cursor.fetchall()) # 关闭数据库连接 db.close()