mysql数据库的学习总结一(DDL)-建库、建表、约束介绍、索引数据结构、回表、索引覆盖、下推等

一.sql的分类

DML:数据操纵语言 date manipulation language,

语法包括:select、insert、delete、update

记忆方法:使用sql操作数据的增删改查,对数据产生改变,对表不会产生改变

DDL:数据定义语言 date definition language

语法包括:alter,create、drop、rename truncate

记忆方法:只会对表产生改变,对数据不会产生改变

DCL:数据控制语言 date control language

语法包括:grant、revoke

transaction:事务

rollback、savepoint

二、数据库的基本操作(DDL)

增:

创建数据库:create database dbname charactor set utf8;

删:

删除数据库:drop database dbname;

查:

查看实例中所有的表:show databases;

改:

改变当前使用的数据库:use dbname;

三、表的基本操作

增:

创建表:

方式一:CREATE TABLE `emp3_copy` (

`empno` int(10) NOT NULL,

`ename` varchar(20) NOT NULL,

`job` varchar(20) DEFAULT NULL,

`mgr` int(20) DEFAULT NULL,

`hiredate` datetime DEFAULT NULL,

`sal` double(20,0) DEFAULT NULL,

`comm` double(20,0) DEFAULT NULL,

`deptno` int(2) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

方式二:create table dbname as select * from table_name where 1=1

注意:会赋值所有的数据,但是不会复制约束

方式三:create table dbname as select * from table name where 1=2

注意:只会赋值表结构,不会复制数据和约束

删:

删除表:drop table emp3_copy;

改:

更改表:

增加列:

alter table emp3 add column test varchar(10) not null comment "测试" after empno

更改列:

alter table emp3 modify column test varchar(20) unique null comment "再测试"

注意:更改列的时候需要将原属性加上,否则更改时会覆盖原属性

删除列:

alter table emp3 frop column test;

改表名:

alter table emp3 rename test3;

查:

查询表结构

desc emp3

四、表的常见约束(constraint):

建表时,同时可以制定一些规则,来约束插入的数据,这些规则称之为约束,是表上强制执行的数据校验规则。

约束可以在建表时添加上,也可在建表后添加

建表时在字段后添加相应需要的约束,字段用","隔开

CREATE TABLE `emp3_copy` (

`empno` int(10) NOT NULL primary key,

`ename` varchar(20) NOT NULL,

`job` varchar(20) DEFAULT NULL,

`mgr` int(20) DEFAULT NULL,

`hiredate` datetime DEFAULT NULL,

`sal` double(20,0) DEFAULT NULL,

`comm` double(20,0) DEFAULT NULL,

`deptno` int(2) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

建表后添加:

alter table emp3 modify column test varchar(20) unique null comment "再测试"

约束包括:

  • not null:非空,用于保证该字段的数值不能为空
  • default:默认值,用于保证该字段有默认值。
  • primary key: 主键,用于保证该字段的值具有唯一性且非空
  • unique: 唯一键,用于保证该字段的值具有唯一性,可以为空
  • foreign key: 外键,用于限制两个表的关系,用于保证该字段必须有来自主表的关联列的值
  • check:用于自定义约束,mysql中没有,用时需要在定义列中添加check(age>0 and age < 120)

4.1主键的定义(primary key):

创建有两种方式:

在表定义中加上如下子句primary key (列名、列名)

在主属性定以后,在之后加上primary key

4.2外键约束

外键是表中的一个列,其值必须在另外一个表的主键或唯一键列出

作为主键的表为主表,作为外键的表为依赖表

外键是参照的主表的主键或者唯一键

当删除主表的主键时,其依赖表会组织删除,要删除主表某个记录时可以采取以下三种做法

restrict方式:只有当依赖表中没有一个外键值与要删除的主表中的主键值相对应,才可以执行删除

cascade方式:主表中被删除的主键值相关联的以来表中的外键值的记录一起删掉

set null方式:将以依赖表中的相关联的值设置为空值

五.索引

概述:

索引是为了加快查询所存在的,存于磁盘中,myisam引擎中是单独存在一个磁盘文件中,innodb中是与数据存放在一起的。其作用是在数据库中用来加速对表的查询,通过使用快速路径访问方法快速定位数据,减少磁盘io,且sql中的索引是非显性的,用的时候不需要写出他的名字,会自动起作用。

开发中使用索引的要点:

    • 索引改善检索操作的性能,但是降低了数据的插入、修改和删除的性能,再执行这些操作时,DBMS必须动态地更新索引。
    • 索引数据可能要占用大量的存储空间。
    • 唯一性不好的数据不一定适合于索引。
    • 索引用于数据过滤和数据排序,如果经常以某种特定的顺序排序数据,则该数据可能是索引的备选。
    • 可以在索引中定义多个列,也就是联合索引。

扩展知识储备:

局部性原理:程序和数据的访问都有聚集成群的倾向,在一个时间段内,仅适用其中一小部分(空间局部性),或者最近访问过的程序代码和数据,很快又被访问的可能性很大(时间局部性)

磁盘预读:(预读长度一般为一页(page)的整数倍)

页是存储器的逻辑块,操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,这个块成为一页(许多操作系统中,页的大小通常为4K),主存和磁盘以页为单位交换数据

5.1加索引的两种方式:

  • create index index_name on table(list_columns);
  • alter table table_name add index index_name (list_columns);

5.2删除索引的两种方式:

  • drop index index_name on table;
  • alter table table_name drop index index_name;

5.3索引的分类

mysql索引的五种类型:主键索引、唯一索引、普通索引、全文索引、组合索引,通过给字段添加索引,可以提高数据的读取速度,提高项目的并发能力和抗压能力

  • 主键索引:primary key 每个表只能有一个主键,是唯一性索引
  • 唯一索引:unique 索引列的所以只都只能出现一次,必须唯一,只可以为空
  • 普通索引:基本的索引类型,可以为空,没有唯一性限制(覆盖索引)
  • 全文索引:MyISAM引擎支持,Innodb在5.6之后支持fulltext。可以在varchar、char、text类型的列上创建
  • 组合索引:多列值组成一个索引,专门用于组合搜索(最左匹配原则)

解释:

索引覆盖:在索引中取得我们想要的数据,不需要在数据表中读取,查询列被使用的索引覆盖

最左匹配原则:当使用组合索引时,创建索引如下(index1,index2)先匹配index1,在匹配index2,也可单独使用index1,这样索引是起到作用的,当使用index2时,索引并未起到作用,想要使用时,需要单独创建index2的索引

5.4mysql的存储引擎

 

MyISAM

Innodb

索引类型

非聚簇索引

聚簇索引

支持事务

支持表锁

支持行锁

支持外键

支持全文检索

5.6以后支持

适合操作类型

select

insert、update、update

5.5mysql-MyISAM索引机制:

5.6mysql-Innodb索引机制:

5.7索引的维护

索引在插入新值的时候,为了维护索引的有序性,必须要维护,在维护索引的时候需要分一下集中情况:

1.如插入一个比较大的值,直接插入即可,几乎没成本

2.如果插入一个中间值,需要逻辑上移动后续的元素,空出位置

3.如果插入的数据页满了,就需要单独申请一个新的数据页,然后移动部分数据过去,叫做页分裂,此时性能会受到影响,空间使用率也会降低,除了也分裂之外还包含业合并

综上:尽量使用自增主键作为索引

5.8 扫盲

5.6.1什么是回表:

回表就是查询数据时先通过数据库索引扫描所在的行获取主键id,在通过主键id获取该行索引中没有提供的数据,即基于非主键索引的查询需要多扫描一颗索引树。

5.6.2什么是索引下推:

当不使用icp,通过使用非主键索引(普通索引or二级索引)进行查询,存储引擎通过索引检索数据,然后返回给mysql服务器,服务器再判断是否符合条件。

举例说明,就是将表的多个用的着的列进行创建组合索引,进行不使用icp索引,使用普通索引多条件查询时,通过第一个索引查询相应的元组,此时可能有多个,此时再根据第二个条件和第三个标间进行判断索引是否符合标准,将符合的主键id返回,进行查找数据,只进行一次回表查询;

如不使用索引下推,会使用第一条件查询到的多个id进行查询,产生多次回表查询,判断符合的数据返回给mysql服务器

5.6.3为什么索引使用B+树的数据结构

https://blog.csdn.net/weixin_39772200/article/details/104191637

猜你喜欢

转载自blog.csdn.net/weixin_47402482/article/details/108918126