MySQL基础教程(MySQL安装/索引/视图)

hik
@Ta 2020-02-22发布,2020-02-22修改 3539点击

Linux上MySql安装

CentOs查询MySQL旧版本:

rpm -qa | grep -i mysql

卸载:

rpm -e 上述命令查的名称 --nodeps

q表示查询query,a表示all,-e 卸载rpm包,-i 安装rpm包,-u 升级rpm包

安装服务端与客户端(*表示安装包文件名):

rpm -ivh *.rpm

SRT中进入sftp

Alt+P进去,put加本地文件地址即可上传

MySQL启动与登录

常用指令

#启动/停止/查询状态
service mysql start/stop/status
#安装好后会生成初始密码 查询
cat /root/.mysql_secret
#登录mysql
mysql -uroot -p (再粘贴密码回车)

登录成功后修改密码

set PASSWORD=PASSWORD('123456'); --修改密码
quit --退出

授权远程访问,MySQL安装好后默认只本地访问,需要命令授权

grant all privileges on *.* to 'root' @'%' identified by '123456'; 
flush privileges;

如果远程连接还失败就尝试关闭防火墙

#查询防火墙状态
service iptables status
#关闭防火墙
service iptables stop
chkconfig iptables off(关闭开机自启:所谓的永久关闭防火墙)

查询版本号(Mysql中不区分大小写)

SELECT VERSION(), CURRENT_DATE;

注意:

多个字段之间可以用逗号分隔,多行组成一条语句结束以分号结束

sql语句写了一半,又不想执行可以在语句末尾加上'\c'

当然还有其他后缀:

\g的作用和MySQL中的分号”;"是一样;

\G的作用是讲查找到的内容结构旋转90度,变成纵向结构;

可进行简单计算

SELECT SIN(PI()/4), (4+1)*5;

多条语句比较短,可以写在一行

SELECT VERSION(); SELECT NOW();

MySQL索引

一种数据结构,若没有数据会由上至下检索,主要目的快速查询

优势:查询快

劣势:占储存,增删改时不仅建立数据库还要建立索引

MySQL常用索引为BTREE,以B+树(多路索引树 非二叉树)组织结构索引。MySql索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能。

索引分类

单列索引:一个索引仅包含一列,不过一个表可以多个索引
唯一索引:索引值必须唯一,但允许空值
复合索引:即一个索引包含多列

创建索引

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[USING index_type] ON tbl_name(index_col_name,...)

index_col_name : column_name[(length)][ASC | DESC]

[UNIQUE|FULLTEXT|SPATIAL]内容可不写,[USING index_type]不写默认是按BTREE+

例如我们为实验案例创建索引

create database demo_01 default charset=utf8mb4;
use demo_01;
CREATE TABLE `city` (
`city_id` int(11) NOT NULL AUTO_INCREMENT,
`city_name` varchar(50) NOT NULL,
`country_id` int(11) NOT NULL,
PRIMARY KEY (`city_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `country` (
`country_id` int(11) NOT NULL AUTO_INCREMENT,
`country_name` varchar(100) NOT NULL,PRIMARY KEY (`country_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into `city` (`city_id`, `city_name`, `country_id`) values(1,'西安',1);
insert into `city` (`city_id`, `city_name`, `country_id`) values(2,'NewYork',2);
insert into `city` (`city_id`, `city_name`, `country_id`) values(3,'北京',1);
insert into `city` (`city_id`, `city_name`, `country_id`) values(4,'上海',1);
insert into `country` (`country_id`, `country_name`) values(1,'China');
insert into `country` (`country_id`, `country_name`) values(2,'America');
insert into `country` (`country_id`, `country_name`) values(3,'Japan');
insert into `country` (`country_id`, `country_name`) values(4,'UK');

创建/查看/删除索引

create index idx_city_name on city(city_name);
show index from city; --查看索引
drop index idx_city_name on city; --删除索引

创建成功后会看到两个索引,因为创建表时候主键也生成一个索引

ALTER命令创建索引

1). alter table tb_name add primary key(column_list);
该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL
2). alter table tb_name add unique index_name(column_list);
这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)
3). alter table tb_name add index index_name(column_list);
添加普通索引, 索引值可以出现多次。
4). alter table tb_name add fulltext index_name(column_list);
该语句指定了索引为FULLTEXT, 用于全文索引

设计原则

  1. 对查询频次较高,且数据量比较大的表建立索引。
  2. 索引字段的选择,最佳候选列应当从where子句的条件中提取,如果where子句中的组合比较多,那么应当挑选最常用、过滤效果最好的列的组合。
  3. 使用唯一索引,区分度越高,使用索引的效率越高。
  4. 索引可以有效的提升查询数据的效率,但索引数量不是多多益善,索引越多,维护索引的代价自然也就水涨船高。对于插入、更新、删除等DML操作比较频繁的表来说,索引过多,会引入相当高的维护代价,降低DML操作的效率,增加相应操作的时间消耗。另外索引过多的话,MySQL也会犯选择困难病,虽然最终仍然会找到一个可用的索引,但无疑提高了选择的代价。
  5. 使用短索引,索引创建之后也是使用硬盘来存储的,因此提升索引访问的I/O效率,也可以提升总体的访问效率。假如构成索引的字段总长度比较短,那么在给定大小的存储块内可以存储更多的索引值,相应的可以有效的提升MySQL访问索引的I/O效率。
  6. 利用最左前缀,N个列组合而成的组合索引,那么相当于是创建了N个索引,如果查询时where子句中使用了组成该索引的前几个字段,那么这条查询SQL可以利用组合索引来提升查询效率。

最后一点针对于符合索引,如

创建复合索引:
CREATE INDEX idx_name_email_status ON tb_seller(NAME,email,STATUS);
就相当于
对name 创建索引 ;
对name , email 创建了索引 ;
对name , email, status 创建了索引 ;
最左索引,只要索引第一个字段,后面就都有索引

MySQL视图

视图概念

视图(View)是一种虚拟存在的表。视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

个人理解,视图就是来源于物理表数据而创建的虚拟表,操作跟一般表一样。

简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。(就像提前做好了复杂查询的虚拟表或逻辑表,用户只需操作这个虚拟表即可,不用关系数据到底来源哪个物理表表)
安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。(例如 对开发者暴露视图不暴露原表,只给开发者他们能看的字段,隐私字段给隐藏掉)
数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。(原表列只要不修改删除列就对视图没影响了)

视图操作

创建视图

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

REPLACE为修改,view_name为视图名,AS后接视图sql

示例,创建city_country_view视图 , 执行如下SQL :

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

修改视图

ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

选项 :
WITH [CASCADED | LOCAL] CHECK OPTION 决定了是否允许更新数据使记录不再满足视图的条件。
LOCAL : 只要满足本视图的条件就可以更新。
CASCADED : 必须满足所有针对该视图的所有视图的条件才可以更新。 默认值.

虽然视图可以更新,更新也会更新来源表数据,但不建议更新。

查看视图

从 MySQL 5.1 版本开始,使用 SHOW TABLES 命令的时候不仅显示表的名字,同时也会显示视图的名字,而不存在单独显示视图的 SHOW VIEWS 命令。同样SHOW TABLE STATUS 命令,不但可以显示表的信息,同时也可以显示视图的信息。例如

SHOW TABLE STATUS like 'city_country_view'\G;

查视图定义(创建信息)

show create view city_country_view \G

删除视图

DROP VIEW [IF EXISTS] view_name [, view_name] ...[RESTRICT 1 | CASCADE]

例如

DROP VIEW city_country_view ;

友链一下:https://cway.top

回复列表(3)
添加新回复
回复需要登录