MySQL—04—MySQL的其他对象

不问归期 提交于 2019-11-30 07:14:57

 

 

一、MySQL 中的其他对象

1. 索引

MySQL 索引的建立对于 MySQL 的高效运行是很重要的,索引可以大大提高 MySQL

的检索速度。

1.1MySQL 中的索引类型

• 普通索引

• 唯一索引

• 主键索引

• 组合索引

• 全文索引

1.2普通索引

是最基本的索引,它没有任何限制。在创建索引时,可以指定索引长度。length 为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度,如果是 BLOB 和 TEXT 类型,必须指定 length。

创建索引时需要注意:

  • 如果指定单列索引长度,length 必须小于这个字段所允许的最大字符个数。
  • 查询索引:SHOW INDEX FROM table_name

1.2.1直接创建索引

CREATE INDEX index_name ON table(column(length))

示例
为 emp3 表中的 name 创建一个索引,索引名为 emp3_name_index
create index emp3_name_index ON emp3(name)

 

1.2.2修改表添加索引

ALTER TABLE table_name ADD INDEX index_name (column(length))

示例
修改 emp3 表,为 addrees 列添加索引,索引名为 emp3_address_index
alter table emp3 add index emp3_address_index(address)

 

 


1.2.3创建表时指定索引列

CREATE TABLE `table` (COLUMN TYPE ,PRIMARY KEY (`id`),INDEX index_name (column(length)))

示例
创建 emp4 表,包含 emp_id,name,address 列,同时为 name 列创建索引。索引名为 emp4_name_index
create table emp4(emp_id int primary key auto_increment,name varchar(30),address varchar(50),index emp4_name_index(name))

 

1.2.4删除索引

DROP INDEX index_name ON table

示例
删除 mep3 表中索引名为 emp3_address_index 的索引
drop index emp3_address_index on emp3

 

 

1.3唯一索引

唯一索引与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。它有以下几种创建方式:

1.3.1创建唯一索引

CREATE UNIQUE INDEX indexName ON table(column(length))

示例
为 emp 表中的 name 创建一个唯一索引,索引名为 emp_name_index
create unique index emp_name_index on emp(name)

 

1.3.2修改表添加唯一索引

ALTER TABLE table_name ADD UNIQUE indexName (column(length))

示例
修改 emp 表,为 salary 列添加唯一索引,索引名为 emp_salary_index
alter table emp add unique emp_salary_index(salary)

 

1.3.3创建表时指定唯一索引

CREATE TABLE `table` (

COLUMN TYPE ,

PRIMARY KEY (`id`),

UNIQUE index_name (column(length)))

示例
创建 emp5 表,包含 emp_id,name,address 列,同时为 name 列创建唯一索引。索引名为emp5_name_index
create table emp5(emp_id int primary key ,name varchar(30),address varchar(30),unique emp5_name_index(name))

 

 

1.4主键索引

主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引。

我们只需要给表添加主键约束,MySQL就会自动给列添加主键索引;

1.4.1修改表添加主键索引

ALTER TABLE 表名 ADD PRIMARY KEY(列名)

示例
修改 emp 表为 employee_id 添加主键索引
alter table emp add primary key(employee_id)

 

1.4.2创建表时指定主键索引

CREATE TABLE `table` (

COLUMN TYPE ,

PRIMARY KEY(column))

示例
创建 emp6 表,包含 emp_id,name,address 列,同时为 emp_id 列创建主键索引
create table emp6(employee_id int primary key auto_increment,name varchar(20),addressvarchar(50))

 

1.5组合索引

组合索引是指使用多个字段创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用(最左前缀原则)。

1.5.1最左前缀原则

就是最左优先。

如:我们使用表中的 name,address,salary 创建组合索引,那么想要组合索引生效,

我们只能使用如下组合:

name/address/salary

name/address

name/

如果使用 addrees/salary 或者是 salary 则索引不会生效。

1.5.2修改添加组合索引

ALTER TABLE table_name ADD INDEX index_name (column(length),column(length))

示例
修改 emp6 表,为 name,address 列创建组合索引
alter table emp6 add index emp6_index_n_a(name,address)

 

1.5.3创建表时创建组合索引

CREATE TABLE `table` (

COLUMN TYPE ,

INDEX index_name (column(length),column(length))

)

示例
创建 emp7 表,包含 emp_id,name,address 列,同时为 name,address 列创建组合索引。
create table emp7(emp_id int primary key auto_increment ,name varchar(20),address varchar(30),index emp7_index_n_a(name,address))

 

 

1.6全文索引

全文索引(FULLTEXT INDEX)主要用来查找文本中的关键字,而不是直接与索引中的值相比较。FULLTEXT 索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的 where

语句的参数匹配。

FULLTEXT 索引配合 match against 操作使用,而不是一般的 where 语句加 like。

全文索引可以从 CHAR、VARCHAR 或 TEXT 列中作为 CREATE TABLE 语句的一部分被创建,或是随后使用 ALTER TABLE 添加。不过切记对于大容量的数据表,生成全文索

引是一个非常消耗时间非常消耗硬盘空间的做法。

1.6.1修改添加全文索引

ALTER TABLE table_name ADD FULLTEXT index_name(clumn_name)

示例一
修改 emp7 表添加 content 列类型为 TEXT
alter table emp7 add COLUMN content text;

示例二
修改 emp7 表,为 content 列创建全文索引
alter table emp7 add fulltext emp7_content_fullindex(content)

 

1.6.2创建表时创建全文索引

CREATE TABLE `table` (COLUMN TYPE ,FULLTEXT index_name (column))

示例
创 建 emp8 表 包 含 emp_id 列 , content 列 该 列 类 型 为 text , 并为该列添加名为emp8_content_fulltext 的全文索引
create table emp8(emp_id int primary key auto_increment,content text,fulltext emp8_content_fullindex(content))

 

1.6.3删除全文索引

DROP INDEX index_name ON table

ALTER TABLE table_name DROP INDEX index_name

示例
删除 emp8 表中名为 emp8_content_full 的索引。
drop index emp8_content_fullindex on emp8

 

1.7使用全文索引

全 文 索 引 的 使 用 与 其 他 索 引 不 同 。 在 查 询 语 句 中 需 要 使 用 match(column) against(‘content’) 来检索数据。

1.7.1全文解析器

全文索引中基本单位是”词”。分词,全文索引是以词为基础的,MySQL 默认的分词是所有非字母和数字的特殊符号都是分词符。

在检索数据时我们给定的检索条件也是词。

MySQL 中默认的全文解析器不支持中文分词。如果数据含有中文需要更换全文解析器

NGRAM。

1.7.2使用全文索引

SELECT 投影列 FROM 表名 WHERE MATCH(全文索引列名) AGAINST(‘搜索内容’)

示例一
修改 emp8 表,为 content 列创建名为 emp8_content_full 的全文索引
alter table emp8 add fulltext emp8_content_full(content)

示例二
向 emp8 表中插入一条数据 content 的值为”hello,bjsxt”
insert into emp8 values(default ,'hello bjsxt')

示例三
查询 emp8 表中内容包含 bjsxt 的数据。
select * from emp8 where match(content) AGAINST('bjsxt')

 

1.7.3更换全文解析器

在创建全文索引时可以指定 ngram 解析器

ALTER TABLE table_name ADD FULLTEXT index_content(content) WITH PARSER NGRAM

示例一
删除 emp8 表中的 emp8_content_full 全文索引
drop index emp8_content_full on emp8

示例二
修改 emp8 表,为 content 列添加名称为 emp8_content_full 的全文索引,并指定 ngram 全文解析器。
alter table emp8 add fulltext emp8_content_full(content) with parser ngram

示例三
向 emp8 表中添加一条数据 content 值为”你好,TJPU”
insert into emp8 values(default ,'你好,TJPU')

示例四
查询 emp8 表中内容包含”TJPU”的数据
select * from emp8 where match(content) AGAINST('TJPU')

 

 

 

 

2. MySQL 中的用户管理

MySQL 是一个多用户的数据库系统,按权限,用户可以分为两种:root 用户,超级管

理员,和由 root 用户创建的普通用户。

2.1MySQL 创建用户

CREATE USER 用户名 IDENTIFIED BY '用户密码';

2.2查看用户

SELECT USER,NOST FROM USER(该表位于 mysql 库中)

示例
创建一个 u_sxt 的用户,并查看创建是否成功。

create user u_sxt IDENTIFIED by 'sxt'
select user,host from mysql.user

 

2.3分配权限

新用户创建完后是无法登陆的,需要分配权限。

GRANT 权限 ON 数据库.表 TO 用户名@登录主机 IDENTIFIED BY "密码"

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password'     (注意:这个表示,可以查询所有数据库下的所有表;)

 

@登陆主机, 具体可以写那些:

  1. % 匹配所有主机
  2. localhost localhost 不会被解析成 IP 地址,直接通过 UNIXsocket 连接
  3. 127.0.0.1 会通过 TCP/IP 协议连接,并且只能在本机访问;
  4. ::1 ::1 就是兼容支持 ipv6 的,表示同 ipv4 的 127.0.0.1

 


(1)Unix domain socket   Unix domain socket,也叫IPC socket(inter-precess communication socket,也就是进程间通信套接字),用于同一台主机上的不同进程间交换数据,是Posix系统的标准组件。可以传输字节流(byte stream,SOCK_STREAM,TCP)或者数据报(datagram,SOCK_DGRAM,UDP).除了传输数据以外,还可以使用Unix domain socket传输文件描述符(file descriptor)。 (2)IP socket   IP socket要利用主机的传输层(tcp),可以用于同一台主机上不同进程间的通信,也可以用于网络上不同主机间的通信。 Unix domain socket vs IP socket

  运行在同一台机器上的两个进程需要通信,有2种实现方式:第一种是ip socket,通过本机回环地址127.0.0.1加端口实现;第二种是通过unix domain socket实现。哪一种效率更高呢?基于localhost的ip socket需要实现跨网络主机通讯的全部环节,包括建立socket连接,ACk开销,tcp流控,封装/解封,路由。在这个过程中还会有2个context switch,因为使用网络层传输数据需要调用system call,而调用system call会产生中断,导致context switch的;另外一个进程接受到来自网络层的连接请求,也会产生系统中断,导致context switch。以上过程导致2个context switch的开销,外加其它各种开销(overhead)。

 

 

 

2.3.1权限列表

ALTER: 修改表和索引。

CREATE: 创建数据库和表。

DELETE: 删除表中已有的记录。

DROP: 删除数据库和表。

INDEX: 创建或删除索引。

INSERT: 向表中插入新行。

SELECT: 检索表中的记录。

UPDATE: 修改现存表记录。FILE: 读或写服务器上的文件。

PROCESS: 查看服务器中执行的线程信息或杀死线程。

RELOAD: 重载授权表或清空日志、主机缓存或表缓存。

SHUTDOWN: 关闭服务器。

USAGE: 特殊的 "无权限" 权限

ALL: 所有权限,ALL PRIVILEGES 同义词。

示例
为 u_sxt 用户分配只能查询 bjsxt 库中的 employees 表,并且只能在本机登陆的权限。
grant select ON bjsxt.employees to 'u_sxt'@'localhost' IDENTIFIED by 'sxt'

 

2.4刷新权限

每当调整权限后,通常需要执行以下语句刷新权限

FLUSH PRIVILEGES

2.5删除用户

DROP USER username@localhost

示例
删除 u_sxt 用户
drop user 'u_sxt'@'localhost'

 

 

 

 

3. 通过 Navicat 工具管理用户

3.1创建用户

3.2分配权限

3.3删除用户

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!