Mysql高级(索引、视图、事务)

1.Linux安装Mysql

0.创建虚拟机

1.安装wget

yum install -y wget

备注:
yum
提供了查找、安装、删除某一个、一组甚至全部软件包的命令
-y(当安装过程提示选择全部为 “yes”)

wget
是一个从网络上自动下载文件的*工具

2.备份

cd /etc/yum.repos.d/

mv CentOS-Base.repo CentOS-Base.repo_bak

备注:
cd命令用于切换当前工作目录
mv命令用来为文件或目录改名、或将文件或目录移入其它位置。
以上的意思是把CentOS-Base.repo改个名字 备个份。

3.更换阿里云yum源

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

备注:
以上的意思是:下载文件并以指定的文件名保存文件

》将Centos的yum源更换为国内的阿里云源
下载ailiyun的yum源配置文件到/etc/yum.repos.d/

4. 清除YUM缓存并建立缓存

yum clean all

yum makecache

备注:
yum clean all 清除所有 包文件rpm和头文件header

yum makecache 就是把服务器的包信息下载到本地电脑缓存起来

5.查询mariadb并卸载自带的版本

rpm -qa | grep mariadb

rpm -e --nodeps mariadb-libs-5.5.65-1.el7.x86_64(版本根据查询到的)

备注:
rpm 命令用于管理套件。
-a 选项是查询所有已经安装的软件包。
-q 是查询一个包是否安装

grep
它是一种强大的文本搜索工具

mariadb
数据库管理系统是MySQL的一个分支

rpm -e --nodeps 命令是删除某个软件包

6.下载mysql的repo源并安装rpm包

cd /opt/

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

rpm -ivh mysql-community-release-el7-5.noarch.rpm

备注:
RPM文件通常用于在Linux系统上安装程序。

7. 安装mysql

yum install mysql-server -y

8.授予权限

chown -R root:root /var/lib/mysql

chown root /var/lib/mysql/

备注:
chown 命令用于设置文件所有者和文件关联组的命令。
-R : 处理指定目录以及其子目录下的所有文件

》以上两个都是为了将权限设置成root

9.重启mysql数据库

service mysqld restart

10.登录mysql数据库并授权

mysql -u root -p
回车

use mysql

update user set Password = password(‘ok’) where User=‘root’;

GRANT ALL PRIVILEGES ON . TO root@"%" IDENTIFIED BY “ok”;

备注:
设置指定用户名为root,密码为ok,可访问所有数据库。

11.使配置生效并退出

flush privileges;

exit

12.安装vim并设置字符集

yum install -y vim

vim /etc/my.cnf

添加

character-set-server=utf8
Mysql高级(索引、视图、事务)
备注:
vim 编辑器

13.重启mysql

service mysqld restart

14.登录mysql数据库

mysql -uroot -pok

2.Mysql索引

2.1 说明

数据库是全表扫描,比如一个表有1万以上的数据,
那么就会从头开始扫描到最后,效率很慢,
有了索引之后,就会利用一个数据结构—》Btree
利用二叉树的原理,将很快。

图示:(摘录)
Mysql高级(索引、视图、事务)
举例1:
比如目录,你要查500页,他就会先查400-600的,然后再细分,跟查字典一样。

举例2:
查询所有最慢,查询一个普通列正常,查询索引比如id主键,那就很快。

2.2 索引定义

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

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

2.3 索引种类

主键索引

它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候指定了主键,就会创建主键索引, CREATE INDEX不能用来创建主键索引,使用 ALTER TABLE来代替。

普通索引

一个索引只包含单个列,一个表可以有多个单列索引

唯一索引

与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值

复合索引

一个索引包含多个列

2.4 索引实战

2.4.1 准备数据库/表环境

CREATE TABLE `city` (
  `city_id` int(11) NOT NULL AUTO_INCREMENT,
  `city_name` varchar(50) DEFAULT NULL,
  `country_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`city_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

Mysql高级(索引、视图、事务)

2.4.2 创建索引

create index idx_city_name on city(city_name);
Mysql高级(索引、视图、事务)

2.4.3 查看索引

show index from city
有时候索引看不到,所以需要查

2.4.4 删除索引

drop index idx_city_name on city;

创建库的时候创建索引,也可以表形成了,二次去添加索引。

2.4.5 二次添加主键索引

alter table city add primary key(city_id);

city_id变成了主键

2.4.6 二次添加唯一索引

alter table city add unique index_name(city_name);
Mysql高级(索引、视图、事务)

2.4.7 二次添加普通索引

alter table city add index index_country_id(country_id);

2.4.8 二次添加全文索引(了解)

前提其他索引先清除下

alter table city add fulltext index_name(city_name);

Mysql高级(索引、视图、事务)

现在都是用ES索引,不用全文索引。
Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎.

注意点:
全文索引在大量的数据面前,能比 like + % 快 N 倍,
速度不是一个数量级,但是全文索引可能存在精度问题。

2.5 索引原则

不用在增删改,效率很慢,用来查询。
但有时候有效率,有时候没效率。

  1. 数据量大且查询频次高
  2. 索引字段尽量使用where子句的条件中提取
  3. 唯一索引区分度高,效率高
  4. 索引带来增删改的效率变低,所以综合考虑
  5. 使用短索引 (长度)

3.视图

3.1 视图定义

虚拟存在的表

碰不到数据库,没有权限,所以需要有视图。
但还是有特例,比如修改视图,数据库也会改,很少用。

3.2 创建视图(建议名称前面加个view_)

create view view_city_country as select c.*,t.country_name from
city c,country t where c.country_id = t.country_id;

3.3 查看视图

select * from view_city_country;

3.4 修改视图

update view_city_country set city_name=’西安市’ where city_id = 1;
select * from view_city_country;

数据库也会改。

3.5 查看视图列表

show tables;

4.Mysql体系结构

Mysql高级(索引、视图、事务)

5.Mysql存储引擎

5.1 查看数据库支持的存储引擎列表

show engines;

5.2 查看默认的存储引擎

show variables like ‘%storage_engine%’;

5.3 存储引擎间的区别

Mysql高级(索引、视图、事务)

开发只用InnoDB(MyIsa很少用,其他不用)

6.Mysql事务

6.1 事务定义

事务就是将一组SQL语句放在同一批次内去执行,
如果一个SQL语句出错,则该批次内的所有sql都将被取消执行。

举例:(摘录)
假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:
将小明的余额减少1000元,将小红的余额增加1000元。
万一在这两个操作之间突然出现错误比如银行系统崩溃,
导致小明余额减少而小红的余额没有增加,这样就不对了。
事务就是保证这两个关键操作要么都成功,要么都要失败。

6.2 事务ACID原则(理论)

(1)原子性

一个事务要么全部提交成功,要么全部失败回滚,
不能只执行其中的一部分操作,这就是事务的原子性

(2)一致性

在事务开始之前和事务结束以后,数据库的完整性没有被破坏。

(3)隔离性

数据库允许多个并发事务同时对其数据进行读写和修改的能力,
隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

(4)持久性

事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

6.3 事务实战

6.3.0 说明

库 - 命令界面页

由于mysql是默认自动提交事务的,
所以在研究事务的时候需要首先关闭自动提交模式

SET AUTOCOMMIT = 0; //关闭自动提交模式
SET AUTOCOMMIT = 1; //开启自动提交模式

6.3.1 常用命令

(1)开启事务

START TRANSACTION

(2)提交事务

COMMIT

(3)回滚事务

ROLLBACK

6.3.2 Innodb引擎之事务

(1)案例1-事务提交情况

设置为1的时候创建 》开启自动提交模式

create table account(
  id int(4) primary key auto_increment,
  username varchar(32) not null,
  cash int(32) not null
);

insert into account(username,cash) values('A',2000);
insert into account(username,cash) values('B',1000);

然后 set autocommit = 0; 》关闭自动提交模式

start TRANSACTION;
update account set cash = cash -500 where username = 'A';
update account set cash = cash +500 where username = 'B';

==》以上两个执行 account表中的数据不会发生变化 因为把事务给关了

COMMIT;

》提交事务,这时候就发生变化了。 A B cash1500
》记住要恢复为 1

set autocommit = 1;
select * from account;

(2)案例2-事务回滚情况

delete from account where  username = 'A';
delete from account where  username = 'B';

create table account(
  id int(4) primary key auto_increment,
  username varchar(32) not null,
  cash int(32) not null
)

insert into account(username,cash) values('A',2000);
insert into account(username,cash) values('B',1000);

set autocommit = 0;

start TRANSACTION;
update account set cash = cash -500 where username = 'A';
update account set cash = cash +500 where username = 'B';
ROLLBACK;
COMMIT;

》不会发生变化
》记住要恢复为 1

set autocommit = 1;
select * from account;

6.3.3 MyIASM引擎之事务

create table account_myasim(
  id int(4) primary key auto_increment,
  username varchar(32) not null,
  cash int(32) not null
)engine=myisam default charset=utf8;

insert into account_myasim(username,cash) values('A',2000);
insert into account_myasim(username,cash) values('B',1000);
set autocommit = 0;

start TRANSACTION;
update account_myasim set cash = cash -500 where username = 'A';
update account_myasim set cash = cash +500 where username = 'B';
select * from account;

该引擎不支持事务,所以开不开事务没区别。

6.4 面试题:Innodb引擎和MyIASM引擎区别

Innodb引擎支持事务,MyIASM引擎不支持事务,
Innodb引擎支持外键,MyIASM引擎不支持外键

设置外键的就是主表

----2021.12.09&12.10

上一篇:5Djang-完善后端用户注册逻辑


下一篇:Mybatis - 动态sql