• 存储引擎 索引 数据类型 约束条件 # 35


    day35
    0.补充 存储引擎

     1 """"""
     2 """
     3 存储引擎
     4     不同的数据应有不同的处理机制
     5     
     6     mysql 存储引擎
     7         Innodb:默认的存储引擎 查询速度较myisam慢 但是更安全(存储安全性比mysam高)
     8             特点:支持事务,支持行锁,外键
     9             目前更加看重数据安全
    10         myisam:mysql 老版本用的是存储引擎(存储速度比Innodb快)
    11         memory:内存引擎(数据全部存在内存中)
    12             特点:临时存储
    13         blackhole:无论存什么都立马消失(黑洞)
    14         
    15     研究一下每个存储引擎存取数据的特点
    16         show engines;
    17         
    18         为了不影响其他存储:
    19             create database db13;
    20             
    21             create table t1(id int)engine=innodb;
    22             create table t2(id int)engine=myisam;
    23             create table t3(id int)engine=memory;
    24             create table t4(id int)engine=blankhole;
    25             ps:
    26                 myisam 真实数据和索引是分开的,Innodb合在一起存储在真实数据之中
    27             
    28             insert into t1 values(1),(2);
    29             insert into t2 values(1),(2);
    30             insert into t3 values(1),(2);
    31             ps:服务端重启之后,存在内存中数据丢失,查询无结果
    32             insert into t4 values(1),(2);
    33             ps:黑洞:存进去数据就消失了
    34 
    35 """
    1.存储引擎
     1 1. MySQL默认存储引擎的变迁
     2 
     3     在MySQL 5.5之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。
     4 
     5 2. MyISAM与InnoDB存储引擎的主要特点
     6 
     7     1).MyISAM存储引擎的特点是:表级锁、不支持事务和支持全文索引,适合一些CMS内容管理系统作为后台数据库使用,但是使用大并发、重负荷生产系统上,表锁结构的特性就显得力不从心;
     8 
     9     2).InnoDB存储引擎的特点是:行级锁、事务安全(ACID兼容)、支持外键、不支持FULLTEXT类型的索引(5.6.4以后版本开始支持FULLTEXT类型的索引)。InnoDB存储引擎提供了具有提交、
    10 
    11                                                      回滚和崩溃恢复能力的事务安全存储引擎。InnoDB是为处理巨大量时拥有最大性能而设计的。它的CPU效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。
    12 
    13     注意:
    14 
    15     InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表(锁完以后,判断不符合条件的会逐步解锁),
    16 
    17     例如update table set num=1 where name like “a%”。
    18 
    19      两种类型最主要的差别就是InnoDB支持事务处理与外键和行级锁。而MyISAM不支持。所以MyISAM往往就容易被人认为只适合在小项目中使用。
    20 
    21 3. MyISAM与InnoDB性能测试
    22 
    23     随着CPU核数的增加,InnoDB的吞吐量反而越好,而MyISAM,其吞吐量几乎没有什么变化,显然,MyISAM的表锁定机制降低了读和写的吞吐量。
    24 
    25 4. 事务支持与否
    26 
    27     MyISAM是一种非事务性的引擎,使得MyISAM引擎的MySQL可以提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用;
    28 
    29     InnoDB是事务安全的;事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
    30 
    31 5. MyISAM与InnoDB构成上的区别
    32 
    33     1).每个MyISAM在磁盘上存储成三个文件:
    34 
    35         第一个文件的名字以表的名字开始,扩展名指出文件类型,.frm文件存储表定义。
    36 
    37        第二个文件是数据文件,其扩展名为.MYD (MYData)。
    38 
    39        第三个文件是索引文件,其扩展名是.MYI (MYIndex)。
    40 
    41    2).基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的 大小只受限于操作系统文件的大小,一般为 2GB。
    42 
    43 6. MyISAM与InnoDB表锁和行锁的解释
    44 
    45     MySQL表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。什么意思呢,就是说对MyISAM表进行读操作时,它不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作;
    46 
    47     而对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作。
    48 
    49     InnoDB行锁是通过给索引项加锁来实现的,即只有通过索引条件检索数据,InnoDB才使用行级锁,否则将使用表锁!行级锁在每次获取锁和释放锁的操作需要消耗比表锁更多的资源。在InnoDB两个事务发生死锁的
    50 
    51      时候,会计算出每个事务影响的行数,然后回滚行数少的那个事务。当锁定的场景中不涉及Innodb的时候,InnoDB是检测不到的。只能依靠锁定超时来解决。
    52 
    53 7. 是否保存数据库表中表的具体行数
    54 
    55      InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table 时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。
    56 
    57      注意的是,当count(*)语句包含where条件时,两种表的操作是一样的。也就是 上述“6”中介绍到的InnoDB使用表锁的一种情况。
    58 
    59 8. 如何选择:
    60 
    61     MyISAM适合:
    62 
    63     1). 做很多count 的计算;
    64 
    65     2). 插入不频繁,查询非常频繁,如果执行大量的SELECT,MyISAM是更好的选择;
    66 
    67     3). 没有事务。
    68 
    69     InnoDB适合:
    70 
    71     1). 可靠性要求比较高,或者要求事务;
    72 
    73     2). 表更新和查询都相当的频繁,并且表锁定的机会比较大的情况指定数据引擎的创建;
    74 
    75     3). 如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表;
    76 
    77     4).DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的 删除;
    78 
    79    5).LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
    80 
    81 9. 其他区别:
    82 
    83     1). 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
    84 
    85     2). DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
    86 
    87     3). LOAD TABLE FROMMASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
    88 
    89     4). 清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表。
    90 
    91     5). 对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引。
    92 
    93     6). InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。
    94 
    95          要注意,创建每个表格的代码是相同的,除了最后的 TYPE参数,这一参数用来指定数据引擎。
    2.myisam与Innodb区别

    区别.png


    四大存储引擎.png


    存储引擎第二知识点.存储位置及特点.png


    1.创建表的完整语法,即约束认知 和 数据类型

     1 """"""
     2 """
     3 创建表的完整语法:
     4     create table 表名(
     5         列名1 类型[(宽度) 约束条件,
     6         列名2 类型[(宽度) 约束条件,
     7         ...
     8         列名n 类型[(宽度) 约束条件,
     9     );
    10     
    11 ps:
    12     1.列名和列类型是必须的,中括号内的参数都是可选参数
    13     2.同一张表中,列名不能重复
    14     3.最后一列后面不能加逗号
    15         最简:
    16         create table t5(
    17             id int,
    18             name char
    19         );
    20  
    21 
    22 
    23 """
    24 
    25 """
    26 宽度:
    27     使用数据库的准则:能尽量让它少干活就尽量少干活
    28     
    29     对存储数据的限制
    30     char(1) 只能存一个字符
    31     如果超了 mysql 会自动帮你截取
    32         1.插入的时候 mysql自动截取
    33         2.会直接报错(mysql严格模式)
    34         最新数据库版本直接报错提示无法存储:Data too long for column 'name' at row 1
    35     例:   
    36     alter table t5 modify name char not null
    37     not null 该字段不能插空
    38     
    39 """
    40 """
    41 类型和中括号的约束
    42     类型约束的是数据的存储类型 
    43     而中括号内的约束 是基于 类型之上的额外限制
    44 """
    45 """
    46 语法:
    47 create table 表名(
    48         列名1 类型[(宽度) 约束条件,
    49         列名2 类型[(宽度) 约束条件,
    50         ...
    51         列名n 类型[(宽度) 约束条件,
    52     )engine=Inodb charset='utf-8';
    53     
    54     
    55     create table t15(
    56         id int auto_crement primary key,
    57         name varchar(32) not null default ""
    58     )engine=Innodb charset='utf-8';
    59 """
    1.创建表的完整语法,即约束认知.py
     1 """"""
     2 """
     3 字段类型
     4 """
     5 """
     6 整型:
     7     smallint tinyint int bigint
     8     
     9     tinyint:
    10         默认是否有符号
    11     默认是带有符号的(-128,127)
    12     
    13     超出限制会如何?
    14         超出后只会存最大值或者最小值
    15         create table t6(id tinyint);
    16         
    17         not null 不能为空
    18         unsighed 无正负符号
    19         zerofill 0填充多余的位数
    20         create table t17(id int(8) unsighed zerofill);
    21         
    22        ps: char后面的数字是用来限制存储数据的长度
    23         特例:
    24             只有整型后面的数字不是用来限制存储数据的长度
    25             而是用来控制展示的数据位数
    26             int(8) 够/超8位有几位存几位,不够8位空格填充
    27             
    28         修改约束条件: 不够8位的情况下,用0填充
    29         
    30         强调:
    31             **对于整型来说,数据类型后的宽度并不是存储限制,
    32             而是显示限制,所以在创建表时,如果列类型采用的是整型类型,完全无需指定显示宽度,
    33             默认的显示宽度,足够显示完整当初存放的数据
    34             
    35             只要是整型 都不需要指定宽度 因为有默认的宽度 足够显示对应的数据
    36         
    37     
    38 """
    2.字段类型.py
     1 """"""
     2 """模糊匹配"""
     3 """
     4     like :
     5         %匹配任意多个字符
     6         _匹配任意一个字符
     7         
     8     set session 临时有效 只在你当前操作的窗口有效
     9     
    10     set global 全局有效 终生有效
    11     
    12     set global sql_mode = 'STRICT_TABLES';
    13     设置完成后,你只需要重新退出客户端再次进入即可
    14     
    15 """
    3.模糊匹配.py
     1 """"""
     2 """浮点型"""
     3 """
     4 float(255,30)  总共255位 小数部分占30位
     5 double(255,30) 总共255位 小数部分占30位
     6 decimal(65,30) 总共65位 小数部分占30位
     7 
     8 例:
     9 create table t6(id float(255,30)); 
    10 create table t7(id double(255,30));
    11 create table t8(id decimal(65,30));
    12 
    13 insert into t6 values(1.11111111111111111);
    14 insert into t7 values(1.11111111111111111);
    15 insert into t8 values(1.11111111111111111);
    16 """
    17 """
    18 精确度对比:
    19     float < double < decimal
    20 """
    4.浮点型.py
     1 """"""
     2 """字符类型"""
     3 """
     4     char(4) # 最大只能存四个字符 超出来会直接报错 如果少了 会自动用空格填充
     5     varchar(4) # 最大只能存四个字符 超出来会直接报错 如果少了 有几个存几个
     6     
     7     例:
     8     # 超出四个字符报错,不够四个字符空格补全
     9     create table t9(name char(4));
    10     # 超出四个字符报错,不够四个有几个就存几个
    11     create table t10(name varchar(4));
    12     
    13     char_length()
    14     
    15     # 验证存储限制
    16     insert into t12 values('hello');
    17     insert into t13 values('hello');
    18     # 验证存储长度
    19     insert into t12 values('a'); #'a    '
    20     insert into t13 values('a'); #'a'
    21     select * from t12
    22     select * from t13  # 无法查看真正的结果
    23     
    24     select char_length(name) from t12
    25     select char_length(name) from t13  # 仍然无法查看到真正的结果
    26     
    27     结论:
    28         mysql在存储char类型字段的时候 硬盘上确确实实存的是固定长度的数据
    29         
    30         但是再取出来的那一瞬间 mysql会自动将填充的空格去除
    31         
    32         可以通过严格模式 来修改机制 让其不做自动去除处理
    33     
    34     例:
    35     set global
    36     sql_mode='strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH';
    37     退出客户端重新登陆:
    38         select char_length(x) from t12 #4
    39         select char_length(y) from t13; #1
    40     
    41     # 针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中。但是会在读出结果的时候自动取掉末尾的空格
    42     
    43     
    44     
    45 """
    46 """
    47     char 与 varchar 的区别
    48         char 定长
    49             1.浪费空间
    50             2.存取速度快
    51             
    52             取的时候方便:直接按固定的长度取即可
    53         varchar 变长
    54             1.节省空间
    55             2.存取速度慢(较于char比较慢)
    56                 存的时候
    57             需要给数据讲一个记录长度的报头
    58                 取的时候
    59             需要先读取报头才能的读取真实数据
    60             
    61         取的时候时候比较繁琐,无法知道具体数据到底有多长
    62         
    63 """
    5.字符类型.py
     1 """"""
     2 """日期类型"""
     3 """
     4 date
     5 datetime
     6 year
     7 time
     8 """
     9 """枚举与集合类型"""
    10 """
    11     枚举(enum) 多选一
    12 限制 某个字段能够存储的数据内容
    13     集合(set) 多选多
    14 限制某个字段能够存储的数据内容
    15 """
    16 """
    17 例:
    18 create table userinfo(
    19     id int,
    20     name char(16),
    21     gender enum('male','female','other')
    22     );
    23     
    24 insert into userinfo values(1,'llx','llx') # 报错,只能选'male','female','other'
    25 insert into userinfo values(2,'llx','male')
    26 
    27 create table teacher(
    28     id int,
    29     name char(16),
    30     gender enum('male','female','other'),
    31     hobby set('lll','xxx','kkkk')
    32 )
    33 insert into teacher values(1,'llx','male','lll,xxx,kkk')
    34 insert into teacher values(1,'llx','male','lll')
    35 """
    6.日期和枚举集合类型.py

    整型和浮点型.png

     1 """"""
     2 """严格模式:即安全模式"""
     3 """
     4 问题:
     5     设置char,tinyint,
     6     存储数据时超过它们的最大存储长度,
     7     发现数据也能正常存储进去,只是mysql帮我们自动截取了最大长度。
     8     但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,
     9     让它仅仅只管理数据即可,这样的情况下就需要设置"安全模式"
    10     
    11     # 查看数据库变量名中包含的 mode 配置参数
    12     show variables like "%mode";
    13     # 修改安全模式
    14     set session  # 只在当前界面操作有效
    15     set global # 全局有效
    16     
    17     set global sql_mode = 'STRIC_TRANS_TABLES',
    18     修改完之后退出 当前客户端重新登录即可
    19 """
    补充 严格模式.py

    2.约束

     1 """"""
     2 """约束条件"""
     3 """
     4     PRIMARY KEY (PK)    标识该字段为该表的主键,可以唯一的标识记录
     5     FOREIGN KEY (FK)    标识该字段为该表的外键
     6     not null 不能为空
     7     unique 标识字段是唯一的
     8     auto_crement 自增
     9     unsigned 无符号
    10     zerofill 使用0填充
    11     default 给某个字段设置默认值(当用户写了的时候用"用户的",当用户没有写就用默认值)
    12     
    13     create table t11(id int ,name char(16) default 'jason');
    14     
    15     往表中插入数据的时候 可以指定字段进行插入 不需要全部都插入;
    16     
    17     insert into t11(name ,id) values('llx','2');
    18     
    19 
    20 
    21 """
    22 """
    23 例:
    24 create table user(
    25     id int,
    26   name char(16)
    27 );
    28 insert into user values(1,null)  # 可以修改
    29 
    30 alter table user modify name char(16) not null;
    31 insert into user(name,id) values(null,2);  # 报错 插入数据可以在表名后面指定插入数据对应的字段
    32 
    33 create table student(
    34     id int,
    35   name char(16) not null,
    36   gender enum('male','female','others') default 'male'
    37 )
    38 insert into student(id,name) values(1,'jason')  # 成功
    39 """
    40 """
    41 # alter table userinfo modify name char(16) not null;
    42 """
    1.约束条件.py
     1 """"""
     2 """unique 唯一"""
     3 """
     4     单列唯一 限制某一个字段是唯一的联合唯一(在语句的最后用括号的形式 表示哪几个字段组合的结果是唯一的)
     5     
     6     create table user1(
     7     id int unique, 
     8   name char(16)
     9     );
    10     insert into user1 values(1,'jason'),(1,'egon')  # 报错
    11     insert into user1 values(1,'jason'),(2,'egon')  # 成功
    12     
    13 """
    14 """
    15 联合唯一:
    16     ip
    17     port
    18     
    19     create table sever(
    20         id int,
    21         ip char,
    22         port int,
    23         unique(ip,port)
    24         );
    25     nsert into server values(1,'127.0.0.1',8080);
    26     insert into server values(2,'127.0.0.1',8080);  # 报错
    27     insert into server values(1,'127.0.0.1',8081);
    28 """
    2.unique 唯一.py
     1 """"""
     2 """primary key 主键 = not null unique"""
     3 """
     4     限制效果 跟 not null + unique 组合效果一致  非空且唯一
     5     
     6     create table t18(id int primary key);
     7     desc t11;
     8     insert into t11 values(1),(1);  # 报错
     9     insert into t11 values(1),(2);
    10     
    11     
    12     primary key 也是innodb 引擎 查询必备的索引
    13         索引你就把当成书的目录
    14         
    15     innodb 引擎 在创建表的时候 必须要有一个主键
    16     当你没有指定主键的时候
    17         1.会将非空切唯一的字段自动升级主键
    18         2.当你的表中没有任何的约束条件 innodb会采用自己的内部默认的一个主键字段
    19             该主键字段你在查询时候是无法使用的
    20             查询数据的速度就会很慢
    21             类似于一页一页的翻书
    22             create table t12(
    23                 id int,
    24                 name char(16),
    25                 age int not null unique,
    26                 addr char(16) not null unique
    27                 );
    28             
    29         主键字段到底设置给谁呢???
    30             通常每张表里面都应该有一个id字段
    31             并且应该将id设置为表的主键字段
    32         
    33         
    34     
    35 """
    36 """
    37 联合主键:
    38     多个字段联合起来作为表的一个主键,本质还是主键!!!
    39     ps:innodb 引擎中一张表有且只有一个主键
    40     
    41     create table t13(
    42         ip char(16),
    43         port int,
    44         primary key(ip,port)
    45         );
    46         
    47         desc t13;
    48         
    49     主键字段 应该具备自动递增的特点
    50         每次添加数据,不需要用户手动输入
    51         auto_crement 自动递增
    52     create table t14(
    53         id int auto_crement primary key,
    54         name varchar(32)
    55         );
    56     delete from 仅仅是删除数据 不会重置主键
    57     新创会接着原先ID继续
    58     
    59     truncate 初始化表 会重置主键 id从0开始记录
    60 """
    3.primary key 主键.py
     1 01 上周内容回顾.mp4
     2 02 存储引擎.mp4
     3 03 创建表的完整性约束.mp4
     4 04 整型类型.mp4
     5 05 严格模式.mp4
     6 06 浮点型.mp4
     7 07 字符类型.mp4
     8 08 日期类型.mp4
     9 09 枚举与集合类型.mp4
    10 10 约束条件.mp4
    readme
  • 相关阅读:
    kafka producer batch expired TimeoutException: KAFKA-5621、KIP-91(Provide Intuitive User Timeouts in The Producer)、KAFKA-5886
    Kafka Producer NetworkException and Timeout Exceptions
    How LinkedIn customizes Apache Kafka for 7 trillion messages per day
    elasticsearch es java api Using Bulk Processor
    ranger kafka
    kafka clients大全:支持语言集合(java/go/python/c++……)
    Apache NiFi之Kafka流数据到HBase
    Apache NiFi之MySQL数据同步到HBase
    Apache NiFi之MySQL数据同步到本地文件系统
    如何在 Flink 1.9 中使用 Hive?
  • 原文地址:https://www.cnblogs.com/llx--20190411/p/11381055.html
Copyright © 2020-2023  润新知