day41

存储索引

就是存储数据的方式

如何查看存储引擎? 都有哪些存储引擎?
show engines;
   
MyISAM:
mysql5.5版本及之前的版本默认引擎
   查询速度比InnoDB快, 安全性低
# 不支持事务
   # 表级锁
InnoDB
mysql5.6及之后的版本默认引擎
   查询速度比MyISAM慢, 安全性高
   
   # 功能:
  1. 支持事务
       2. 行级锁
       3. 外键
MEMORY => 内存
# 数据是在内存中
   
   
面试题:
MyISAM和InnoDB引擎的区别?
   1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;

2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;

3. InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

4. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;

5. Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;

# 特点
create table t2 (id int) engine='MyISAM';
   create table t3 (id int) engine='InnoDB';
   create table t4 (id int) engine='MEMORY';
   
   show create table 表名; # 查看所创建表的存储引擎
   
MyISAM
.frm =>  表结构
  .MYD =>   表数据
  .MYI =>   索引(目录)优点:查询速度快

InnoDB
.frm => 表结构
  .ibd => 表数据和索引

MEMORY
.frm => 表结构

数据类型之整型

tinyint smallint int bigint
# 他们之间的区别就是存储数据的范围不一样

# 验证整型默认是否带符号
create table t6 (id tinyint);
   
   insert into t6 values(-129), (256);
   
   select * from t6;
# 结论:所有的整型默认都是带符号的。

数据类型之浮点型


float double decimal

# float(8, 2) 999999.99
float(255,30)
总共255位,小数30位
double(255,30)
总共255位,小数30位
decimal(60,30)
总共60位,小数30位
   decimal中最大位数为65
   
   
create table t6 (id float(255,30));
create table t7 (id double(255,30));
create table t8 (id decimal(60,30));

insert into t6 values(1.11111111111111111111111111);
insert into t7 values(1.11111111111111111111111111);
insert into t8 values(1.11111111111111111111111111);

select * from t7;
select * from t8;
select * from t9;


# 精确度不一样
decimal > double > float


设计表注意:
1表结构中的数据类型
   2、该表中上线之后可能会产生多少数据量?order

数据类型之字符串


# 两种字符串括号中的数字必须写, 代表存储字符串的长度
char(4)
存储4位,不够的空格补齐4位,超过4位的报错
# 优点
查询速度快, 整存整取
# 缺点
浪费空间
varchar(4)
存储4位,有几位存几位,超过的报错

# 优点:
节省空间
# 缺点
查询速度比char慢

   char(4)  varchar(4)
     
  pack(2) => 1  pack(10) => 1

  unpack(1) => 2   unpack(1) => 10
1byteskevin1bytesegon1bytesjasonlytom

select id, char_length(name) from t10; # 查找name中的字符串长度
   

# 验证
create table t10 (id int, name char(4));
create table t9 (id int, name varchar(4));

insert into t10 values(1, 'kevin'); # 字符串长度超过4,报错
insert into t9 values(1, 'kevin'); # 字符串长度超过4,报错

了解知识:
# 查看mysql版本模式
show variables like '%mode%'; # 查看模式
set global sql_mode='strict_trans_tables'; # 设置模式为‘严格模式’
# 修改完成后退出重新登录

数据类型之日期类型

datetime
date
time
year

#
create table t12 (id int,  r1_time datetime, r2_time date, r3_time time, r4_time year);

#
insert into t12 values (1, '2021-11-11 11:11:11','2021-11-11','11:11:11','2021');

数据类型之枚举

# 枚举  多选一


create table t13 (
id int,
   gender enum('male', 'female', 'other')
)

#
insert into t13 values (1, 'egon'); #不符合创建表的规范会报错
insert into t13 values (1, 'male'); #增加数据成功

数据类型之集合类型

# 集合  可以选择多个选项
create table t14 (
  id int,
       hobby set('read', 'music', 'football', 'lm')
  )
   
#
insert into t14 values(1, 'egon'); # 没有增加规范数据,报错
insert into t14 values(1, 'read'); # 增加成功
insert into t14 values(1, 'read, music'); # 增加多个爱好成功
insert into t14 values(1, 'read, egon'); #不规范,报错

创建表的完整语句

create table 表名 (
字段名  数据类型(长度) 约束条件1 约束条件2 约束条件3,
字段名  数据类型(长度) 约束条件1 约束条件2 约束条件3,
   字段名  数据类型(长度) 约束条件1 约束条件2 约束条件3,
   字段名  数据类型(长度) 约束条件1 约束条件2 约束条件3
)

# 注意:
1. 表中字段名和数据类型是必填项, 约束条件是可选的
   2. 约束条件可以有多个,依次往下写
   3. SQL语句的最后一个不能加逗号(,

 约束条件

  在已有条件的基础上再做限制

  zerofill  零空

  unsigned  无符号

  not null  非空

  primary key  主键

  auto_increment  自增

  foreign key  外键

  unique  唯一

  default  默认值

  

posted @ 2021-07-27 20:57  Gnomeshghy  阅读(398)  评论(0)    收藏  举报