首页 > 数据库 >Linux下数据库学习过程之索引视图(持续更新中)

Linux下数据库学习过程之索引视图(持续更新中)

时间:2024-07-17 21:28:21浏览次数:17  
标签:name dept Linux 视图 索引 emp mysql

1视图
创建视图的目的:使得查询操作更加便捷
视图的语法
CREATE
    [OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = user]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]
视图的使用案例

查询每一个员工的信息,并附带部门名称
这里是将emp和dept两张表进行内连接查询,数据比较多,我在这里选择了两条数据显示。这样的查询可能会非常多,一条条写select语句显得代码量比较大,因此将这样的一个结果图对应的语句用视图来代替,那么再查询的时候,代码量将会小很多。

mysql> select emp_no,emp_name,emp_job,hire_date,salary,bonus,dept_name from employee as emp inner join department as dept on emp.dept_id=dept.dept_id where emp_no=1 or emp_no=2;
+--------+----------+---------+---------------------+--------+-------+-----------+
| emp_no | emp_name | emp_job | hire_date           | salary | bonus | dept_name |
+--------+----------+---------+---------------------+--------+-------+-----------+
|      1 | 张三     | enginer | 2018-09-09 00:00:00 |  10000 |  2000 | 科技部    |
|      2 | 李四     | 保洁    | 2024-01-01 00:00:00 |   6000 |  1000 | 后勤部    |
+--------+----------+---------+---------------------+--------+-------+-----------+

创建视图
mysql> create view emp_info (no,name,job,date,salary,bonus,department) as (select emp_no,emp_name,emp_job,hire_date,salary,bonus,dept_name from employee as emp inner join department as dept on emp.dept_id=dept.dept_id);

测试添加数据是否会在视图查询下显示,结果:可以使用视图查询到新增数据
mysql> insert into employee values(null,'樟脑丸','艺人','2024-06-07',10000,3000,1005);
mysql> select *from emp_info;   视图查询

可以进行视图的视图,也就是说视图的查询也可以作为下一个视图的查询内容,比较灵活 
mysql>  create view emp_info_view as select no,name,job from emp_info;
mysql> select *from emp_info_view;

可以将查询的结果排序 order by,在这里强调,如果使用多级视图,那么order by,会被最外边的orderby覆盖
mysql> select *from emp_info_view order by job;

视图可以与表一起使用
mysql> select name,dept_id,dept_name from emp_info inner join department on emp_info.department=department.dept_name;

修改视图
往视图里面插入数据,也会在表里面留痕,也就是说,插入数据到视图也会同时插入到表中,但是视图的语句包括两张及其以上的表的话,在视图插入数据将会失败。

删除视图

查询都有哪些视图
mysql>  show table status\G;
mysql> select *from information_schema.views\G;
2.索引
1.索引分类

数据类型分类:B+tree索引,Hash索引,Full-text索引
物理存储分类:聚簇索引(主键索引),二级索引(辅助索引)
字段特性分类:主键索引,唯一索引,普通索引,前缀索引
字段个数分类:单列索引,联合索引

2.索引的练习

前期插入数据
建立存储过程,给一张表添加两百万条数据
(1)这里使用Navicat连接linux下的mysql,使用查询执行下面这段代码,连接方法在我另一篇博客:https://blog.csdn.net/L18291789297/article/details/140051699

create procedure if not exists insert_proc()
begin 
        declare i int default 1;
        declare num int default 2000000;
        while i<num
        do 
                insert into index_1 values(i,floor(i + rand()*i),md5(i));
                set i=i+1;
        end while;
        commit;
end;
执行

转到linux的mysql中的mydb2中(具体需要的数据库)

mysql> call insert_proc();

(2)在Linux下直接使用sql语句创建两百万条数据

mysql> delimiter $$   //定界符。保证里面的内容为一个整体,这里使用$$,其他的也可以
mysql> create procedure insert_proc2()
    -> begin 
    ->   declare i int default 1;
    ->   declare max int default 2000000;
    ->   while i <= max
    ->   do 
    ->     insert into index_1 values(i,floor(i + rand()*i),md5(i));
    ->     set i=i+1;
    ->   end while;
    ->   commit;
    -> end;
    -> $$
mysql> delimiter ;改回定界符为;

<1.建立索引的语法

CREATE TABLE 表名 ( 属性名 数据类型 [完整性约束条件],
属性名 数据类型 [完整性约束条件],
…
属性名 数据类型
[UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY
[别名](属性名1 [(长度)] [ASC | DESC])
);

(1)在建表的时候建立索引

创建表

create table index_1(
id int,
num int,
content varchar(128)
);

创建索引,普通索引(主键索引)

mysql> create table new_index_tb(
    -> id int primary key ,
    -> name varchar(64) not null,
    -> index name_u (name(5) desc )
    -> );
    mysql> create table new_index_tb(
    -> id int primary key ,
    -> name varchar(64) not null,
    -> key name_u (name(5) desc )
    -> );

唯一索引

mysql> create table new_index_tb(
    -> id int primary key ,
    -> name varchar(64) not null,
    -> unique index name_u (name(5) desc )
    -> );
mysql> create table new_index_tb(
    -> id int primary key ,
    -> name varchar(64) not null,
    -> unique key name_u (name(5) desc )
    -> );

(2)直接创建索引

mysql> create index index_id on index_1(id);
在建立索引后发现,用mysql> select count(*) from index_1;查询效率在创建之前比创建之后更高,这是因为在插入数据后,在没有创建索引前,数据库会自动创建一个隐藏的索引,与表结构无关。

(3)用修改语句创建索引

(4)删除索引

注意:
1.当为一张表建立主键时,会自动建立索引
2.设置唯一键约束时也会自动建立索引

mysql使用索引场景

1、支撑where条件的查询
2、可以支撑多个where条件,并且会优先匹配规模最小的where
即假如where1匹配1000行,而where2匹配100行,那么优化器就会选择where2优先匹配,在匹配中的100行里在匹配符合where1条件的数据
3、如果是联合索引,那么必然遵守最左前缀匹配原则,即有索引1,索引2,索引3,在匹配时只给出索引2,索引3字段将会匹配失败,只有给出包含索引1字段的语句时才会成功。在匹配时给出索引1,索引3,则匹配成功。但只有索引1生效,即最左前缀匹配原则

3.聚簇索引和非聚簇索引

(1)聚簇索引,顺序IO,存储的物理地址连续
(2)非聚簇索引,随机IO,存储的物理地址不连续

标签:name,dept,Linux,视图,索引,emp,mysql
From: https://blog.csdn.net/L18291789297/article/details/140302321

相关文章

  • Android开发 - 视图布局属性解析
    LinearLayout:主要以水平或垂直方式来排列界面中的控件。并将控件排列到一条直线上。在线性布局中,如果水平排列,垂直方向上只能放一个控件,如果垂直排列,水平方向上也只能放一个控件RelativeLayout:称作相对布局,非常常用的一种布局。和LinearLayout的排列规则不同,RelativeLayout显......
  • Linux学习中
     #1.登录root用户#2.配置网络vi/etc/sysconfig/network-scripts/if*(tab键回车补齐)#删除UUID行,(按dd)BOOTPROTO=staticONBOOT=yesIPADDR=192.168.188.100NETMASK=255.255.255.0GATEWAY=192.168.188.2DNS1=114.114.114.114:wqipaddrsystemctlrestartnetwork.s......
  • KU链接:如何在Linux作业系统上安装Azure PowerShell
    本文由KU链接вт989点сс原创编译,AzPowerShell模组是汇总模组。安装它会下载正式运作的AzPowerShell模组,并让其Cmdlet可供使用,本文说明如何在Linux上安装AzPowerShell模组。必要条件安装支援的PowerShell第7版或更新版本安装开启终端机或其他壳层主机应......
  • Linux C++ 059-设计模式之备忘录模式
    LinuxC++059-设计模式之备忘录模式本节关键字:Linux、C++、设计模式、备忘录模式相关库函数:概念备忘录模式(MementoPattern),又叫做快照模式(SnapshotPattern)或Token模式,是GoF的23种设计模式之一,属于行为模式。定义(源于GoF《设计模式》):在不破坏封闭的前提下,捕获一个......
  • Linux C++ 060-设计模式之单例模式
    LinuxC++060-设计模式之单例模式本节关键字:Linux、C++、设计模式、单例模式相关库函数:概念单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对......
  • 企业级环境部署:在 Linux 服务器上如何搭建和部署 Python 环境?
     在大部分企业里,自动化测试框架落地都肯定会集成到Jenkins服务器上做持续集成测试,自动构建以及发送结果到邮箱,实现真正的无人值守测试。不过Jenkins搭建一般都会部署在公司的服务器上,不会在私人电脑里,而服务器大部分都是Linux操作系统的。所以,我们如果要在Linux上的Jenkins服......
  • Linux 基础
    一.命令 1.  打开命令行ctrl+alt+tctrl+shift+tctrl+altenter最大化2.  linux@ubuntu:~$ linux用户名root超级ubuntu主机名3. 命令命令+选项+参数(1)ls展示目录文件  靠颜色分,不是后缀    蓝:目录文件夹    白:普......
  • linux系統目錄結構
    /binbin是Binaries(二进制文件)的缩写,这个目录存放着最经常使用的命令。/sbins就是SuperUser的意思,是SuperuserBinaries(超级用户的二进制文件)的缩写,这里存放的是系统管理员使用的系统管理程序。/boot这里存放的是启动Linux时使用的一些核心文件,包括一些连......
  • 【Linux网络】Linux网络协议栈常用代码片段
    1.读取网卡mac地址可以通过ioctl(sock,SIOCGIFHHWADDR,&ifr)读取mac地址,对任意类型的socket都适用,只需指定第三参数structifreqifr的ifr.ifr_name,这个ifr_name就是网络设备的名字,如eth0,eth1,lo等,在/proc/net/dev可找到,ioctl通过ifr_name获取设备信息。structifreqifr;strn......
  • 【Linux网络】Linux网络协议栈问题汇集
    Linux本机与本机socket通信会走网卡吗?1.127.0.0.1本机网络IO需要经过网卡吗?不需要经过网卡,即使把网卡拔了本机网络还是可以正常使用的。本机网络IO的内核执行流程:跨机网络IO的流程:2.数据包在内核中是什么走向,和外网发送相比流程上有什么区别?本机网络IO和跨机IO比较起......