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

MySQL 開發必知的 8 條實用 SQL 技巧:從批量插入到日期運算

     編輯:MySQL 資料庫相關知識

技巧 1:跨表批量插入 (單條 SQL、原子性)


INSERT INTO target_table (col1, col2)
SELECT col1, col2 FROM source_table WHERE status = 'active';

避免應用層循環插入的網絡往返與事務開銷。

技巧 2:多行 VALUES 批量插入 (減少解析開銷)


INSERT INTO logs (level, message) VALUES
('INFO', 'Service started'),
('WARN', 'Queue length > 100'),
('ERROR', 'Connection timeout');

單次提交,解析器僅優化一次,批量導入場景效能提升 10x+。

技巧 3:獲取當前連線最後自增 ID (連線隔離、線程安全)


SELECT LAST_INSERT_ID();

無論並發多少插入,每個連線只見自己的 ID,無需鎖表。

技巧 4:COALESCE 返回第一個非 NULL 值 (兼容 SQL Server ISNULL)


SELECT COALESCE(nickname, real_name, 'Guest') AS display_name FROM users;
-- 等價 SQL Server: ISNULL(nickname, ISNULL(real_name, 'Guest'))

標準 SQL,跨庫遷移無痛。

技巧 5:REPAIR TABLE 修復損壞的 MyISAM 表


REPAIR TABLE corrupted_table;
-- 或帶參數
REPAIR TABLE corrupted_table USE_FRM;  -- 僅用 .frm 重建索引

適用於斷電、磁碟壞塊導致的 MyISAM 索引損壞。InnoDB 有自動崩潰恢復,無需手動。

技巧 6:FROM_UNIXTIME 處理毫秒級時間戳 (注意截取)


-- 秒級
SELECT FROM_UNIXTIME(1700000000);  -- 2023-11-14 21:33:20

-- 毫秒級 (13 位) 需除以 1000
SELECT FROM_UNIXTIME(1700000000123 / 1000);
-- 或保留毫秒
SELECT FROM_UNIXTIME(1700000000123 / 1000, '%Y-%m-%d %H:%i:%s.%f');

直接傳 13 位數字會溢出導致錯誤日期,務必先除 1000。

技巧 7:DATE_ADD / ADDDATE 日期運算 (標準化寫法)


-- 當前時間減 7 天
SELECT DATE_SUB(NOW(), INTERVAL 7 DAY);
SELECT ADDDATE(NOW(), INTERVAL -7 DAY);

-- 字段比較
SELECT * FROM orders WHERE created_at > DATE_SUB(NOW(), INTERVAL 30 DAY);

MySQL 推薦 INTERVAL 語法,可讀性強、跨版本穩定。

技巧 8:子查詢條件下推 (避免全表掃描)


-- 低效:外層 WHERE 無法下推
SELECT * FROM t1 WHERE id IN (SELECT id FROM t2 WHERE status=1);

-- 高效:JOIN + 派生表 (MySQL 5.6+ 優化器自動轉換)
SELECT t1.* FROM t1 JOIN (SELECT id FROM t2 WHERE status=1) t2 USING (id);

-- 或 EXIST (半連接優化)
SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.id = t1.id AND t2.status=1);

關鍵原則:**子查詢內部必須帶 WHERE 過濾**,否則產生巨大派生表拖垮性能。

總結

這 8 條技巧覆蓋 **寫入優化、ID 獲取、空值處理、修復、時間轉換、日期運算、子查詢優化** 七大高頻場景。熟練內化為肌肉記憶,日常開發即能寫出高效、可移植、抗併發的 SQL。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved