1. 程式人生 > >庫與表的基本操作以及資料庫的增刪改(一)

庫與表的基本操作以及資料庫的增刪改(一)

資料庫,後端開發者必學,而且現在以MySQL居多。家下來我們將系統化MySQL一些高階用法。打算先講很多人關注的使用方式(增刪改查以及其優化),然後就講資料庫和表的操作(很多我們學習忽略的地方),接著就是引擎還有更高階的查詢等等

首先我們用Navicat連結到我們的資料庫,新建一個數據庫,選中我們的資料庫找到查詢下的新建查詢,建立兩個資料表

CREATE TABLE `score` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `change_type` VARCHAR(255) NULL DEFAULT NULL,
    `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `score` INT(11) NULL DEFAULT NULL,
    `user_id` BIGINT(20) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci';

CREATE TABLE `gag` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `gag_time` DATE NULL DEFAULT NULL,
    `user_id` BIGINT(20) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci';

有了這兩張表 我們就可以來操作了

INSERT語句

INSERT [INTO] 表名 [(欄位列表)] VALUES (值列表)[, (值列表), …]

INSERT INTO score (change_type,score,user_id) VALUES ('吃飯',10,1);

注意: 如果要插入的值列表包含所有欄位並且順序一致,則可以省略欄位列表。 可同時插入多條資料記錄!

例子

INSERT INTO score (change_type,score,user_id) VALUES ('吃飯',10,1),('喝茶',10,1),('喝茶',10,1);  

(2)將程序/執行緒數控制在2倍於CPU數目相對合適 (3)採用順序主鍵策略(例如自增主鍵,或者修改業務邏輯,讓插入的記錄儘可能順序主鍵)

DELETE語句: DELETE FROM 表名[ 刪除條件子句] 沒有條件子句,則會刪除全部(慎重

例子

DELETE FROM gag;      刪除全部
DELETE FROM gag WHERE id=1;

UPDATE語句

UPDATE 表名 SET 欄位名=新值[, 欄位名=新值] [更新條件] 例子:

UPDATE score SET change_type='洗澡' WHERE id=2;

優化: 更新多條記錄

Update score  
  SET change_type = CASE id  
    WHEN 1 THEN 'value1'  
    WHEN 2 THEN 'value2'  
    WHEN 3 THEN 'value3'  
  END  
WHERE id IN (1,2,3)

更新多條記錄的多個值

Update score  
  SET change_type = CASE id  
    WHEN 1 THEN 'value1'  
    WHEN 2 THEN 'value2'  
    WHEN 3 THEN 'value3'  
  END , 
    score = CASE id
     WHEN 1 THEN 1
    WHEN 2 THEN 2
    WHEN 3 THEN 3
  END
WHERE id IN (1,2,3)

(1). 儘量不要修改主鍵欄位。 (2). 當修改VARCHAR型欄位時,儘量使用相同長度內容的值代替。 (3). 儘量最小化對於含有UPDATE觸發器的表的UPDATE操作。 (4). 避免UPDATE將要複製到其他資料庫的列。 (5). 避免UPDATE建有很多索引的列。 (6). 避免UPDATE在WHERE子句條件中的列。

庫與表基本操作

庫的基本操作

(1)檢視所有資料庫以及使用資料庫:

show databases;
use table;

(2)檢視當前資料庫

select database();

本文件使用 看雲 構建

庫與表基本操作以及資料增刪改

前言

資料庫,後端開發者必學,而且現在以MySQL居多。家下來我們將系統化MySQL一些高階用法。打算先講很多人關注的使用方式(增刪改查以及其優化),然後就講資料庫和表的操作(很多我們學習忽略的地方),接著就是引擎還有更高階的查詢等等

操作資料語句優化認識:

通常情況下,當訪問某張表的時候,讀取者首先必須獲取該表的鎖,如果有寫入操作到達,那麼寫入者一直等待讀取者完成操作(查詢開始之後就不能中斷,因此不允許讀取者完成之前進行寫操作)。當讀取者完成對錶的操作的時候,鎖就會被解除。如果寫入者正在等待的時候,另一個讀取操作到達了,該讀取操作也會被阻塞(block),因為預設的排程策略是寫入者優先於讀取者。當第一個讀取者完成操作並解放鎖後,寫入者開始操作,並且直到該寫入者完成操作,第二個讀取者才開始操作。

通過LOCK TABLESUNLOCK TABLES語句可以顯式地獲取或釋放鎖,但是在通常情況下,伺服器的鎖管理器會自動地在需要的時候獲取鎖,在不再需要的時候釋放鎖。獲取的鎖的型別依賴於客戶端是寫入還是讀取操作。

對某張表進行寫入操作的客戶端必須擁有獨佔的(排他的)訪問權的鎖。操作在進行的過程中,該資料表處於不一致的(inconsistent)狀態,因為資料記錄在刪除、新增或修改的時候,資料表上的索引也可能需要更新以相互匹配。允許兩個客戶端同時寫入一張資料表是不利的,因為這樣的操作會很快使資料表中的資訊成為一堆無用的垃圾。同時允許客戶端讀取變化之中的資料表也不正確,因為正在讀取的位置中的資料可能正在變化(修改),讀取的結果可能並不是真實的。因此對某張表執行讀取操作的客戶端也必須獲取一個鎖,防止在讀取的過程中,其它的客戶端寫入或改變表。但是這個鎖不需要獨佔的訪問權。因為讀取操作不會改變資料,因此沒有理由讓某個讀取者阻止其它的讀取者訪問這張表。所以讀取鎖可允許其它的客戶端在同一時刻讀取這張表。 雖然通過鎖機制,可以實現多執行緒同時對某個表進行操作,但當某個執行緒作更新操作時,首先要獲得獨佔的訪問權。在更新的過程中,所有其它想要訪問這個表的執行緒必須要等到其更新完成為止。此時就會導致鎖競爭的問題,從而導致使用者等待時間的延長。

因此:要提高MySQL的更新/插入效率,應首先考慮降低鎖的競爭,減少寫操作的等待時間。 (在後面才討論表設計的優化)

CREATE TABLE `score` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `change_type` VARCHAR(255) NULL DEFAULT NULL,
    `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `score` INT(11) NULL DEFAULT NULL,
    `user_id` BIGINT(20) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci';

CREATE TABLE `gag` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `gag_time` DATE NULL DEFAULT NULL,
    `user_id` BIGINT(20) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci';


INSERT語句

INSERT [INTO] 表名 [(欄位列表)] VALUES (值列表)[, (值列表), …]

注意: 如果要插入的值列表包含所有欄位並且順序一致,則可以省略欄位列表。 可同時插入多條資料記錄!

例子:

INSERT INTO score (change_type,score,user_id) VALUES ('吃飯',10,1);

優化: (1)當我們需要批量插入資料的時候,這樣的語句卻會出現效能問題。例如說,如果有需要插入100000條資料,那麼就需要有100000條insert語句,每一句都需要提交到關係引擎那裡去解析,優化,然後才能夠到達儲存引擎做真的插入工作。上述所說的同時插入多條就是一種優化。(經測試,大概10條同時插入是最高效的)

例子:

INSERT INTO score (change_type,score,user_id) VALUES ('吃飯',10,1),('喝茶',10,1),('喝茶',10,1);   

(2)將程序/執行緒數控制在2倍於CPU數目相對合適 (3)採用順序主鍵策略(例如自增主鍵,或者修改業務邏輯,讓插入的記錄儘可能順序主鍵)

DELETE語句: DELETE FROM 表名[ 刪除條件子句] 沒有條件子句,則會刪除全部(慎重

例子:

DELETE FROM gag;      刪除全部
DELETE FROM gag WHERE id=1;

補充: Mysql中truncate table和delete語句都可以刪除表裡面所有資料,但是在一些情況下有些不同!

例子:truncate table gag;

(1)truncate table速度要更快一些,但truncate刪除後不記錄mysql日誌,不可以恢復資料。

(2)如果沒有外來鍵關聯,innodb執行truncate是先drop table(原始表),再建立一個跟原始表一樣空表,速度要遠遠快於delete逐條刪除行記錄。

(3)表有外來鍵關聯,truncate table刪除表資料為逐行刪除, 如果外來鍵指定級聯刪除(delete cascade),關聯的子表也會會被刪除所有表資料。 如果外來鍵未指定級聯(cascde),truncate table逐行刪除資料, 如果是父行關聯子錶行資料,將會報錯。 (4)auto_increment計數器在truncate table後會重置為0.與是否有外來鍵關聯沒有關係。

注意: 一個大的 DELETE 或 INSERT 操作,要非常小心,因為這兩個操作是會鎖表的,表一鎖住,其他操作就進不來了。因此,我們要交給DBA去拆分,重整資料庫策略,比如限制處理1000條。 MySQL官方手冊得知刪除資料的速度和建立的索引數量是成正比的。所以在超大型資料庫中,刪除時處理好索引關係非常重要。

推薦的折中方法: 在刪除資料之前刪除這幾個索引,然後刪除其中無用資料,刪除完成後重新建立索引。

UPDATE語句UPDATE 表名 SET 欄位名=新值[, 欄位名=新值] [更新條件] 例子:

UPDATE score SET change_type='洗澡' WHERE id=2;

優化: 更新多條記錄

Update score  
  SET change_type = CASE id  
    WHEN 1 THEN 'value1'  
    WHEN 2 THEN 'value2'  
    WHEN 3 THEN 'value3'  
  END  
WHERE id IN (1,2,3)  

更新多條記錄的多個值

Update score  
  SET change_type = CASE id  
    WHEN 1 THEN 'value1'  
    WHEN 2 THEN 'value2'  
    WHEN 3 THEN 'value3'  
  END , 
    score = CASE id
     WHEN 1 THEN 1
    WHEN 2 THEN 2
    WHEN 3 THEN 3
  END
WHERE id IN (1,2,3)  

(1). 儘量不要修改主鍵欄位。 (2). 當修改VARCHAR型欄位時,儘量使用相同長度內容的值代替。 (3). 儘量最小化對於含有UPDATE觸發器的表的UPDATE操作。 (4). 避免UPDATE將要複製到其他資料庫的列。 (5). 避免UPDATE建有很多索引的列。 (6). 避免UPDATE在WHERE子句條件中的列。

庫與表基本操作

庫的基本操作

(1)檢視所有資料庫以及使用資料庫:

show databases;
use table;

(2)檢視當前資料庫

 select database();

(3)顯示當前時間、使用者名稱、資料庫版本

select now(), user(), version();

 (4)建立庫

create database[ if not exists] 資料庫名 資料庫選項
    資料庫選項:
        CHARACTER SET charset_name
        COLLATE collation_name

(5)檢視當前庫資訊

show create database 資料庫名

(6)修改庫的選項資訊

alter database 庫名 選項資訊

 (7)刪除庫

本文件使用 看雲 構建

庫與表基本操作以及資料增刪改

前言

資料庫,後端開發者必學,而且現在以MySQL居多。家下來我們將系統化MySQL一些高階用法。打算先講很多人關注的使用方式(增刪改查以及其優化),然後就講資料庫和表的操作(很多我們學習忽略的地方),接著就是引擎還有更高階的查詢等等

操作資料語句優化認識:

通常情況下,當訪問某張表的時候,讀取者首先必須獲取該表的鎖,如果有寫入操作到達,那麼寫入者一直等待讀取者完成操作(查詢開始之後就不能中斷,因此不允許讀取者完成之前進行寫操作)。當讀取者完成對錶的操作的時候,鎖就會被解除。如果寫入者正在等待的時候,另一個讀取操作到達了,該讀取操作也會被阻塞(block),因為預設的排程策略是寫入者優先於讀取者。當第一個讀取者完成操作並解放鎖後,寫入者開始操作,並且直到該寫入者完成操作,第二個讀取者才開始操作。

通過LOCK TABLESUNLOCK TABLES語句可以顯式地獲取或釋放鎖,但是在通常情況下,伺服器的鎖管理器會自動地在需要的時候獲取鎖,在不再需要的時候釋放鎖。獲取的鎖的型別依賴於客戶端是寫入還是讀取操作。

對某張表進行寫入操作的客戶端必須擁有獨佔的(排他的)訪問權的鎖。操作在進行的過程中,該資料表處於不一致的(inconsistent)狀態,因為資料記錄在刪除、新增或修改的時候,資料表上的索引也可能需要更新以相互匹配。允許兩個客戶端同時寫入一張資料表是不利的,因為這樣的操作會很快使資料表中的資訊成為一堆無用的垃圾。同時允許客戶端讀取變化之中的資料表也不正確,因為正在讀取的位置中的資料可能正在變化(修改),讀取的結果可能並不是真實的。因此對某張表執行讀取操作的客戶端也必須獲取一個鎖,防止在讀取的過程中,其它的客戶端寫入或改變表。但是這個鎖不需要獨佔的訪問權。因為讀取操作不會改變資料,因此沒有理由讓某個讀取者阻止其它的讀取者訪問這張表。所以讀取鎖可允許其它的客戶端在同一時刻讀取這張表。 雖然通過鎖機制,可以實現多執行緒同時對某個表進行操作,但當某個執行緒作更新操作時,首先要獲得獨佔的訪問權。在更新的過程中,所有其它想要訪問這個表的執行緒必須要等到其更新完成為止。此時就會導致鎖競爭的問題,從而導致使用者等待時間的延長。

因此:要提高MySQL的更新/插入效率,應首先考慮降低鎖的競爭,減少寫操作的等待時間。 (在後面才討論表設計的優化)

CREATE TABLE `score` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `change_type` VARCHAR(255) NULL DEFAULT NULL,
    `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `score` INT(11) NULL DEFAULT NULL,
    `user_id` BIGINT(20) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci';

CREATE TABLE `gag` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `gag_time` DATE NULL DEFAULT NULL,
    `user_id` BIGINT(20) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci';


INSERT語句

INSERT [INTO] 表名 [(欄位列表)] VALUES (值列表)[, (值列表), …]

注意: 如果要插入的值列表包含所有欄位並且順序一致,則可以省略欄位列表。 可同時插入多條資料記錄!

例子:

INSERT INTO score (change_type,score,user_id) VALUES ('吃飯',10,1);

優化: (1)當我們需要批量插入資料的時候,這樣的語句卻會出現效能問題。例如說,如果有需要插入100000條資料,那麼就需要有100000條insert語句,每一句都需要提交到關係引擎那裡去解析,優化,然後才能夠到達儲存引擎做真的插入工作。上述所說的同時插入多條就是一種優化。(經測試,大概10條同時插入是最高效的)

例子:

INSERT INTO score (change_type,score,user_id) VALUES ('吃飯',10,1),('喝茶',10,1),('喝茶',10,1);   

(2)將程序/執行緒數控制在2倍於CPU數目相對合適 (3)採用順序主鍵策略(例如自增主鍵,或者修改業務邏輯,讓插入的記錄儘可能順序主鍵)

DELETE語句: DELETE FROM 表名[ 刪除條件子句] 沒有條件子句,則會刪除全部(慎重

例子:

DELETE FROM gag;      刪除全部
DELETE FROM gag WHERE id=1;

補充: Mysql中truncate table和delete語句都可以刪除表裡面所有資料,但是在一些情況下有些不同!

例子:truncate table gag;

(1)truncate table速度要更快一些,但truncate刪除後不記錄mysql日誌,不可以恢復資料。

(2)如果沒有外來鍵關聯,innodb執行truncate是先drop table(原始表),再建立一個跟原始表一樣空表,速度要遠遠快於delete逐條刪除行記錄。

(3)表有外來鍵關聯,truncate table刪除表資料為逐行刪除, 如果外來鍵指定級聯刪除(delete cascade),關聯的子表也會會被刪除所有表資料。 如果外來鍵未指定級聯(cascde),truncate table逐行刪除資料, 如果是父行關聯子錶行資料,將會報錯。 (4)auto_increment計數器在truncate table後會重置為0.與是否有外來鍵關聯沒有關係。

注意: 一個大的 DELETE 或 INSERT 操作,要非常小心,因為這兩個操作是會鎖表的,表一鎖住,其他操作就進不來了。因此,我們要交給DBA去拆分,重整資料庫策略,比如限制處理1000條。 MySQL官方手冊得知刪除資料的速度和建立的索引數量是成正比的。所以在超大型資料庫中,刪除時處理好索引關係非常重要。

推薦的折中方法: 在刪除資料之前刪除這幾個索引,然後刪除其中無用資料,刪除完成後重新建立索引。

UPDATE語句UPDATE 表名 SET 欄位名=新值[, 欄位名=新值] [更新條件] 例子:

UPDATE score SET change_type='洗澡' WHERE id=2;

優化: 更新多條記錄

Update score  
  SET change_type = CASE id  
    WHEN 1 THEN 'value1'  
    WHEN 2 THEN 'value2'  
    WHEN 3 THEN 'value3'  
  END  
WHERE id IN (1,2,3)  

更新多條記錄的多個值

Update score  
  SET change_type = CASE id  
    WHEN 1 THEN 'value1'  
    WHEN 2 THEN 'value2'  
    WHEN 3 THEN 'value3'  
  END , 
    score = CASE id
     WHEN 1 THEN 1
    WHEN 2 THEN 2
    WHEN 3 THEN 3
  END
WHERE id IN (1,2,3)  

(1). 儘量不要修改主鍵欄位。 (2). 當修改VARCHAR型欄位時,儘量使用相同長度內容的值代替。 (3). 儘量最小化對於含有UPDATE觸發器的表的UPDATE操作。 (4). 避免UPDATE將要複製到其他資料庫的列。 (5). 避免UPDATE建有很多索引的列。 (6). 避免UPDATE在WHERE子句條件中的列。

庫與表基本操作

庫的基本操作

(1)檢視所有資料庫以及使用資料庫:

show databases;
use table;

(2)檢視當前資料庫

 select database();

(3)顯示當前時間、使用者名稱、資料庫版本

select now(), user(), version();

(4)建立庫

create database[ if not exists] 資料庫名 資料庫選項
    資料庫選項:
        CHARACTER SET charset_name
        COLLATE collation_name

(5)檢視當前庫資訊

show create database 資料庫名

(6)修改庫的選項資訊

alter database 庫名 選項資訊

(7)刪除庫

drop database[ if exists] 資料庫名
        同時刪除該資料庫相關的目錄及其目錄內容