-
一、案例背景
-
二、庫表規(guī)范
-
1. 建表相關(guān)規(guī)范
-
2. 字段相關(guān)規(guī)范
-
3. 索引相關(guān)規(guī)范
-
4. 使用相關(guān)規(guī)范
-
-
三、建表語句
-
三、語句操作
-
1. 插入操作
-
2. 查詢操作
-
-
四、其他配置
-
1. 監(jiān)控活動(dòng)和性能:
-
2. 連接數(shù)查詢和配置
-
本文的宗旨在于通過簡單干凈實(shí)踐的方式教會(huì)讀者,如何更好地使用 MySQL 數(shù)據(jù)庫。這包括;庫表創(chuàng)建規(guī)范、字段的創(chuàng)建規(guī)范、索引的創(chuàng)建規(guī)范以及SQL使用的相關(guān)規(guī)范,通過這些內(nèi)容的講解,讓讀者更好使用 MySQL 數(shù)據(jù)庫,創(chuàng)建出符合規(guī)范的表和字段以及建出合適的索引。
如果你還想學(xué)習(xí)更深入的 MySQL 知識(shí),建議可以閱讀下官網(wǎng)的參考手冊(cè),這比任何一個(gè)資料都要有權(quán)威性。
-
MySQL 5.7 參考手冊(cè) -
MySQL 8.0 參考手冊(cè)
本文涉及的工程【導(dǎo)表語句】:https://gitcode.NET/KnowledgePlanet/road-map/xfg-dev-tech-mysql
-
road_map_5.6.sql -
road_map_8.0.sql
一、案例背景
此案例背景定位于使用使用一個(gè)簡單的訂單表,來講解 MySQL 使用的相關(guān)規(guī)范。包括;表的引擎、命名約束、字段長度、金額類型、更新時(shí)間、索引字段、組合索引等內(nèi)容,方便大家學(xué)習(xí)以后,可以基于這些字段的規(guī)范演示講解,在自己創(chuàng)建庫表的時(shí)候有個(gè)參考對(duì)照,盡可能創(chuàng)建出性能更佳的庫表和索引。
二、庫表規(guī)范
為了能讓讀者更加清晰地看到這些相關(guān)規(guī)范都是如何體現(xiàn)的,小傅哥這里準(zhǔn)備了個(gè)大圖,把庫表字段和規(guī)范全部整合在一起,方便學(xué)習(xí)使用。如下;
如上所列規(guī)范包括:建表相關(guān)規(guī)范、字段相關(guān)規(guī)范、索引相關(guān)規(guī)范、使用相關(guān)規(guī)范。
1. 建表相關(guān)規(guī)范
-
庫名、表名、字段名,使用小寫和下劃線 _ 分割 -
庫名、表名、字段名,不超過12個(gè)字符。默認(rèn)支持64個(gè)字符。 -
庫名、表名、字段名,見名知意,建議使用名詞而不是動(dòng)詞。 -
使用 InnoDB 存儲(chǔ)引擎。支持;事務(wù)、鎖、高并發(fā) 性能好。 -
推薦使用 utf8mb4 可以存emoji -
單表字段數(shù),建議不超過40個(gè)
2. 字段相關(guān)規(guī)范
-
整型定義中不顯示設(shè)置長度,如使用 INT,而不是INT(4) -
存儲(chǔ)精度浮點(diǎn)數(shù),使用 DECIMAL 替代 FLOAT、DOUBLE -
所有字段,都要有 Comment 描述 -
所有字段應(yīng)定義為 NOT NULL -
超過2038年,用DATETIME存儲(chǔ) -
短數(shù)據(jù)類型 0~80 選用 TINYINT 存儲(chǔ) -
UUID 有全局唯一統(tǒng)一字段屬性,適合做同步ES使用。 -
IPV4,用無符號(hào) INT 存儲(chǔ) -
IPV6,用VARBINARY存儲(chǔ) -
JSON MySql 8.x 新增特性 -
update_time 設(shè)置 on update 更新屬性
3. 索引相關(guān)規(guī)范
-
要求有自增ID作為主鍵,不要使用隨機(jī)性較強(qiáng)的 order_id 作為主鍵,會(huì)導(dǎo)致innodb內(nèi)部page分裂和大量隨機(jī)I/O,性能下降。 -
單表索引建議控制在5個(gè)以內(nèi),單索引字段數(shù)不超過5個(gè)。注意:已有idx(a, b)索引,又有idx(a)索引,可以把idx(a)刪了,浪費(fèi)空間,降低更新、寫入性能。* 單個(gè)索引中,每個(gè)索引記錄的長度不能超過64KB -
利用覆蓋索引來進(jìn)行查詢操作,避免回表。另外建組合索引的時(shí)候,區(qū)分度最高的在最左邊。 -
select(count(distinct(字段)))/count(id) = 1
的區(qū)分度,更適合建索引。在一些低區(qū)分度的字段,例如type、status上建立獨(dú)立索引幾乎沒意義,降低更新、寫入性能。 -
防止因字段不同造成的隱式轉(zhuǎn)換,導(dǎo)致索引失效。 -
更新頻繁的字段,不要建索引。
4. 使用相關(guān)規(guī)范
-
單表數(shù)據(jù)量不超過500萬行,ibc 文件大小不超過 2G -
水平分表用取模,日志、報(bào)表類,可以用日期 -
單實(shí)例表數(shù)目小于 500 -
alter表之前,先判斷表數(shù)據(jù)量,對(duì)于超過100W行記錄的表進(jìn)行alter table,必須在業(yè)務(wù)低峰期執(zhí)行。因?yàn)閍lter table會(huì)產(chǎn)生表鎖,期間阻塞對(duì)于該表的所有寫入 -
SELECT語句必須指定具體字段名稱,禁止寫成 “*”select *
會(huì)將不需要讀的數(shù)據(jù)也從MySQL里讀出來,造成網(wǎng)卡壓力,數(shù)據(jù)表字段一旦更新,但model層沒有來得及更新的話,系統(tǒng)會(huì)報(bào)錯(cuò) -
insert語句指定具體字段名稱,不要寫成 insert into t1 values(…)
-
insert into…values(XX),(XX),(XX)..
這里XX的值不要超過5000個(gè),值過多會(huì)引起主從同步延遲變大。 -
union all
和union
,不要超過5個(gè)子句,如果沒有去重的需求,使用union all性能更好。 -
in 值列表限制在500以內(nèi),例如 select… where userid in(….500個(gè)以內(nèi)…)
,可以減少底層掃描,減輕數(shù)據(jù)庫壓力。 -
除靜態(tài)表或小表(100行以內(nèi)),DML語句必須有where條件,且盡量使用索引查找 -
生產(chǎn)環(huán)境禁止使用 hint,如 sql_no_cache,force index,ignore key,strAIght join等。 要相信MySQL優(yōu)化器。hint是用來強(qiáng)制SQL按照某個(gè)執(zhí)行計(jì)劃來執(zhí)行,但隨著數(shù)據(jù)量變化我們無法保證自己當(dāng)初的預(yù)判是正確的。 -
where條件里,等號(hào)左右字段類型必須一致,否則會(huì)造成隱式的類型轉(zhuǎn)化,可能導(dǎo)致無法使用索引 -
生產(chǎn)數(shù)據(jù)庫中強(qiáng)烈不推薦在大表執(zhí)行全表掃描,查詢數(shù)據(jù)量不要超過表行數(shù)的25%,否則可能導(dǎo)致無法使用索引 -
where子句中禁止只使用全模糊的LIKE條件進(jìn)行查找,如like ‘%abc%’,必須有其他等值或范圍查詢條件,否則可能導(dǎo)致無法使用索引 -
索引列不要使用函數(shù)或表達(dá)式,如 where length(name)=10
或where user_id+2=1002
,否則可能導(dǎo)致無法使用索引 -
減少使用or語句 or有可能被 mysq l優(yōu)化為支持索引,但也要損耗 mysql 的 cpu 性能??蓪r語句優(yōu)化為union,然后在各個(gè)where條件上建立索引。如 where a=1 or b=2
優(yōu)化為where a=1… union …where b=2, key(a),key(b)
某些場(chǎng)景下,也可優(yōu)化為in
-
分頁查詢,當(dāng)limit起點(diǎn)較高時(shí),可先用過濾條件進(jìn)行過濾。如 select a,b,c from t1 limit 10000,20
; 優(yōu)化為select a,b,c from t1 where id>10000 limit 20
; -
同表的字段增刪、索引增刪等,合并成一條DDL語句執(zhí)行,提高執(zhí)行效率,減少與數(shù)據(jù)庫的交互。 -
replace into
和insert on duplicate key update
在并發(fā)環(huán)境下執(zhí)行都可能產(chǎn)生死鎖(后者在5.6版本可能不報(bào)錯(cuò),但數(shù)據(jù)有可能產(chǎn)生問題),需要catch異常,做事務(wù)回滾,具體的鎖沖突可以關(guān)注next key lock
和insert intention lock
-
TRUNCATE TABLE 比 DELETE 速度快,且使用的系統(tǒng)和事務(wù)日志資源少,但 TRUNCATE 無事務(wù)且不觸發(fā) trigger ,有可能造成事故,故不建議在開發(fā)代碼中使用此語句。說明: TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同。
三、建表語句
環(huán)境說明;
-
MySQL 8.0.32 - 可使用 Docker 安裝,腳本放到本案例倉庫了。 -
Sequel Ace
# ************************************************************
# Sequel Ace SQL dump
# 版本號(hào): 20050
#
# https://sequel-ace.com/
# https://Github.com/Sequel-Ace/Sequel-Ace
#
# 主機(jī): localhost (MySQL 8.0.32)
# 數(shù)據(jù)庫: road_map
# 生成時(shí)間: 2023-08-12 07:19:03 +0000
# ************************************************************
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
SET NAMES utf8mb4;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE='NO_AUTO_VALUE_ON_ZERO', SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
# 轉(zhuǎn)儲(chǔ)表 user_order
# ------------------------------------------------------------
DROP TABLE IF EXISTS `user_order`;
CREATE TABLE `user_order` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID;【必須保留自增ID,不要將一些有隨機(jī)特性的字段值設(shè)計(jì)為主鍵,例如order_id,會(huì)導(dǎo)致innodb內(nèi)部page分裂和大量隨機(jī)I/O,性能下降】int 大約21億左右,超過會(huì)報(bào)錯(cuò)。bigint 大約9千億左右。',
`user_name` varchar(64) NOT NULL COMMENT '用戶姓名;',
`user_id` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用戶編號(hào);',
`user_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用戶電話;使用varchar(20)存儲(chǔ)手機(jī)號(hào),不要使用整型。手機(jī)號(hào)不會(huì)做數(shù)學(xué)計(jì)算、涉及到區(qū)號(hào)或者國家代號(hào),可能出現(xiàn)+-()、支持模糊查詢,例如:like“135%”',
`sku` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品編號(hào)',
`sku_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名稱',
`order_id` varchar(64) NOT NULL COMMENT '訂單ID',
`quantity` int NOT NULL DEFAULT '1' COMMENT '商品數(shù)量;整形定義中不顯示規(guī)定顯示長度,比如使用 INT,而不使用 INT(4)',
`unit_price` decimal(10,2) NOT NULL COMMENT '商品價(jià)格;小數(shù)類型為 decimal,禁止使用 float、double',
`discount_amount` decimal(10,2) NOT NULL COMMENT '折扣金額;',
`tax` decimal(4,2) NOT NULL COMMENT '費(fèi)率金額;',
`total_amount` decimal(10,2) NOT NULL COMMENT '支付金額;(商品的總金額 - 折扣) * (1 - 費(fèi)率)',
`order_date` datetime NOT NULL COMMENT '訂單日期;timestamp的時(shí)間范圍在1970-01-01 00:00:01到2038-01-01 00:00:00之間',
`order_status` tinyint(1) NOT NULL COMMENT '訂單狀態(tài);0 創(chuàng)建、1完成、2掉單、3關(guān)單 【不要使用 enum 要使用 tinyint 替代。0-80 范圍,都可以使用 tinyint】',
`is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '邏輯刪單;0未刪除,1已刪除 【表達(dá)是否概念的字段必須使用is_】',
`uuid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '唯一索引;分布式下全局唯一,用于binlog 同步 ES 方便使用',
`ipv4` int unsigned NOT NULL DEFAULT '2130706433' COMMENT '設(shè)備地址;存儲(chǔ)IPV4地址,通過MySQL 函數(shù)轉(zhuǎn)換,inet_ntoa、inet_aton 示例;SELECT INET_ATON(‘209.207.224.40′); 3520061480 SELECT INET_NTOA(3520061480); 209.207.224.40所有字段定義為NOT NULL,并設(shè)置默認(rèn)值,因?yàn)閚ull值的字段會(huì)導(dǎo)致每一行都占用額外存儲(chǔ)空間\n數(shù)據(jù)遷移容易出錯(cuò),在聚合函數(shù)計(jì)算結(jié)果偏差(如count結(jié)果不準(zhǔn))并且null的列使索引/索引統(tǒng)計(jì)/值比較都更加復(fù)雜,MySQL內(nèi)部需要進(jìn)行特殊處理,表中有較多空字段的時(shí)候,數(shù)據(jù)庫性能下降嚴(yán)重。開發(fā)中null只能采用is null或is not null檢索,而不能采用=、in、<、<>、!=、not in這些操作符號(hào)。如:where name!=’abc’,如果存在name為null值的記錄,查詢結(jié)果就不會(huì)包含name為null值的記錄',
`ipv6` varbinary(16) NOT NULL COMMENT '設(shè)備地址;存儲(chǔ)IPV6地址,VARBINARY(16) 插入:INET6_ATON(''2001:0db8:85a3:0000:0000:8a2e:0370:7334'') 查詢:SELECT INET6_NTOA(ip_address) ',
`ext_data` json NOT NULL COMMENT '擴(kuò)展數(shù)據(jù);記錄下單時(shí)用戶的設(shè)備環(huán)境等信息(核心業(yè)務(wù)字段,要單獨(dú)拆表)。【select user_name, ext_data, ext_data->>''$.device'', ext_data->>''$.device.machine'' from `user_order`;】',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
PRIMARY KEY (`id`),
UNIQUE KEY `uq_orderid` (`order_id`),
UNIQUE KEY `uq_uuid` (`uuid`),
KEY `idx_order_date` (`order_date`),
KEY `idx_sku_unit_price_total_amount` (`sku`,`unit_price`,`total_amount`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
LOCK TABLES `user_order` WRITE;
/*!40000 ALTER TABLE `user_order` DISABLE KEYS */;
INSERT INTO `user_order` (`id`, `user_name`, `user_id`, `user_mobile`, `sku`, `sku_name`, `order_id`, `quantity`, `unit_price`, `discount_amount`, `tax`, `total_amount`, `order_date`, `order_status`, `is_delete`, `uuid`, `ipv4`, `ipv6`, `ext_data`, `update_time`, `create_time`)
VALUES
(1,'小傅哥','U001','13512345678','SKU001','Mac Pro M2 貼膜','ORD001',2,10.99,2.00,0.50,19.48,'2023-08-12 10:00:00',0,0,'uuid001',2130706433,X'20010DB885A3000000008A2E03707334','{"device": {"machine": "iphone 14 Pro", "location": "shanghai"}}','2023-08-12 10:00:00','2023-08-12 10:00:00'),
(2,'福祿娃','U002','13698765432','SKU002','IPad mini4 外套','ORD002',1,25.99,0.00,1.50,24.49,'2023-08-12 11:30:00',1,0,'uuid002',2130706433,X'20010DB885A3000000008A2E03707334','{"device": {"machine": "PC windows", "location": "BeiJing"}}','2023-08-12 11:30:00','2023-08-12 11:30:00'),
(3,'拎瓢沖','U003','13755555555','SKU003','數(shù)據(jù)線','ORD003',3,9.99,1.50,0.00,26.97,'2023-08-12 13:45:00',0,0,'uuid003',2130706433,X'20010DB885A3000000008A2E03707334','{"device": {"machine": "PC Windows", "location": "BeiJing"}}','2023-08-12 13:45:00','2023-08-12 13:45:00'),
(4,'熏5null','U004','13812345678','SKU004','U盤','ORD004',1,15.99,0.00,0.75,15.24,'2023-08-12 14:20:00',1,0,'uuid004',2130706433,X'20010DB885A3000000008A2E03707334','{"device": {"machine": "PC Windows", "location": "BeiJing"}}','2023-08-12 14:20:00','2023-08-12 14:20:00'),
(5,'溫柔一刀','U005','13999999999','SKU005','坐墊','ORD005',2,12.50,1.25,0.25,23.75,'2023-08-12 15:55:00',0,0,'uuid005',2130706433,X'20010DB885A3000000008A2E03707334','{"device": {"machine": "PC Windows", "location": "BeiJing"}}','2023-08-12 15:55:00','2023-08-12 15:55:00');
/*!40000 ALTER TABLE `user_order` ENABLE KEYS */;
UNLOCK TABLES;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
三、語句操作
1. 插入操作
INSERT INTO `user_order` (`id`, `user_name`, `user_id`, `user_mobile`, `sku`, `sku_name`, `order_id`, `quantity`, `unit_price`, `discount_amount`, `tax`, `total_amount`, `order_date`, `order_status`, `is_delete`, `uuid`, `ipv4`, `ipv6`, `ext_data`, `update_time`, `create_time`)
VALUES
(9,'小傅哥','U001','13512345678','SKU001','Mac Pro M2 貼膜','ORD0101',2,10.99,2.00,0.50,19.48,'2023-08-12 10:00:00',0,0,'uuid010',INET_ATON('127.0.0.1'),INET6_ATON('2001:0db8:85a3:0000:0000:8a2e:0370:7334'),'{"device": {"machine": "IPhone 14 Pro", "location": "shanghai"}}','2023-08-12 10:00:00','2023-08-12 10:00:00');
-
其實(shí)列了這個(gè) SQL 主要讓大家注意到 IPV4、IPV6 的存儲(chǔ)需要用到轉(zhuǎn)換函數(shù)。也就是 MySQL 自己提供的 INET_ATON
、INET6_ATON
轉(zhuǎn)換和對(duì)應(yīng)的INET_NTON
、INET6_NTON
解析。 -
此外你還可以單獨(dú)測(cè)試這個(gè)函數(shù); select INET6_NTOA(INET6_ATON('2001:0db8:85a3:0000:0000:8a2e:0370:7334'))
2. 查詢操作
2.1 IP 查詢
select user_name, sku, INET_NTOA(ipv4), INET6_NTOA(ipv6) from `user_order`;
小傅哥 SKU001 127.0.0.1 2001:db8:85a3::8a2e:370:7334
福祿娃 SKU002 127.0.0.1 2001:db8:85a3::8a2e:370:7334
拎瓢沖 SKU003 127.0.0.1 2001:db8:85a3::8a2e:370:7334
熏5null SKU004 127.0.0.1 2001:db8:85a3::8a2e:370:7334
溫柔一刀 SKU005 127.0.0.1 2001:db8:85a3::8a2e:370:7334
2.2 JSON 查詢
select user_name, ext_data, ext_data->>'$.device', ext_data->>'$.device.machine' from `user_order`;
小傅哥 {"device": {"machine": "IPhone 14 Pro", "location": "shanghai"}} {"machine": "IPhone 14 Pro", "location": "shanghai"} IPhone 14 Pro
福祿娃 {"device": {"machine": "PC Windows", "location": "BeiJing"}} {"machine": "PC Windows", "location": "BeiJing"} PC Windows
拎瓢沖 {"device": {"machine": "PC Windows", "location": "BeiJing"}} {"machine": "PC Windows", "location": "BeiJing"} PC Windows
熏5null {"device": {"machine": "PC Windows", "location": "BeiJing"}} {"machine": "PC Windows", "location": "BeiJing"} PC Windows
溫柔一刀 {"device": {"machine": "PC Windows", "location": "BeiJing"}} {"machine": "PC Windows", "location": "BeiJing"} PC Windows
-
MySQL 8.0 提供了 JSON 這樣的專屬存放方式,你可以通過 JSON 字段的內(nèi)容來讀取對(duì)應(yīng)的信息。
2.3 索引使用
# 使用 order_id 唯一索引
EXPLAIN select user_name, sku, INET_NTOA(ipv4), INET6_NTOA(ipv6) from `user_order` where order_id = 'ORD002';
# 使用組合索引
EXPLAIN select sku,total_amount,order_date from `user_order` where total_amount > 10 and order_date between '2023-08-09 00:00:00' and '2023-08-09 23:59:59';
2.4 數(shù)量統(tǒng)計(jì)
select count(*) from `user_order`
-
不要使用 count(列名) 或 count(常量) 來替代 count(*)
,count(*)
是 SQL 92 定義的標(biāo)準(zhǔn)統(tǒng)計(jì)行數(shù)的語法,跟數(shù)據(jù)庫無關(guān),跟 NULL 和非 NULL 無關(guān)。
2.5 for update
START TRANSACTION;
SELECT user_name, sku, total_amount, order_date, order_status FROM `user_order` WHERE order_id = 'ORD002' FOR UPDATE;
-- 在這里執(zhí)行其他操作,其他會(huì)話無法修改 order_id 為 ORD002 的訂單信息
COMMIT;
2.6 行級(jí)鎖
UPDATE `user_order` SET order_status = 0 WHERE order_id = 'ORD002' AND order_status = 3 FOR UPDATE;
-
order_id 是唯一索引,如果沒有索引,將會(huì)執(zhí)行全表掃描。在這種情況下,MySQL會(huì)對(duì)整個(gè)user_order 表進(jìn)行鎖定,而不僅僅是符合條件的行。 -
即使你沒有顯式地添加 FOR UPDATE
語句,更新語句仍會(huì)鎖定符合條件的行。這是因?yàn)镸ySQL 默認(rèn)會(huì)使用行級(jí)鎖來保證并發(fā)事務(wù)的一致性。
2.7 表鎖
-
ALTER TABLE語句:當(dāng)執(zhí)行ALTER TABLE語句修改表結(jié)構(gòu)時(shí),MySQL會(huì)自動(dòng)獲取一個(gè)排它鎖(X鎖),這會(huì)阻塞其他會(huì)話對(duì)該表的讀寫操作,直到ALTER TABLE操作完成。
-
LOCK TABLES語句:當(dāng)使用LOCK TABLES語句手動(dòng)鎖定表時(shí),會(huì)對(duì)被鎖定的表使用表級(jí)別的鎖,阻塞其他會(huì)話對(duì)該表的讀寫操作。
-
TRUNCATE TABLE語句:TRUNCATE TABLE語句會(huì)獲取一個(gè)排它鎖(X鎖),阻塞其他會(huì)話對(duì)該表的讀寫操作,直到TRUNCATE TABLE操作完成。
四、其他配置
1. 監(jiān)控活動(dòng)和性能:
在MySQL中,你可以使用以下命令來監(jiān)控MySQL服務(wù)器的活動(dòng)和性能:
-
SHOW PROCESSLIST;:該命令用于顯示當(dāng)前正在運(yùn)行的所有MySQL連接和查詢。它將顯示每個(gè)連接的ID、用戶、主機(jī)、數(shù)據(jù)庫、執(zhí)行時(shí)間和當(dāng)前執(zhí)行的查詢。 -
SHOW STATUS;:該命令用于顯示MySQL服務(wù)器的各種狀態(tài)信息,例如連接數(shù)、線程狀態(tài)、查詢緩存命中率等。 -
SHOW ENGINE INNODB STATUS;:該命令用于顯示InnoDB存儲(chǔ)引擎的詳細(xì)狀態(tài)信息,包括死鎖信息、事務(wù)信息和緩沖池狀態(tài)等。 -
EXPLAIN:在查詢語句前加上EXPLAIN關(guān)鍵字,可以獲取查詢執(zhí)行計(jì)劃的詳細(xì)信息。這將顯示查詢的表訪問順序、使用的索引和可能的性能問題。 -
mysqladmin extended-status:該命令用于顯示MySQL服務(wù)器的擴(kuò)展?fàn)顟B(tài)信息,包括各種計(jì)數(shù)器和性能指標(biāo)。
2. 連接數(shù)查詢和配置
查看MySQL服務(wù)器的可用連接數(shù)和設(shè)置連接數(shù),可以使用以下方法:
-
查看當(dāng)前可用連接數(shù): -
使用命令行客戶端登錄到MySQL服務(wù)器。 -
執(zhí)行以下SQL查詢語句: SHOW VARIABLES LIKE 'max_connections';
-
這將顯示MySQL服務(wù)器當(dāng)前配置的最大連接數(shù)。
-
-
設(shè)置連接數(shù): -
編輯MySQL服務(wù)器的配置文件(通常是 my.cnf
或my.ini
)。 -
找到 [mysqld]
部分。 -
添加或修改以下行: max_connections = <desired_value>
-
將 <desired_value>
替換為你希望設(shè)置的連接數(shù)。 -
保存并關(guān)閉配置文件。 -
重啟MySQL服務(wù)器,以使更改生效。
-
設(shè)置連接數(shù)需要權(quán)衡服務(wù)器的可用資源和性能。如果設(shè)置的連接數(shù)過高,可能會(huì)導(dǎo)致服務(wù)器負(fù)載過重,影響性能。建議根據(jù)服務(wù)器的硬件規(guī)格和預(yù)期的負(fù)載量來調(diào)整連接數(shù)。另外,某些MySQL版本或發(fā)行版可能對(duì)最大連接數(shù)有特定的限制,請(qǐng)確保你的設(shè)置在允許范圍內(nèi)。
注意:1核1G可配置300個(gè)連接、2核4G可配置1000個(gè)連接、4核16G可配置4000個(gè)連接、8核32G可配置8000個(gè)連接。