MySQL性能优化(二)-- 数据类型,SQL,八种链接

1、mysql数据类型优化原则

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

img

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

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

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

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

存储空间:加密

非空:65533字节spa

可空:65532字节设计

优势:节省空间,操做简单code

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

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

     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;
复制代码

结果以下:

img
    

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

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

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

(6) 日期时间类型

img

  1. 尽可能避免NULL   4. 尽可能使用简单类型

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

2、SQL性能降低缘由

  1. I/O吞吐量小,造成了瓶颈效应
  2. CPU性能差
  3. 内存不足,磁盘空间不足
  4. 没有索引或者没有用到索引
  5. 查询语句太烂,没有优化(各类join,子查询)
  6. 检索返回的数据量过大
  7. 返回了没必要要的行和列
  8. 锁或者死锁(程序设计的缺陷)
  9. 配置参数没有优化

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

3、SQL手写顺序

select distinct <select_list>
&emsp;&emsp;from <left_table>
&emsp;&emsp;<join_type> join <right_table>
&emsp;&emsp;on <join_condition>
&emsp;&emsp;group by <group_by_list>
&emsp;&emsp;having <having_condition>
&emsp;&emsp;order by <order_bu_list>
&emsp;&emsp;limit <limit_number>
复制代码

4、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:取出指定的行,并返回结果

5、经常使用的JOIN SQL

  1. 左外链接
  2. 右外链接
  3. 内链接
  4. 全链接
  5. 交叉链接
  6. 全外链接

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循环)

img

2.左链接 left join left outer join

img

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

左表应该都是小表。

img

3.右链接 right join

img

右表所有保留,左表关联不上的用null表示。

img

4.内链接 inner join

img

两个表的公共部分。

img

5.查询左表中独有部分

img

img

6.查询右表中独有数据

img

img

7.全链接

img

在MySQL中没有full join

img

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

img

img

欢迎关注个人公众号,第一时间接收最新文章~ 搜索公众号: 码咖 或者 扫描下方二维码:

img
相关文章
相关标签/搜索