MySQL查詢條件中in會用到索引嗎
當(dāng)用人問你MySQL 查詢條件中 in 會不會用到索引,你該怎么回答?
答案:可能會用到索引
動手來測試下
1.創(chuàng)建一張表,給字段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 '狀態(tài)',
`create_time` datetime NOT NULL COMMENT '創(chuàng)建時間',
`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請求日志';
插入測試數(shù)據(jù)
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`, `ip`, `port`, `status`, `create_time`, `update_time`) VALUES (2, '192.168.1.100', 10653, '成功', '2018-05-24 14:55:54', '2018-11-16 10:58:13'); INSERT INTO ``(`id`, `ip`, `port`, `status`, `create_time`, `update_time`) VALUES (3, '192.168.1.112', 50359, '失敗', '2018-05-24 14:56:00', '2018-11-16 10:58:13'); INSERT INTO ``(`id`, `ip`, `port`, `status`, `create_time`, `update_time`) VALUES (4, '192.168.1.67', 30426, '失敗', '2018-05-24 14:56:09', '2018-11-16 10:58:13'); INSERT INTO ``(`id`, `ip`, `port`, `status`, `create_time`, `update_time`) VALUES (5, '192.168.1.209', 49323, '失敗', '2018-05-24 14:56:12', '2018-11-16 10:58:13'); INSERT INTO ``(`id`, `ip`, `port`, `status`, `create_time`, `update_time`) VALUES (6, '192.168.1.209', 51161, '成功', '2018-05-24 14:56:13', '2018-11-16 10:58:13'); INSERT INTO ``(`id`, `ip`, `port`, `status`, `create_time`, `update_time`) VALUES (7, '192.168.1.12', 54167, '成功', '2018-05-24 14:56:16', '2018-11-16 10:58:13'); INSERT INTO ``(`id`, `ip`, `port`, `status`, `create_time`, `update_time`) VALUES (8, '192.168.1.64', 20462, '成功', '2018-05-24 14:56:19', '2018-11-16 10:58:13'); INSERT INTO ``(`id`, `ip`, `port`, `status`, `create_time`, `update_time`) VALUES (9, '192.168.1.53', 22823, '失敗', '2018-05-24 14:56:31', '2018-11-16 10:58:13'); INSERT INTO ``(`id`, `ip`, `port`, `status`, `create_time`, `update_time`) VALUES (10, '192.168.1.85', 48229, '成功', '2018-05-24 14:56:32', '2018-11-16 11:01:11'); INSERT INTO ``(`id`, `ip`, `port`, `status`, `create_time`, `update_time`) VALUES (11, '192.168.1.85', 48229, '成功', '2018-05-24 14:56:32', '2018-11-16 11:01:15'); INSERT INTO ``(`id`, `ip`, `port`, `status`, `create_time`, `update_time`) VALUES (12, '192.168.1.85', 48229, '成功', '2018-05-24 14:56:32', '2018-11-16 13:34:37');
2.測試sql
explain select * from pre_request_logs_20180524 where port in (51161,20462,48229);
執(zhí)行結(jié)果

從結(jié)果來看是沒有用到索引,但不要著急下結(jié)論,再看二個sql
select * from pre_request_logs_20180524 where port in (51161,48229); select * from pre_request_logs_20180524 where port in (51161,20462);
執(zhí)行結(jié)果分別如下


可以看到第二條sql是用到了索引,二條sql的區(qū)別在于port值不一樣,一個包含48229,一個包含20462
其實MySQL優(yōu)化器會自動判斷in是否走二級索引,也就是port字段的索引
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
相關(guān)文章
為什么MySQL 刪除表數(shù)據(jù) 磁盤空間還一直被占用
這篇文章主要討論為什么MySQL 刪除表數(shù)據(jù) 磁盤空間還一直被占用,項目中使用Mysql作為數(shù)據(jù)庫,對于表來說,一般為表結(jié)構(gòu)和表數(shù)據(jù)。表結(jié)構(gòu)占用空間都是比較小的,一般都是表數(shù)據(jù)占用的空間。接下來小編就和大家一起進入下面文章內(nèi)容的學(xué)習(xí)2021-10-10
探究MySQL中索引和提交頻率對InnoDB表寫入速度的影響
這篇文章主要介紹了MySQL中索引和提交頻率對InnoDB表寫入速度的影響,作者通過實際測試運行時間的對比來驗證,需要的朋友可以參考下2015-05-05
詳解遠程連接Mysql數(shù)據(jù)庫的問題(ERROR 2003 (HY000))
本篇文章是對遠程連接Mysql數(shù)據(jù)庫的問題進行了詳細的分析介紹,需要的朋友參考下2013-06-06
MySQL存儲過程之流程控制while,repeat,loop循環(huán)
這篇文章主要介紹了MySQL存儲過程之流程控制while,repeat,loop循環(huán),循環(huán)中的代碼會運行特定的次數(shù),或者是運行到特定條件成立時結(jié)束循環(huán)2022-07-07

