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

    科技2022-07-14  134

    一.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

     

     

     

    Processed: 0.012, SQL: 8