goods_orderCREATE TABLE `goods_order` (
`order_id` INT UNSIGNED NOT NULL COMMENT '訂單號',
`goods_id` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '商品款號',
`order_type` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '訂單類型',
`order_status` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '訂單狀態',
`color_id` SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '顏色ID',
`size_id` SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '尺寸ID',
`goods_number` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '數量',
`depot_id` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '倉庫ID',
`packet_id` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '儲位碼',
`gmt_create` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '創建時間',
`gmt_modify` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新時間',
PRIMARY KEY (`order_id`, `goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
PRIMARY KEY (order_id, goods_id) 而非反序,因為:
order_id 區分度極高(近似唯一),篩選率接近 1。order_id 為單獨查詢條件,符合最左前綴原則。| 編號 | SQL 類型 | WHERE / ORDER BY 條件 | 頻率/優先級 |
|---|---|---|---|
| 1,2,3 | 前台讀/寫 | order_id / order_id + gmt_modify | 高 / 寫優先 |
| 4,5 | 後台定時任務 | depot_id / depot_id + packet_id + gmt_modify | 中 / 讀最新 50 條 |
| 6,7 | 後台查詢 | goods_id + order_status + order_type (+ gmt_modify) | 高 |
| 8 | 數倉導出 | gmt_modify | 低(每天一次) |
-- 主鍵已存在 PRIMARY KEY (order_id, goods_id)
-- 覆蓋 goods_id 相關高頻查詢,注意字段順序:
ALTER TABLE goods_order
ADD INDEX idx_goodsID_orderType_orderStatus_gmtmodify (goods_id, order_type, order_status, gmt_modify);
-- 覆蓋倉庫/儲位查詢,犧牲單一 depot_id 查詢性能,減少一個索引維護開銷:
ALTER TABLE goods_order
ADD INDEX idx_depotID_packetID_gmtmodify (depot_id, packet_id, gmt_modify);