CHAR(6) 而非 VARCHAR(255))。MEDIUMINT 而非 BIGINT。NOT NULL 就不用 NULL(避免額外比較)。ENUM,內部當數值處理,速度快於字串。子查詢需建立臨時表,JOIN 直接關聯,尤其被驅動表有索引時效能差距巨大。
-- 子查詢
SELECT * FROM customerinfo WHERE CustomerID NOT IN (SELECT CustomerID FROM salesinfo);
-- JOIN 寫法(更快)
SELECT * FROM customerinfo
LEFT JOIN salesinfo ON customerinfo.CustomerID = salesinfo.CustomerID
WHERE salesinfo.CustomerID IS NULL;
SELECT Name, Phone FROM client
UNION
SELECT Name, BirthDate FROM author
UNION
SELECT Name, Supplier FROM product;
會話結束自動清理,保證整潔高效。
BEGIN;
INSERT INTO salesinfo SET CustomerID=14;
UPDATE inventory SET Quantity=11 WHERE item='book';
COMMIT;
失敗時 ROLLBACK 回滾。同時利用行鎖隔離併發操作。
LOCK TABLE inventory WRITE;
SELECT Quantity FROM inventory WHERE Item='book';
-- 計算後
UPDATE inventory SET Quantity=11 WHERE Item='book';
UNLOCK TABLES;
適合「讀-算-寫」短流程,避免事務長時間持鎖影響併發。
CREATE TABLE customerinfo (CustomerID INT NOT NULL PRIMARY KEY) ENGINE=INNODB;
CREATE TABLE salesinfo (
SalesID INT NOT NULL, CustomerID INT NOT NULL,
PRIMARY KEY(CustomerID, SalesID),
FOREIGN KEY (CustomerID) REFERENCES customerinfo(CustomerID) ON DELETE CASCADE
) ENGINE=INNODB;
ON DELETE CASCADE 級聯刪除。必須用 InnoDB。
JOIN、WHERE、ORDER BY 欄位上。FULLTEXT)僅支援 MyISAM,大量載入先建表後建索引更快。INT vs BIGINT 會失效索引)。WHERE YEAR(dt) < 2001 → WHERE dt < '2001-01-01'。Amount/7 < 24 → Amount < 24*7。LIKE 'prefix%' 可用範圍查詢替代:name >= 'MySQL' AND name < 'MySQM'。