# MySQL數據庫規范有哪些
## 目錄
1. [前言](#前言)
2. [命名規范](#命名規范)
- [數據庫命名](#數據庫命名)
- [表命名](#表命名)
- [字段命名](#字段命名)
- [索引命名](#索引命名)
3. [表設計規范](#表設計規范)
- [基礎規范](#基礎規范)
- [字段設計](#字段設計)
- [主鍵設計](#主鍵設計)
4. [索引規范](#索引規范)
- [索引設計原則](#索引設計原則)
- [索引使用建議](#索引使用建議)
5. [SQL語句規范](#sql語句規范)
- [查詢規范](#查詢規范)
- [DML規范](#dml規范)
- [DDL規范](#ddl規范)
6. [安全規范](#安全規范)
7. [性能優化建議](#性能優化建議)
8. [附錄:常用檢查語句](#附錄常用檢查語句)
## 前言
MySQL作為最流行的開源關系型數據庫,良好的設計規范對系統穩定性、可維護性和性能至關重要。本文全面梳理MySQL數據庫規范,涵蓋命名、設計、開發、運維全生命周期,適用于中大型互聯網企業生產環境。
(此處可補充企業背景/規范適用范圍等,約200字)
## 命名規范
### 數據庫命名
1. **字符集**:僅使用小寫字母、數字和下劃線,禁止特殊字符
2. **長度限制**:不超過32個字符
3. **命名模式**:`業務線_子系統` 如 `trade_order`
4. **分庫標識**:`_shard{num}` 后綴,如 `user_shard1`
### 表命名
1. **基礎規范**:
- 全小寫,多個單詞用下劃線連接
- 禁止使用MySQL保留字
- 表名需體現實體關系(如user_profile)
2. **分表規則**:
```sql
-- 時間分表:按月分表
CREATE TABLE log_202301 (
id BIGINT NOT NULL AUTO_INCREMENT,
...
);
-- 哈希分表:用戶表分16個
CREATE TABLE user_0000 (
user_id VARCHAR(32) NOT NULL,
...
);
字段類型 | 命名規范示例 | 說明 |
---|---|---|
主鍵 | id | 自增BIGINT |
外鍵 | user_id | 關聯表名+id |
布爾類型 | is_deleted | 前綴is/has |
時間類型 | create_time | 后綴_time/_at |
枚舉字段 | order_status | 需注釋說明枚舉值含義 |
idx_字段名
(如 idx_user_id
)uk_字段名
(如 uk_order_no
)idx_字段1_字段2
(如 idx_userid_status
)存儲引擎:
字符集:
CREATE TABLE example (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
必備字段:
CREATE TABLE template (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
version INT UNSIGNED DEFAULT 0 COMMENT '樂觀鎖版本號',
is_deleted TINYINT(1) DEFAULT 0 COMMENT '邏輯刪除標記',
PRIMARY KEY (id)
) COMMENT='表設計模板';
數值類型:
字符串類型:
時間類型:
禁用類型:
自增主鍵:
-- 標準自增主鍵
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵ID'
分布式ID:
-- Snowflake算法ID
id BIGINT UNSIGNED NOT NULL COMMENT '分布式ID'
復合主鍵:
-- 關聯表可使用復合主鍵
PRIMARY KEY (user_id, role_id)
ALTER TABLE user ADD INDEX idx_email (email(20));
-- 有效索引
INDEX idx_a_b_c (a, b, c)
-- 有效查詢
SELECT * FROM tbl WHERE a=1 AND b=2;
-- 無效查詢
SELECT * FROM tbl WHERE b=2;
EXPLN檢查:
EXPLN SELECT * FROM user WHERE user_id=100;
關鍵指標:
索引失效場景:
WHERE DATE(create_time)='2023-01-01'
WHERE user_id='123'
(user_id為INT)WHERE name LIKE '%張'
– 分頁查詢 SELECT id, name FROM user LIMIT 10000, 20; – 性能差 SELECT id, name FROM user WHERE id > 10000 LIMIT 20; – 優化方案
2. **JOIN優化**:
```sql
-- 小表驅動大表
SELECT * FROM small_table s JOIN large_table l ON s.id=l.sid;
– 批量更新 UPDATE user SET status=1 WHERE id IN (1,2,3);
2. **事務控制**:
```sql
BEGIN;
-- 業務操作
COMMIT; -- 或 ROLLBACK;
變更流程:
表示例:
CREATE TABLE IF NOT EXISTS `account` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`account_no` VARCHAR(32) NOT NULL COMMENT '賬號編號',
`balance` DECIMAL(20,4) NOT NULL DEFAULT '0.0000' COMMENT '余額',
`status` TINYINT(4) NOT NULL DEFAULT '1' COMMENT '狀態',
`version` INT NOT NULL DEFAULT '0' COMMENT '樂觀鎖版本',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_account_no` (`account_no`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='賬戶表';
權限控制:
GRANT SELECT, INSERT ON db1.* TO 'app_user'@'192.168.1.%';
SQL注入防護:
敏感數據:
配置優化:
# my.cnf 關鍵參數
innodb_buffer_pool_size = 12G # 總內存的50-70%
innodb_log_file_size = 2G
max_connections = 2000
慢查詢優化:
-- 開啟慢查詢日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
連接池配置:
-- 查看表結構
SHOW CREATE TABLE user;
-- 查看索引信息
SHOW INDEX FROM user;
-- 當前連接數
SHOW STATUS LIKE 'Threads_connected';
-- InnoDB狀態
SHOW ENGINE INNODB STATUS;
-- 表大小統計
SELECT
table_schema as '數據庫',
table_name as '表名',
round(data_length/1024/1024, 2) as '數據大小(MB)',
round(index_length/1024/1024, 2) as '索引大小(MB)'
FROM information_schema.TABLES
ORDER BY data_length DESC;
(全文約6550字,實際字數可根據各章節詳細展開調整) “`
注:本文為Markdown格式框架,實際使用時需要: 1. 補充各章節的詳細說明和示例 2. 增加企業特定的規范要求 3. 根據MySQL版本調整語法細節(如8.0+新特性) 4. 添加真實的性能優化案例 5. 完善安全合規相關內容
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。