CHAR(6) 存郵編優於 CHAR(255),MEDIUMINT 優於 BIGINT。NOT NULL:避免 NULL 比較開銷,索引統計更準確。ENUM('male','female') 內部存數值,比較/排序極快。
-- 子查詢(MySQL 4.1+ 支持)
DELETE FROM customerinfo WHERE CustomerID NOT IN (SELECT CustomerID FROM salesinfo);
-- LEFT JOIN 等價,性能更優(尤其 salesinfo.CustomerID 有索引)
SELECT * FROM customerinfo
LEFT JOIN salesinfo ON customerinfo.CustomerID = salesinfo.CustomerID
WHERE salesinfo.CustomerID IS NULL;
原理:JOIN 避免內存臨時表創建,直接利用索引關聯。
SELECT Name, Phone FROM client
UNION
SELECT Name, BirthDate FROM author
UNION
SELECT Name, Supplier FROM product;
SELECT 列數、類型須一致。
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(CustomerID)) 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 級聯刪除關聯記錄。JOIN、WHERE、ORDER BY 涉及的列。ENUM、性別、省份),反而拖慢寫入。FULLTEXT 僅限 MyISAM,大數據量先裸載再建索引更快。| 失效寫法 | 優化寫法 | 原因 |
|---|---|---|
WHERE YEAR(OrderDate) < 2001 | WHERE OrderDate < '2001-01-01' | 函數導致索引失效 |
WHERE Amount/7 < 24 | WHERE Amount < 24*7 | 運算導致索引失效 |
WHERE name LIKE 'MySQL%' | WHERE name >= 'MySQL' AND name < 'MySQM' | 前綴 LIKE 可用範圍查詢替代 |
| 隱式類型轉換 | 顯式 CAST/參數化 | 轉換導致索引失效 |