一、创建用户
DCL主要用于定义数据库的安全性和访问权限,包括创建用户、授予权限、撤销权限等。
CREATE USER
属于DCL因为它关注的是数据库的安全性和用户管理
格式
create user '用户名'@'来源地址' [identified by [password] '密码' ];
- '用户名':指定将创建的用户名.
- '来源地址':指定新创建的用户可在哪些主机上登录,可使用IP地址、网段、主机名的形式,本地用户可用localhost,允许任意主机登录可用通配符%
- '密码':若使用明文密码,直接输入'密码',插入到数据库时由Mysql自动加密;没有password也自动加密md5
- 若使用加密密码,需要先使用SELECT PASSWORD('密码');获取密文,再在语句中添PASSWORD '密文';(麻烦)
- 若省略“IDENTIFIED BY"部分,则用户的密码将为空(不建议使用)
- 用户账户是通过用户名(User)和主机名(Host)的组合来唯一确定的。如果你发现有两个用户具有相同的用户名但不同的主机名(Host),这意味着它们被视为两个不同的用户账户
示例
create user 'zhangsan'@'localhost' identified by 'abc123';
可以使用md5在线解密破解,md5解密加密 (cmd5.com)在线破解(有些复杂的不行)
1.1、查看用户信息
创建后的用户保存在mysql 数据库的user表里
use mysql;
select User,authentication_string,Host from user;
1.2、重命名指定
rename user 'zhangsan'@'localhost' to 'lisi'@'localhost';
用户名和链接地址都可以改
1.3、删除用户
drop user 'lisi'@'localhost';
1.4、修改当前密码
set password=password('abc123');
1.5、修改其他用户密码
set password for 'lisi'@'localhost' = password('abc123T');
1.6、忘记root密码的解决办法
修改/etc/my.cnf 配置文件,免密登陆mysql
vim /etc/my.cnf
[mysqld]
skip-grant-tables #添加,使登录mysql不使用授权表
需要重启mysql(报备)
systemctl restart mysqld
直接登录回车 mysql -u root -p
修改密码(然后使用SQL语句修改密码)
update mysql.user set authentication_string = password('abc123') where user='root';
可以刷新一下权限
flush privileges;
把skip-grant-tables注释掉
重启
systemctl restart mysqld
二、数据库用户授权
2.1、grant 提权
grant 权限列表 on 数据库名.表名 to '用户名'@'来源地址' [identified by '密码']
权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如“select, insert,
update”。使用"all"表示所有权限,可授权执行任何操作。all也可以完整写all privileges
数据库名.表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符"*"。
例如,使用“xx库.*"表示授权操作的对象为xx库数据库中的所有表。
'用户名@来源地址':用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。来源地址可以是域名、IP地址,还可以使用“%”通配符,表示某个区域或网段内的所有地址,如“%.xyw.com"、“192.168.80.%”等。
可以直接创建用户,后面加上密码
如果写了密码,相当于改密码了
单纯提权不用加后面的密码
只有权限范围是数据库换了,查看权限才会显示多个。
2.2、刷新权限
flush privileges;
2.3、查看权限
show grants for 用户名@来源地址;
2.4、撤销权限
revoke 权限列表 on 数据库名.表名 from 用户名@来源地址;
USAGE权限只能用于数据库登陆,不能执行任何操作; USAGE权限不能被回收,即REVOKE不能删除用户。
2.5、权限列表
授权用户权限是all privilege。这个all privilege都有哪些权限?all privilege权限如下
权限名称 | 描述 |
---|---|
insert | 允许用户向表中插入新行 |
select | 允许用户从表中查询数据 |
update | 允许用户更新表中的现有数据 |
delete | 允许用户从表中删除数据 |
create | 允许用户创建新的数据库和表 |
drop | 允许用户删除数据库和表 |
references | 允许用户创建外键约束(在某些数据库系统中可能不直接作为权限列出) |
index | 允许用户创建或删除索引 |
alter | 允许用户修改现有表的结构(如添加、删除或修改列) |
create temporary tables | 允许用户创建临时表 |
lock tables | 允许用户对表进行锁定操作 |
execute | 允许用户执行存储过程 |
create view | 允许用户创建视图 |
show view | 允许用户查看视图的定义(在某些数据库系统中,查看视图内容通常通过SELECT实现) |
create routine | 允许用户创建存储过程和函数 |
alter routine | 允许用户修改存储过程和函数的定义 |
event | 允许用户创建、修改和删除事件调度器中的事件(MySQL特有) |
trigger | 允许用户创建或删除触发器 |
三、索引
3.1、索引的概念
- 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。
- 使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度。
- 索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容。
- 索引是表中一列或者若干列值排序的方法。
- 建立索引的目的是加快对表中记录的查找或排序
- 需要额外的磁盘空间
3.2、索引的作用
●设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询速度,这是创建索引的最主要的原因。
●当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度。
●可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本。
●通过创建唯一(键)性索引,可以保证数据表中每一行数据的唯一性。
●可以加快表与表之间的连接。
●在使用分组和排序时,可大大减少分组和排序的时间
简单来说:索引就是一种帮助系统更快的查找信息的数据结构
3.3、索引的副作用
●索引需要占用额外的磁盘空间。
对于 MyISAM 引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。
而 InnoDB 引擎的表数据文件本身就是索引文件。
●在插入和修改数据时要花费更多的时间,因为索引也要随之变动。
3.4、创建索引的原则依据
索引虽可以提升数据库查询的速度,但并不是任何情况下都适合创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。
●表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是子表的主键,查询时可以快速定位
●记录数超过300行的表应该有索引。如果没有索引,需要把表遍历一遍,会严重影响数据库的性能。
●经常与其他表进行连接的表,在连接字段上应该建立索引。
●唯一性太差的字段不适合建立索引。
●更新太频繁地字段不适合创建索引。
●经常出现在 where 子句中的字段,特别是大表的字段,应该建立索引。
●索引应该建在选择性高的字段上。
●索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引。
3.5、MySQL 的优化 哪些字段/场景适合创建索引,哪些不适合
1、小字段
2、唯一性强的字段
3、更新不频繁,但查询率很高的字段
4、表记录超过300+行
5、主键、外键、唯一键