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
相關文章
相關標籤/搜索