我的桌子是這樣的:
CREATE TABLE `payments` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`deleted` tinyint(2) NOT NULL,
`actionType` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`payDate` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`isCoupayOrder` tinyint(2) NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `index`(`payDate`, `actionType`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6543773 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
當我執行這個查詢命令時,
explain select * from payments where actionType in ('APPROVED','CANCEL') and deleted <> 1 and isCoupayOrder = 0 and (payDate between '2020-05-01' and '2020-11-01') order by id asc limit 20;
結果是這樣的:
id 1
select_type SIMPLE
table payments
type index
possible_keys index
key PRIMARY
key_len 8
extra Using where
我不明白為什么鍵是主鍵,意味著掃描整個表?它甚至沒有列在可能的密鑰中。
uj5u.com熱心網友回復:
優化器選擇不index為 where 查詢使用索引。這可能是由于優化器認為在您選擇所有列 ( select *) 時執行表掃描會更快,其中一些列在索引中找不到。
在進行表掃描時,它可以使用 PRIMARY 索引來滿足ORDER BY-clause。因此使用它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/349043.html
標籤:mysql
上一篇:使用LOCALINFILE匯入資料時的MySQL日期問題
下一篇:如何選擇所有日期排除今天前30天
