目录
一.MySQL的账户管理
MySQL账户管理是管理MySQL数据库系统中用户账户和权限的过程。
超级用户(Superuser):拥有所有权限,比如root用户。
普通用户(Regular User):具有特定权限的用户,可以是数据库管理员或普通应用程序用户。
1.存放用户信息的表
mysql 的用户 放在mysql数据库中的user表中
可以使用命令查询
select user,host,authentication_string from mysql.user;
#user:用户名 host:主机地址域名 authentication_string:用户密码
2.查看当前使用的用户
(root@localhost) [none]> select user();
3.新建用户
在使用明文密码时取消密码安全性策略
set global validate_password_policy=0;
#是在 MySQL 中禁用密码验证策略的全局设置。这意味着 MySQL 将不再强制执行对新用户密码的任何密码策略检查,比如最小长度要求或特殊字符的要求。
set global validate_password_length=1;
#在 MySQL 中启用密码长度验证策略的全局设置。这意味着 MySQL 将强制要求新用户密码满足最小长度要求。
create user zxy@'192.168.240.%' identified by '123123';
远程登录主机mysql
mysql -uzxy -h192.168.240.13 -p'123123'
修改用户密码可以通过after命令实现
alter user zxy@'192.168.240.%' identified by 'abc123';
4.修改用户名称
示例:
rename user 'zxy'@'192.168.240.%' to 'lisi'@'192.168.240.%';
select user,host,authentication_string from mysql.user;
5.删除用户
示例:
drop user cxk@'192.168.240.%';
select user,host,authentication_string from mysql.user;
6.修改用户密码
密码有安全性策略可以将策略取消
set global validate_password_policy=0;
#是在 MySQL 中禁用密码验证策略的全局设置。这意味着 MySQL 将不再强制执行对新用户密码的任何密码策略检查,比如最小长度要求或特殊字符的要求。
set global validate_password_length=1;
#在 MySQL 中启用密码长度验证策略的全局设置。这意味着 MySQL 将强制要求新用户密码满足最小长度要求。
示例:
set password = '123123';
修改其他用户密码
set password for 'lisi'@'192.168.240.%' = password('123123');
7.破解密码
修改配置文件
vim /etc/my.cnf
[mysqld]
skip-grant-tables
#数据库的单用户模式
skip-networkingv
update mysql.user set authentication_string='' where user='root' and host='localhost';
#注意刷新后生效
flush privileges;
#skip-grant-tables:这个选项会让 MySQL 服务器启动时不执行权限验证,
即所有用户都能够以超级用户的权限登录数据库。
这在某些紧急情况下可以帮助恢复丢失了管理员密码的访问,
但同时也存在安全风险,因为任何人都可以访问数据库并执行操作。
skip-networking:这个选项会禁用 MySQL 服务器的网络连接功能,
使其只能本地访问,即只能通过本地的 Unix Socket 或者命名管道进行连接,
而不能通过 TCP/IP 连接。这对于某些安全要求较高的环境来说可能是一个好的选择。
需要注意的是,使用这些选项可能会降低 MySQL 数据库的安全性和可用性,
因此在正常操作中应该避免长期启用它们。在完成特定的维护或紧急恢复任务后,
记得恢复这些选项的默认设置,并确保数据库的安全和正常运行。
8. 远程登录
mysql -uzxy -h192.168.240.13 -p'123123'
9.用户权限管理
9.1 权限类别
管理类 、程序类、 数据库级别、 表级别、 字段级别
管理类:
-
CREATE USER:允许用户创建、更改和删除 MySQL 用户账号。
-
FILE:允许用户在服务器上读写文件。
-
SUPER:允许执行多个特权操作,例如启动或停止服务器,设置全局变量等。
-
SHOW DATABASES:允许用户查看所有数据库的列表。
-
RELOAD:允许用户重新加载服务器配置文件。
-
SHUTDOWN:允许用户关闭服务器。
-
REPLICATION SLAVE:允许用户查询从属服务器状态。
-
REPLICATION CLIENT:允许用户查询主服务器和从属服务器的状态。
-
LOCK TABLES:允许用户锁定表,使得其他用户不能访问该表,用于备份和恢复。
-
PROCESS:允许用户查看当前正在执行的进程。
-
CREATE TEMPORARY TABLES:允许用户创建临时表。临时表在会话结束时自动删除。
数据库级别权限
-
ALTER:允许用户修改数据库的结构,如更改表的结构或删除索引。
-
CREATE:允许用户在数据库中创建新的表或索引。
-
CREATE VIEW:允许用户创建视图,即虚拟表。
-
DROP:允许用户删除数据库中的表或索引。
-
SHOW VIEW:允许用户查看数据库中的视图定义。
-
WITH GRANT OPTION:允许用户将自己拥有的权限授予给其他用户,即可以授权其他用户。
数据库表级别权限
-
ALTER:允许用户修改表结构,如添加、删除或修改列,修改索引等。
-
CREATE:允许用户在数据库中创建新表。
-
CREATE VIEW:允许用户创建视图。
-
DROP:允许用户删除表或视图。
-
INDEX:允许用户创建或删除表的索引。
数据库操作:
-
SELECT:允许用户从表中读取数据,即执行查询操作。
-
INSERT:允许用户向表中插入新数据。
-
DELETE:允许用户从表中删除数据。
-
UPDATE:允许用户更新表中已有的数据。
字段级别:
1.SELECT(col1,col2,...)
2.UPDATE(col1,col2,...)
3.INSERT(col1,col2,...)
所有权限:
ALL PRIVILEGES 或 ALL :授予用户或角色在指定范围内的所有权限。
9.2 查看权限
示例:
查看李四用户权限
show grants for 'lisi'@'192.168.240.%';
9.3 授予权限
GRANT语句:专门用来设置数据库用户的访问权限。当指定的用户名不存在时,GRANT语句将会创建新的用户;当指定的用户名存在时, GRANT 语句用于修改用户信息。
示例:
允许用户lisi 在本地查询主机数据库中所有表的数据记录,但禁止查询其他数据库中的表的记录。
grant select on hellodb.students to 'lisi'@'192.168.240.%' identified by '123123';
允许用户 lisi 在所有终端远程连接 mysql ,并拥有所有权限。
grant all on *.* to 'lisi'@'192.168.240.%' identified by '123123';
flush privileges;
#刷新
9.4 撤销权限
示例:
撤销用户lisi的权限
revoke all on *.* from 'lisi'@'192.168.240.%';
撤销lisi用户的所有权限
二.索引
索引:是排序的快速查找的特殊数据结构,定义作为查找条件的字段上,又称为键key,索引通过存储引擎实现
索引的概念:
索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。
使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度。
索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容。
索引是表中一列或者若干列值排序的方法。
建立索引的目的是加快对表中记录的查找或排序。
索引结构:
二叉树结构
B-Tree 索引
缺点:
1.连续范围查找都要从头开始,效率不稳定,快的很快,慢的就比较慢
2.所存数据量越大,查找次数越多
B+Tree 索引
B+Tree索引:按顺序存储,每一个叶子节点到根结点的距离是相同的;左前缀索引,适合查询范围类的数据
B+Tree
查找效率不统一
高度一般为2-3层,它就能满足千万级的数据存储,解决了btree 需要7-8层才能达到千万级别
1. 索引管理
1.1 查看索引
show index from 表名;
show keys from 表名;
示例:
show index from students;
show keys from hellodb.students;
1.2 建立索引
示例:
未创建索引前没有显示索引
搜索students表中xu xian 查看使用的索引
select * from students where name='xu xian';
explain select * from students where name='xu xian';#查看使用的索引
创建一个名为idx_name的索引,查看索引
使用explain 命令查看 搜索xu xian 使用的索引
create index idx_name on students(name(5));#‘5’索引会只考虑name字段的前5个字符作为索引的一部分。
show index from students;
explain select * from students where name='xu xian';
show create table students\G; #查看索引创建是否成功
create index idx_name on students(name); #给students 表加 name表
explain select * from students where name like 's%'; #找s开头的人看会使用索引
explain select * from students where name like '%s'; #找s结尾的人不会使用索引
explain select * from students where name like '%s%'; #包含s的不会调用索引
explain select * from students where name like 'x%'; #以x开头的会使用索引
1.3 删除索引
直接删除索引
示例:
删除建立在students表上的索引 idx_name
drop index idx_name on students;
show index from students;
2. EXPLAIN 工具
以通过EXPLAIN来分析索引的有效性,获取查询执行计划信息,用来查看查询优化器如何执行查询
示例:
查询students表中的xu xian 查看索引是否有效
explain select * from students where name='xu xian';
字段说明
列名 | 说明 |
---|---|
id | 执行编号,标识select所属的行。如果在语句中没子查询或关联查询,只有唯一的select,每行都将显示1。否则,内层的select语句一般会顺序编号,对应于其在原始语句中的位置 |
select_type | 简单查询:SIMPLE|复杂查询:PRIMARY(最外面的SELECT)、DERIVED(用于FROM中的子查询)、UNION(UNION语句的第一个之后的SELECT语句)、UNIONRESUlT(匿名临时表)、SUBQUERY(简单子查询) |
table | 访问引用哪个表(引用某个查询,如“derived3”) |
type | 关联类型或访问类型,即MySQL决定的如何去查询表中的行的方式 |
possible_keys | 查询可能会用到的索引 |
key | 显示mysql决定采用哪个索引来优化查询 |
key_len | 显示mysql在索引里使用的字节数 |
ref | 当使用索引列等值查询时,与索引列进行等值匹配的对象信息 |
rows | 为了找到所需的行而需要读取的行数,估算值,不精确。通过把所有rows列值 |
Extra | 额外信息 Using index:MySQL将会使用覆盖索引,以避免访问表 Using where:MySQL服务器将在存储引擎检索后,再进行一次过滤 Using temporary:MySQL对结果排序时会使用临时表 Using filesort:对结果使用一个外部索引排序 |
说明: type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:NULL> system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery >range > index > ALL ,一般来说,得保证查询至少达到range级别,最好能达到ref
类型 | 说明 |
---|---|
All | 最坏的情况,全表扫描 |
index | 和全表扫描一样。只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。如在Extra列看到Using index,说明正在使用覆盖索引,扫描索引的数据,它比按索引次序全表扫描的开销要小很多 |
range | 范围扫描,一个有限制的索引扫描。key 列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可以使用 range |
ref | 一种索引访问,它返回所有匹配某个单个值的行。此类索引访问只有当使用非唯一性索引或唯一性索引非唯一性前缀时才会发生。这个类型跟eq_ref不同的是,它用在关联操作只使用了索引的最左前缀,或者索引不是UNIQUE和PRIMARY KEY。ref可以用于使用=或<=>操作符的带索引的列。 |
eq_ref | 最多只返回一条符合条件的记录。使用唯一性索引或主键查找时会发生 (高效) |
const | 当确定最多只会有一行匹配的时候,MySQL优化器会在查询前读取它而且只读取一次,因此非常快。当主键放入where子句时,mysql把这个查询转为一个常量(高效) |
system | 这是const连接类型的一种特例,表仅有一行满足条件。 |
Null | 意味着mysql能在优化阶段分解查询语句,在执行阶段甚至用不到访问表或索引(高效) |
3.使用profile 工具监控
#打开后,会显示语句执行详细的过程
set profiling = ON;
#查看语句,注意结果中的query_id值
show profiles ;
#显示语句的详细执行步骤和时长
Show profile for query #
show profile for query 1;
三.存储引擎
InnoDB:默认的存储引擎,支持事务、行级锁定和外键约束,适合处理需要高并发和事务支持的应用。
MEMORY:基于哈希的存储引擎,数据存储在内存中,适合临时表的使用,不支持事务、XA或保存点。
1.myisam 与innodb的区别
2.myisam简介
3.innodb简介
4.其它存储引擎
5.管理存储引擎
查看mysql支持的存储引擎
show engines;
show table status like 'user'\G #这张表用的是 myisam
查看当前默认的存储引擎
show variables like '%storage_engine%';
设置默认的存储引擎
vim /etc/my.cnf
[mysqld]
default_storage_engine = InnoDB
查看库中所有表使用的存储引擎
格式: show table status from db_name;
show table status from hellodb;
查看库中指定表的存储引擎
show table status like 'students';
show create table students;
设置表的存储引擎
CREATE TABLE tb_name(... ) ENGINE=InnoDB;
ALTER TABLE tb_name ENGINE=InnoDB;
6.MySQL 中的系统数据库
7.存储过程
存储过程:多表SQL的语句的集合,可以独立执行,存储过程保存在mysql.proc表中
存储过程优势
存储过程把经常使用的SQL语句或业务逻辑封装起来,预编译保存在数据库中,当需要时从数据库中直接调用,省去了编译的过程,提高了运行速度,同时降低网络数据传输量
delimiter//
create procedure name(IN id int)
begin
select * from students where stuid = id;
END//
delimiter;
call name(2);