1. 程式人生 > 實用技巧 >表相關操作

表相關操作

目錄

一:儲存引擎介紹

1:什麼是儲存引擎?

儲存引擎就是表的型別,針對不同型別的表,mysql使用不同的程式碼處理

現實生活中我們用來儲存資料的檔案有不同的型別,每種檔案型別對應各自不同的處理機制:比如處理文字用txt型別,處理表格用excel,處理圖片用png等 資料庫中的表也應該有不同的型別,表的型別不同,會對應mysql不同的存取機制,表型別又稱為儲存引擎。 儲存引擎說白了就是如何儲存資料、如何為儲存的資料建立索引和如何更新、查詢資料等技術的實現方 法。因為在關係資料庫中資料的儲存是以表的形式儲存的,所以儲存引擎也可以稱為表型別(即儲存和 操作此表的型別)

擴充套件

在Oracle 和SQL Server等資料庫中只有一種儲存引擎,所有資料儲存管理機制都是一樣的。而MySql 資料庫提供了多種儲存引擎。使用者可以根據不同的需求為資料表選擇不同的儲存引擎,使用者也可以根據 自己的需要編寫自己的儲存引擎 SQL 解析器、SQL 優化器、緩衝池、儲存引擎等元件在每個資料庫中都存在,但不是每 個數據庫都有這麼多儲存引擎。MySQL 的外掛式儲存引擎可以讓儲存引擎層的開發人員設 計他們希望的儲存層,例如,有的應用需要滿足事務的要求,有的應用則不需要對事務有這 麼強的要求 ;有的希望資料能持久儲存,有的只希望放在記憶體中,臨時並快速地提供對資料 的查詢。

2:mysql四種主要的儲存引擎介紹

  1. InnoDB

    使用版本: MySQL5.5版本及之後預設的儲存引擎 優點: 支援事務, 行級鎖定和外來鍵約束對資料的安全性較 半個缺點: 訪問速度沒有MyISAM快, 但是我們更加註重的是資料的安全. 每個InnoDB在磁碟上儲存成2個檔案,其中檔名和表名都相同,但是副檔名分別為: .frm(儲存表結構) .idb(i -> index. 索引+資料組織表)

  2. MyISAM

    使用版本: MySQL5.5版本之前預設的儲存引擎 優點: 訪問速度要比Innodb更快 缺點: 不支援事務,也不支援外來鍵, 對事務完整性沒有要求, 資料的安全性沒有Innodb高. 每個MyISAM在磁碟上儲存成3個檔案,其中檔名和表名都相同,但是副檔名分別為: .frm(儲存表結構) .MYD(MyData,儲存資料) .MYI(MyIndex,儲存索引)

  3. MEMORY

    優點: 採用記憶體儲存, 訪問資料可以得到最快的響應. 缺點: 斷電資料丟失. 或當mysqld守護程序崩潰時,所有的Memory資料也會丟失. 每個MEMORY在磁碟上儲存成1個檔案,其中檔名和表名都相同,但是副檔名分別為: .frm(儲存表結構)

  4. BLACKHOLE

    特點: 無論存什麼,都立刻消失(黑洞). 類似於回收站 每個BLACKHOLE在磁碟上儲存成1個檔案,其中檔名和表名都相同,但是副檔名分別為: .frm(儲存表結構)

總結

1: InnoDB支援事務,MyISAM 不支援,這一點是非常之重要。事務是一種高階的處理方式,如在一些列增刪改中只要 哪個出錯還可以回滾還原,而MyISAM就不可以了.

2:MyISAM適合查詢以及插入為主的應用,InnoDB 適合頻繁修改以及涉及到安全性較高的應用.

3:InnoDB支援外來鍵,MyISAM 不支援

4:InnoDB中不儲存表的行數, InnoDB需要掃描一遍整個表來計算有多少行. MyISAM只要簡單的讀出儲存好的行數即可。注意的是,當count()語句包含where條件時MyISAM也需要掃描整個表;

5:對於自增長的欄位,InnoDB 中必須包含只有該欄位的索引,但是在MyISAM表中可以和其他欄位一起建立聯合索引;

6:清空整個表時,InnoDB 是一行一行的刪除,效率非常慢。MyISAM 則會重建表;

7:InnoDB支援行鎖(注意: 某些情況下還是鎖整表)

3:驗證不同的儲存引擎

指定不同儲存引擎進行插入資料測試

檢視所有的支援的儲存引擎

show engines;

常看正在使用的儲存引擎

# storage儲存 儲存 保管
show variables like '%storage_engine%'

建立不同的表指定不同的儲存引擎

create database test;
use test;
create table innodb_t1(id int) engine=innodb;
create table myisam_t1(id int) engine=myisam;
create table memory_t1(id int) engine=memory;
create table blackhole_t1(id int) engine=blackhole;

插入資料

insert into innodb_t1 values(1);
insert into myisam_t1 values(1);
insert into memory_t1 values(1);
insert into blackhole_t1 values(1)

檢視

select * from innodb_t1
select * from myisam_t1
select * from memory_t1
select * from blackhole_t1

結果

mysql> select * from innodb_t1;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.07 sec)

mysql> select * from myisam_t1;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.07 sec)

mysql> select * from memory_t1;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.06 sec)

mysql> select * from blackhole_t1;
Empty set (0.07 sec)

重啟測試

net stop mysql & net start mysql
mysql> select * from memory_t1;
Empty set (0.08 sec)

二:表介紹

表相當於檔案,表中的一條記錄就相當於檔案的一行內容,不用的是,表中的一條記錄有對應的標題,稱為表的欄位

id,name,age,sex稱為欄位,其餘,一行內容稱為一條記錄

三:建立表的完整語法

# 語法
create table 表名(
	欄位名1  型別(寬度) 約束條件,
    欄位名2  型別(寬度) 約束條件,
    欄位名3  型別(寬度) 約束條件,
 )

注意

  1. 同一張表中欄位名不能重複

  2. 寬度和約束條件是可選的(可有可無)而欄位名和欄位型別是必須的

    約束條件寫的話,可以支援多個,欄位名1 型別(寬度) 約束條件1 約束條件2....,

  3. 最後一行指定不能有逗號

    create table t(
        id int,
        name char, # -->出錯了
    );
    

警告

  1. char不指定寬度,預設寬度為1

    create table t1(name char);
    insert into t1 values('json')
    
  2. 關鍵字null沒有寬度限制

    insert into t1 values(null);
    
  3. 針對不同的版本會出現不同的問題

    1. 5.6版本預設沒有開啟嚴格模式 規定只能存一個字元你給了多個字元,那麼會自動幫你擷取.
    2. 5.7版本及以上或者開啟了嚴格模式 那麼規定只能存幾個 就不能超,一旦超出範圍立刻報錯(Data too long for column 'name' at row 1.)
  4. 嚴格模式開不開?

    mysql5.7之後的版本預設都是開啟嚴格模式的

    使用資料庫準則

    1. 能儘量少的讓資料庫幹活就儘量少 不要給資料庫增加額外的壓力.
    2. 因為沒有開啟嚴格模式, 當遇到寬度超出時, 會進行額外的擷取操作這種操作就會給資料庫增加額外的壓力. 換個角度來說, 本來資料的儲存就不因該超出限制範圍.
  5. 總結

    寬度是用來限制資料的儲存

    約束條件是在寬度的基礎之上增加額外的約束

四:資料庫的三種模式指定

variables /'vɛrɪəbl/ 變數

session /ˈseʃn/ 會 話

trans /trænz 反式

pad /pæd/ 填補

substitution /ˌsʌbstɪˈtuːʃn/ 替代 換人 換船

strict trans tables 嚴格的反式表

no engine substitution 沒有引擎提交

pad char to full length 填補字元到全長度'

檢視當前模式的

一:方式一

大範圍查詢 variables + 模糊匹配
show variables like "%mode%";
# like 模糊匹配關鍵字
# % 匹配任意多個字元
# _ 匹配任意單個字元

二:方式二

select @@sql_mode;
修改模式

注意!!: 這種修改是替換操作, 如果想保留原來得模式並增添新得模式需要使用逗號隔開. 示例: 'strict_trans_tables,no_engine_substitution'

方式

set global sql_mode = 'STRICT_TRANS_TABLES';
set  session # 只在當前視窗有效
set golbal # 全域性有效
	# 注意修改完之後,需要重新登入服務端

五:資料型別

六:表完整性約束

七:修改表alter table 瞭解

注意:一下所有的約束條件可以指定多個
修改表名
alter table 表名 rename 新的表名;
增加欄位
alter table 表名 add 欄位名 欄位型別(寬度) 約束條件;
alter table 表名 add  欄位名 欄位型別(寬度) 約束條件 first;
alter table 表名 add 欄位名 欄位型別(寬度) 約束條件 after 欄位名;
刪除欄位
alter table 表名  drop 欄位名;
修改欄位
alter table 表名 modify 欄位名 欄位型別(寬度) 約束條件;
alter table 表名 change 舊欄位名 新欄位名 欄位型別(寬度) 約束條件;

八:複製表

注意:

複製不包含的key. 主鍵key, 外來鍵key, 索引key

如果通過where篩選的舊錶中沒有資料, 會生成一張空的表.

create table 新表名 select * from 就表名;
create table 新表名  select * from 舊錶名 where id 1 != 1;

九:刪除表

drop table 表名;

十:總結

# mysql四種儲存引擎: InnoDB, MyISAM, MEMORY, BLACKHOLE
"""
InnoDB: 支援事務, 外來鍵與約束, 行鎖, 資料安全, 訪問速度沒有MyISAM快. 5.5版本後
    建立一個該模式的表生成2個檔案. 字尾名: .frm, .idb
    
MyISAM: 不支援事務, 外來鍵與約束, 行鎖, 資料不太安全, 只是訪問問資料快於InnoDB. 5.5版本前
    建立一個該模式的表生成3個檔案. 字尾名: .frm, .MYD, .MYI
    
MEMORY: 記憶體
    建立一個該模式的表生成1個檔案. 字尾名: .frm
    
BLACKHOLE: 垃圾回收站
    建立一個該模式的表生成1個檔案. 字尾名: .frm
"""

# 瞭解3種模式
"""
普通模式: no_engine_substitution
嚴格模式: strict_trans_tables
取消剔除char空格模式: pad_char_to_full_length

注意: 模式的的修該方式是替換.

檢視模式2種方式:
show variable like '%mode';
select @@sql_mode;

修改模式的2種方式:
set session sql_mode=模式;
set global sql_mode=模式;