1. 程式人生 > 資料庫 >MySQL查詢條件中in會用到索引嗎

MySQL查詢條件中in會用到索引嗎

當用人問你MySQL 查詢條件中 in 會不會用到索引,你該怎麼回答?

答案:可能會用到索引

動手來測試下

1.建立一張表,給欄位port建立索引

CREATE TABLE `pre_request_logs_20180524` (
 `id` int(11) NOT NULL AUTO_INCREMENT,`ip` char(16) NOT NULL COMMENT '代理IP',`port` int(8) NOT NULL COMMENT '埠號',`status` enum('成功','失敗') NOT NULL COMMENT '狀態',`create_time` datetime NOT NULL COMMENT '建立時間',`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`),KEY `idx_port` (`port`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COMMENT='代理IP請求日誌';

插入測試資料

INSERT INTO ``(`id`,`ip`,`port`,`status`,`create_time`,`update_time`) VALUES (1,'192.168.1.199',53149,'失敗','2018-05-24 14:55:34','2018-11-16 10:58:13');
INSERT INTO ``(`id`,`update_time`) VALUES (2,'192.168.1.100',10653,'成功','2018-05-24 14:55:54',`update_time`) VALUES (3,'192.168.1.112',50359,'2018-05-24 14:56:00',`update_time`) VALUES (4,'192.168.1.67',30426,'2018-05-24 14:56:09',`update_time`) VALUES (5,'192.168.1.209',49323,'2018-05-24 14:56:12',`update_time`) VALUES (6,51161,'2018-05-24 14:56:13',`update_time`) VALUES (7,'192.168.1.12',54167,'2018-05-24 14:56:16',`update_time`) VALUES (8,'192.168.1.64',20462,'2018-05-24 14:56:19',`update_time`) VALUES (9,'192.168.1.53',22823,'2018-05-24 14:56:31',`update_time`) VALUES (10,'192.168.1.85',48229,'2018-05-24 14:56:32','2018-11-16 11:01:11');
INSERT INTO ``(`id`,`update_time`) VALUES (11,'2018-11-16 11:01:15');
INSERT INTO ``(`id`,`update_time`) VALUES (12,'2018-11-16 13:34:37');

2.測試sql

explain select * from pre_request_logs_20180524 where port in (51161,48229);

執行結果

從結果來看是沒有用到索引,但不要著急下結論,再看二個sql

select * from pre_request_logs_20180524 where port in (51161,48229);
select * from pre_request_logs_20180524 where port in (51161,20462);

執行結果分別如下

可以看到第二條sql是用到了索引,二條sql的區別在於port值不一樣,一個包含48229,一個包含20462

其實MySQL優化器會自動判斷in是否走二級索引,也就是port欄位的索引

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。