1、数据库的存储引擎
'''
Mysql的体系结构
第一层:网络连接层 客户端连接数据库
第二层:核心层,服务层 MySQL Server,查询缓存,存储过程,
第三层:存储引擎层(MyISAM、InnoDB等) show engines;显示存储引擎的种类 show variables like '%storage_engine%';默认存储引擎的版本
第四层:系统文件层
mysql5.5之前的版本默认的存储引擎是MyISAM
MyISAM存储引擎表由MYD(数据文件)和MYI(索引文件)组成的 存储路径:G:\phpstudy\phpstudy_pro\Extensions\MySQL8.0.12\data\python@002d01
特点:不支持事务的应用(银行,订单系统不适用) 适合只读类型的应用
1、并发性(不好)和锁级别(表锁)
2、表损坏修复(会丢失数据) check table 表名称;#检查表数据 repair table 表名称;#修复表数据
3、MyISAM表支持数据压缩 linux:myisampack -b -f mylsam.MYI 压缩过后.old备份文件,.MYI文件就是压缩文件 (压缩完成后的表可以进行查询,不能写入数据)
mysql-锁
锁的作用是管理共享资源的并发访问
锁用于实现事务的隔离性
锁的类型
共享锁(也叫读锁),针对同一份数据,多个读操作可以同时进行而不会互相影响
独占锁(也叫写锁),当前写操作没有完成前,它会阻断其他写锁和读锁
'''
'''
MySQL引擎之Innodb(重要)
Innodb使用表空间进行数据存储
show variables like 'innodb_file_per_table'; # 显示表空间
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set, 1 warning (0.00 sec)
set global innodb_file_per_table=off; # 关闭引擎innodb
innodb_file_per_table
ON:独立的表空间,tablename.ibd 独立表空间可以同时向多个文件刷新数据 存储位置:G:\phpstudy\phpstudy_pro\Extensions\MySQL8.0.12\data
OFF:系统表空间:ibdataX (X是一个数字) 系统表空间会产生IO瓶颈,刷新数据的时候是顺序进行的所以会产生文件的IO瓶颈
innodb存储引擎的特性: 对比MyISAM存储引擎
1、支持事务的ACID特性
2、innodb支持行级锁,可以最大程度的支持并发 (行级锁:修改数据库数据的时候只会锁住当前修改的行,不会将整个表都锁住,区别于表级锁)
MyISAM和InnoDB的对比:
对比项 MyISAM InnoDB
主外键 不支持 支持
事务 不支持 支持
行表锁 表锁,即使操作一条数据也会将整个表锁住,不适合高并发 行锁,操作时候只锁一行,不对其他的行有影响,适合高并发的操作
缓存 只缓存索引,不缓存真实数据 不仅缓存索引还缓存真实数据,对内存的要求较高,且内存大小对性能有决定性的影响
表空间 小 大
关注点 性能 事务
'''
'''
MySQL引擎之CSV 适合作为数据交换的中间表,传给其他的表
数据是以文本的方式存储在文件中的
.CSV文件存储表内容
.CSM文件存储表的元数据,如表状态和数据量
.frm文件存储表结构信息
特点:不支持主键、自增、不允许为空
'''
'''
MySQL引擎之Memory (内存)
也称为HEAP引擎,所以数据保存在内存中,如果MySQL服务重启数据会丢失,但是表结构会保存下来。
功能特点:
支持HASH索引(哈希索引)和BTree索引,HASH索引用在等值查找(查找条件是一个数值),BTree索引用在范围查找(between ,in)
所有字段都为固定长度varchar(10)=char(10)(不同于其他的引擎)
不支持BLOG和TEXT等大字段(内存空间有限)
'''
2、账户管理
在生产环境下操作数据库时,绝对不可以使用root账户连接,而是创建特定的账户,授予这个账户特定的操作权限,然后连接进行操作,主要的操作就是数据的crud(增删改查)
MySQL账户体系:根据账户所具有的权限的不同,MySQL的账户可以分为以下几种
- 服务实例级账号:,启动了一个mysqld,即为一个数据库实例;如果某用户如root,拥有服务实例级分配的权限,那么该账号就可以删除所有的数据库、连同这些库中的表
- 数据库级别账号:对特定数据库执行增删改查的所有操作
- 数据表级别账号:对特定表执行增删改查等所有操作
- 字段级别的权限:对某些表的特定字段进行操作
- 存储程序级别的账号:对存储程序进行增删改查的操作
账户的操作主要包括创建账户、删除账户、修改密码、授权权限等
授予权限
需要使用实例级账户登录后操作,以root为例
主要操作包括:
- 查看所有用户
- 修改密码
- 删除用户
- 查看所有用户
所有用户及权限信息存储在mysql数据库的user表中
desc user; --查看user表的结构
主要字段说明:
--Host表示允许访问的主机
--User表示用户名
--authentication_string表示密码,为加密后的值
查看所有用户
select host,user,authentication_string from user;
-
创建账户、授权
需要使用实例级账户登录后操作,以root为例
常用权限主要包括:create、alter、drop、insert、update、delete、select
如果分配所有权限,可以使用all privileges2.1 创建账户&授权
grant 权限列表 on 数据库 to '用户名'@'访问主机' identified by '密码';
2.2 示例1
创建一个laowang的账号,密码为123456,只能通过本地访问, 并且只能对jd数据库中的所有表进行读操作
step1:使用root登录
mysql -uroot -p
--回车后写密码,然后回车
step2:创建账户并授予所有权限
grant select on jd.* to 'laowang'@'localhost' identified by '123456';
说明
-
可以操作python数据库的所有表,方式为:jd.*
-
访问主机通常使用 百分号% 表示此账户可以使用任何ip的主机登录访问此数据库
-
访问主机可以设置成 localhost或具体的ip,表示只允许本机或特定主机访问
-
查看用户有哪些权限:
show grants for laowang@localhost;
step3:退出root的登录
quit
step4:使用laowang账户登录
mysql -ulaowang -p
--回车后写密码,然后回车
2.3 示例2
创建一个laoli的账号,密码为12345678,可以任意电脑进行链接访问, 并且对jd数据库中的所有表拥有所有权限
grant all privileges on jd.* to "laoli"@"%" identified by "12345678"