庫與表的基本操作以及資料庫的增刪改(一)
資料庫,後端開發者必學,而且現在以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 TABLES和UNLOCK 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 TABLES和UNLOCK 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] 資料庫名
同時刪除該資料庫相關的目錄及其目錄內容