字符串存入mysql_Mysql 数据类型,SQL,八种连接基本知识分享

本文围绕MySQL展开,介绍了数据类型优化原则,如int、varchar、char等类型的特点与应用场景;分析了SQL性能下降的原因,包括I/O、CPU、索引等问题;阐述了SQL手写和读取顺序,还列举了常用的JOIN SQL类型,并给出相关实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击蓝色「日拱一兵」关注,持续侦破 Java 技术案件

一、mysql数据类型优化原则

1. 能够使用最小数据类型存储时,尽量使用最小数据类型存储(前提是要评估字段值的真实数据存储范围)

b07a5a1c7bc893e8e29bea901ca0bb11.png

eg:create table aaa(id1 int(10) zerofill,id2 int (10));  

(1) int(n) 中的 n代表宽度,表示没有设定宽度的时候,用0填充,需要配合zerofill来使用。

eg: insert into aaa values(12,11);

(2) varchar 存储变长的字符串,即根据存入的值的长度来动态变化

存储空间:

非空:65533字节

可空:65532字节

优点:节省空间,操作简单

缺点:在update的时候,如果数据的长度变化了,就会去申请空间,从而有额外的工作,对性能有影响。

应用场景:

1.字符串最大长度比平均真实值大的比较多,这个时候就会用。

2.更新频率比较低的字符串字段

(3) char 存储定长的字符串

存储长度:create table t (char(10) not null)

非空:存储255字节

可空:存储254字节

应用场景:

1.适合存储比较短的字符串

2.存储固定的长度或者存储长度比较接近的字符串 。例如:手机号、MD5加密的密码、邮编等

3.经常变更的数据(不需要释放空间重新申请,即不会产生内存碎片)

4.存储比较短的字符串值,例如:Y/N

有趣的例子:

create table test_char(name char(10));

insert into test_char values('abc'),(' abc'),('abc ');

select concat("'",name,"'") from test_char;

结果如下:8edd242b5bb18694313873880b340076.png

结论:如果插入的值末尾有空格,会自动截取掉。

(4) text:存储变长的非二进制的字符串

(5) blog:用于存储二进制数据,大二进制数据,也就是可以存储流,图片或者音频文件

(6) 日期时间类型

21ded5a9864902baa226065c3f85e9ca.png

  1. 尽量避免NULL  

  2. 尽量使用简单类型

    建表的时候可以将为null的 赋其他默认值,如:字符串的设置'',数据类型的设为0,不要将null设为默认值。

二、SQL性能下降原因
  1. I/O吞吐量小,形成了瓶颈效应

  2. CPU性能差

  3. 内存不足,磁盘空间不足

  4. 没有索引或者没有用到索引

  5. 查询语句太烂,没有优化(各种join,子查询)

  6. 检索返回的数据量过大

  7. 返回了不必要的行和列

  8. 锁或者死锁(程序设计的缺陷)

  9. 配置参数没有优化

插曲:查询Linux性能参数 top、htop、free -m、df -hl

三、SQL手写顺序

select distinct

  from

   join

  on

  group by

  having

  order by

  limit

四、SQL读取顺序
  • from:左表和右表的笛卡尔积,产生虚拟表v1

  • on:对v1进行筛选,根据join-condition过滤,产生v2

  • join:如果是left join,就把左表在v2的结果通过on过滤,通过右表的外部行过滤,产生v3

  • where:过滤条件,产生v4

  • group by :分组,产生v5

  • having:过滤条件,产生v6

  • select:load出指定的列,产生v7

  • distinct:排重,产生v8

  • order by:排序,产生v9

  • limit:取出指定的行,并返回结果

五、常用的JOIN SQL
  1. 左外连接

  2. 右外连接

  3. 内连接

  4. 全连接

  5. 交叉连接

  6. 全外连接

六、实例

join 建表语句

create database test2017;

use test2017;

左表t1

create table t1(id int not null,name varchar(20));

insert into t1 values(1,'t1a');

insert into t1 values(2,'t2a');

insert into t1 values(3,'t3a');

insert into t1 values(4,'t4a');

insert into t1 values(5,'t5a');

右表t2

create table t2(id int not null,name varchar(20));

insert into t2 values(2,'t2b');

insert into t2 values(3,'t2c');

insert into t2 values(4,'t2d');

insert into t2 values(5,'t2f');

insert into t2 values(6,'t2a');

1.笛卡尔积(相当于两个for循环)

1b6c4563e8bf286aafe7c8b909c60220.png

2.左连接 left join left outer join

5573d3ef60ad2235b82417fc3b246963.png

左表全部保留,右表关联不上的用null表示。结果 t1 中存在id为1的,t2中没有,则对应t2中的记录用null表示。

左表应该都是小表。

d6cc3234d3ff5ce191e5d8ebaadcfe27.png

3.右连接 right join

f5ea3cb904cae54dee06d03e5b3a6316.png

右表全部保留,左表关联不上的用null表示。

3468ff75fe35ca84b3b822f716e6becc.png

4.内连接 inner join

69f862b82bb55ee2565c70beadacae49.png

两个表的公共部分。

06f0f4364982337991f0b2247fa2f0f1.png

5.查询左表中独有部分

42e55edb8aa2bd5972e66b63219e68be.png

9b1d290b3e95a75c84f602f060e322f3.png

6.查询右表中独有数据

6e086f3b9d7d3038806be8ed8c58b9df.png

4e95171d4e669c1f2b6c9cc0ce2998ac.png

7.全连接

6f213a071dd5ad31ac85e38f1492485d.png

在MySQL中没有full join

e135fd52d79755aa4cd384410d2edf56.png

  1. 查询t1和t2的独有数据部分

4fe8a797082b90a32c187081310bcbcc.png

bd702763d15449d63d273cd942f3f4cc.png


fd54eed26657e9fb84aeb9cf6ba0d160.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值