首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 從入門到存儲過程全棧速查手冊:DDL/DML、索引、優化、函數、權限、備份

     編輯:MySQL 資料庫相關知識

連線與基礎

# 登入
mysql -h localhost -u root -p
# 修改密碼
mysqladmin -u root -p'old' password 'new'
# 退出
QUIT;  -- 或 EXIT; \q

DDL:庫表結構

SHOW DATABASES;
CREATE DATABASE `demo` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE demo;
SHOW TABLES;

CREATE TABLE users (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  email VARCHAR(100) NOT NULL UNIQUE,
  name VARCHAR(50) NOT NULL,
  status TINYINT DEFAULT 1,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

DESCRIBE users;
SHOW CREATE TABLE users\G

ALTER TABLE users ADD COLUMN phone VARCHAR(20);
ALTER TABLE users MODIFY COLUMN name VARCHAR(100);
ALTER TABLE users DROP COLUMN phone;
ALTER TABLE users ADD INDEX idx_status (status);
ALTER TABLE users DROP INDEX idx_status;

DML:增刪改查

INSERT INTO users (email, name) VALUES ('a@b.com', 'Alice');
INSERT INTO users (email, name) VALUES ('c@d.com', 'Bob'), ('e@f.com', 'Carol');

SELECT * FROM users;
SELECT id, name FROM users WHERE email LIKE '%@b.com' LIMIT 10;
SELECT * FROM users ORDER BY created_at DESC;

UPDATE users SET name = 'Alice Smith' WHERE id = 1;
DELETE FROM users WHERE id = 2;
TRUNCATE TABLE users;

連線查詢

-- 內連接
SELECT u.id, u.name, o.amount 
FROM users u INNER JOIN orders o ON u.id = u.id;

-- 左連接
SELECT u.id, u.name, o.amount 
FROM users u LEFT JOIN orders o ON u.id = o.user_id;

-- 右連接
SELECT u.id, u.name, o.amount 
FROM users u RIGHT JOIN orders o ON u.id = o.user_id;

索引策略

類型建立語法適用場景
主鍵PRIMARY KEY (id)唯一標識、聚簇索引
唯一UNIQUE KEY uk_email (email)業務唯一約束
普通INDEX idx_status (status)WHERE/JOIN/ORDER BY/GROUP BY
全文FULLTEXT INDEX ft_content (content)MATCH AGAINST 自然語言搜索
組合INDEX idx_status_created (status, created_at)最左前綴原則

常用函數速查

分類函數
字符串CONCAT, SUBSTRING, REPLACE, TRIM, UPPER, LOWER, LENGTH, INSTR, LOCATE, LEFT, RIGHT
數學ABS, CEIL, FLOOR, ROUND, TRUNCATE, MOD, POWER, SQRT, RAND, SIGN
日期NOW, CURDATE, CURTIME, DATE_ADD, DATE_SUB, DATEDIFF, DATE_FORMAT, STR_TO_DATE, DAY, MONTH, YEAR, HOUR, MINUTE, SECOND, DAYNAME, DAYOFWEEK, WEEK, QUARTER
流程控制IF, CASE, IFNULL, COALESCE, NULLIF
聚合COUNT, SUM, AVG, MAX, MIN, GROUP_CONCAT, STDDEV, VARIANCE
加密MD5, SHA1, SHA2, AES_ENCRYPT, AES_DECRYPT, PASSWORD

效能優化 20 條

  1. 開啟 Query Cache(5.7 已移除,改用 Redis)。
  2. EXPLAIN 分析執行計劃,關注 type、key、rows、Extra。
  3. 單行查詢 LIMIT 1。
  4. 搜索欄位建立索引(title、tags)。
  5. JOIN 條件欄位**類型、長度、校對規則完全一致**並建索引。
  6. 隨機查詢:應用層 mt_rand + LIMIT offset, 1,避免 ORDER BY RAND()。
  7. 避免 SELECT *,顯式列出欄位。
  8. 每表必有 id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY。
  9. 枚舉值固定用 ENUM(性別、狀態、部門)。
  10. IP 存 INT UNSIGNED,用 INET_ATON/INET_NTOA 或 ip2long/long2ip。
  11. 大量刪除/插入分批,usleep 間隔減輕鎖衝突。
  12. 選擇引擎:讀多寫少 MyISAM(已淘汰),事務/高併發 InnoDB。
  13. CHAR 固定長度,VARCHAR 可變長度,超長用 TEXT。
  14. 浮點 FLOAT/DOUBLE 精度丟失,金額用 DECIMAL(10,2)。
  15. 索引建在 WHERE/JOIN 欄位,高選擇性優先。
  16. 唯一業務鍵用 UNIQUE。
  17. 分區表處理億級數據。
  18. 讀寫分離 + 主從同步。
  19. 慢查詢日誌 + pt-query-digest 定期分析。
  20. 監控:SHOW GLOBAL STATUS、SHOW ENGINE INNODB STATUS。

存儲過程/函數

DELIMITER //
CREATE PROCEDURE get_version(OUT p_ver VARCHAR(20))
BEGIN SELECT VERSION() INTO p_ver; END//
DELIMITER ;
CALL get_version(@v); SELECT @v;

DELIMITER //
CREATE FUNCTION greet(p_name VARCHAR(20)) RETURNS VARCHAR(50)
BEGIN RETURN CONCAT('Hello, ', p_name); END//
DELIMITER ;
SELECT greet('World');

-- 控制流
IF condition THEN ... ELSEIF ... ELSE ... END IF;
CASE var WHEN 1 THEN ... WHEN 2 THEN ... ELSE ... END CASE;
WHILE v < 10 DO ... END WHILE;
REPEAT ... UNTIL v >= 10 END REPEAT;
LOOP ... LEAVE label; ITERATE label; ... END LOOP;

權限管理

GRANT SELECT, INSERT, UPDATE, DELETE ON demo.* TO 'app'@'%' IDENTIFIED BY 'Pass#2024';
SHOW GRANTS FOR 'app'@'%';
REVOKE UPDATE ON demo.* FROM 'app'@'%';
DROP USER 'app'@'%';

備份還原

# 邏輯備份(單事務一致性)
mysqldump -u root -p --single-transaction --master-data=2 demo > demo.sql

# 還原
mysql -u root -p demo < demo.sql

MySQL 幫助系統

HELP CONTENTS;
HELP 'CREATE TABLE';
HELP 'DATA TYPES';
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved