一、创建用户
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
1.7、第三方软件登录
比如navicat,dbeaver,放开来源地址即可。
二、数据库用户授权
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 | 允许用户创建或删除触发器 |
三、索引
索引(index)是帮助mysql高效获取数据的有序数据结构。这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
3.1、索引的概念
- 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。
- 使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度。
- 索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容。
- 索引是表中一列或者若干列值排序的方法。
- 建立索引的目的是加快对表中记录的查找或排序
- 需要额外的磁盘空间
3.2、索引的作用
●设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询速度,这是创建索引的最主要的原因。
●当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度。
●可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本。
●通过创建唯一(键)性索引,可以保证数据表中每一行数据的唯一性。
●可以加快表与表之间的连接。
●在使用分组和排序时,可大大减少分组和排序的时间,降低cpu消耗。
简单来说:索引就是一种帮助系统更快的查找信息的数据结构
如果没有索引,则一个一个查,比如找lisi,会全表扫描(不能保证最后没有lisi(只有一个lisi))
3.3、索引的副作用
●索引需要占用额外的磁盘空间。
对于 MyISAM 引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。
而 InnoDB 引擎的表数据文件本身就是索引文件。
●在插入,删除和修改数据时要花费更多的时间(效率降低),因为索引也要随之变动。
3.4、创建索引的原则依据
索引虽可以提升数据库查询的速度,但并不是任何情况下都适合创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。
●表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是子表的主键,查询时可以快速定位
●记录数超过300行的表应该有索引。如果没有索引,需要把表遍历一遍,会严重影响数据库的性能。
●经常与其他表进行连接的表,在连接字段上应该建立索引。
●唯一性太差的字段不适合建立索引。
●更新太频繁地字段不适合创建索引。
●经常出现在 where 子句中的字段,特别是大表的字段,应该建立索引。
●索引应该建在选择性高的字段上。
●索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引。
3.5、MySQL 的优化 哪些字段/场景适合创建索引,哪些不适合
适合创建索引的场景如下
1、小字段
2、唯一性强的字段
3、更新不频繁,但查询率很高的字段
4、表记录超过300+行
5、主键、外键、唯一键
不适合就相反
3.6、mysql的索引结构
mysql的索引是在存储引擎层实现的,不同的存储引擎索引不同(在章节四有存储引擎),主要包含以下几种:
- b+tree索引 最常见的索引类型,大部分引擎都支持b+树索引
- hash索引 底层数据结构是用哈希表实现的,只有精确匹配索引列的查询才有效,不支持范围查询
- R-tree(空间索引) 空间索引是myisam引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少
- full-text(全文索引) 是一种通过建立倒排索引,快速匹配文档的方式。类似于Lucene,Solr,ES
默认b+tree索引
【前置资源】有简答的介绍几种结构
3.6.1、结构引擎支持情况
索引类型 | InnoDB | MyISAM | Memory | Ful-text |
---|---|---|---|---|
B+tree索引 | 支持 | 支持 | 支持 | 不适用 |
Hash索引 | 支持 | 不支持 | 支持 | 不适用 |
R-tree索引 | 不支持 | 支持 | 不支持 | 不适用 |
Full-text索引 | 5.6版本之后支持 | 不支持 | 不支持 | 支持 |
3.7、索引的分类
- 普通索引
- 唯一索引
- 主键索引
- 组合索引(单列索引与多列索引)
- 全文索引(FULLTEXT)
索引类型 | 关键字 | 唯一性要求 | 允许空值 | 主要用途 |
---|---|---|---|---|
普通索引 | key 或 index | 否(由字段约束决定) | 是 | 提高查询效率 |
唯一索引 | unique | 是 | 否 | 保证数据唯一性,提高查询效率 |
主键索引 | primary key | 是 | 否 | 唯一标识表中的每一行数据,提高查询效率,维护数据完整性和一致性 |
单列索引 | index(针对单列) | 否(由字段约束决定) | 是(除非有NOT NULL约束) | 提高针对单个字段的查询效率 |
组合索引 | index(针对多列) | 否(由字段组合的唯一性决定) | 是(除非有NOT NULL约束) | 提高针对多个字段组合的查询效率 |
全文索引 | fulltext | 否 | 是 | 在大量文本数据中快速搜索特定关键字 |
3.8、索引的创建
创建方法有三
●1、直接创建索引
create index 索引名 on 表名(列名[length]);
#(列名(length)):length是可选项。如果忽略 length 的值,则使用整个列的值作为索引。
如果指定使用列前的 length 个字符来创建索引,这样有利于减小索引文件的大小。
索引名建议以“ _index ”结尾。
示例:
create index phone_index on hhhhh (phone);
show create table hhhhh;
●2、修改表方式创建
alter table 表名 add index 索引名 (列名);
例:alter table ky20 add index id_index (id);
select id from hhhhh;
select id,name from hhhhh;
●3、创建表的时候指定索引
create table 表名 ( 字段1 数据类型,index 索引名 (列名));
例:
create table test(id int(4) not null,name varchar(10) not null,cardid varchar(18) not null,index id_index (id));
show create table test;
- 唯一索引是unique index 代替index (大同小异)
- 主键索引是唯一索引,必须指定为“primary key”。2,3方式创建 不用索引名 primary key取代index 索引名一个表只能有一个主键,不允许有空值。 添加主键将自动创建主键索引。
- 组合索引(单列索引与多列索引)可以是单列上创建的索引,也可以是在多列上创建的索引。需要满足最左原则,因为select语句的 where条件是依次从左往右执行的,所以在使用select 语句查询时where条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。
create table 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型, index 索引名 (列名1,列名2,列名3));
- 全文索引,适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。在 MySQL5.6 版本以前FULLTEXT 索引仅可用于 MyISAM 引擎,在 5.6 版本之后 innodb 引擎也支持 FULLTEXT 索引。全文索引可以在 CHAR、VARCHAR 或者 TEXT 类型的列上创建。每个表只允许有一个全文索引。
直接创建方式1是 fulltext index代替index , 方法2,3是 fulltext代替index
使用全文索引查询
select * from 表名 where match(列名) against('查询内容');
例:
select * from member where match(remark) against('this is vip');
or select * from member where remark='this is vip';
3.9、查看索引
除了直接查看表结构外还有
一般加上\G看的更直观一些
show index from 表名;
show index from 表名\G; 竖向显示表索引信息
show keys from 表名;
show keys from 表名\G;
各字段的含义如下:
- Table 表的名称
- Non_unique 如果索引内容唯一,则为 0;如果可以不唯一,则为 1。
- Key_name 索引的名称。
- Seq_in_index 索引中的列序号,从 1 开始。 limit 2,3
- Column_name 列名称。
- Collation 列以什么方式存储在索引中。在 MySQL 中,有值‘A’(升序)或 NULL(无分类)。
- Cardinality 索引中唯一值数目的估计值。
- Sub_part 如果列只是被部分地编入索引,则为被编入索引的字符的数目(zhangsan)。如果整列被编入索引,则为 NULL
- Packed 指示关键字如何被压缩。如果没有被压缩,则为 NULL。
- Null 如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO。
- Index_type 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
- Comment 备注。
3.10、索引的删除
●直接删除索引
drop index 索引名 on 表名;
例:
drop index name_index on member;
●修改表方式删除索引
alter table 表名 drop index 索引名;
例:
alter table member drop index id_index;
show index from member;
删除主键索引
alter table 表名 drop primary key;
3.11、小结
索引分为:
① 普通索引 :针对所有字段,没有特殊的需求/规则
② 唯一索引 : 针对唯一性的字段,仅允许出现一次空值
③ 组合索引 (多列/多字段组合形式的索引)
④ 全文索引(varchar char text)MySQL为了优化对文本内容搜索的一种机制
⑤ 主键索引 :针对唯一性字段、且不可为空,同时一张表只允许包含一个主键索引
创建索引:
① 在创建表的时候,直接指定index
② alter修改表结构的时候,进行add 添加index
③ 直接创建索引index
PS:主键索引——>会直接创建主键