资讯专栏INFORMATION COLUMN

MySQL 查询条件中 in 会不会用到索引

Yangyang / 3195人阅读

摘要:当有人问你查询条件中会不会用到索引,你该怎么回答答案可能会用到索引动手来测试下创建一张表,给字段建立索引代理端口号成功失败状态创建时间代理请求日志插入测试数据失败成功失败失败失败成功成功

当有人问你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`, `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);

执行结果

从结果来看是没有用到索引,但不要着急下结论,再看二个sql

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

执行结果分别如下

可以看到第二条sql是用到了索引,二条sql的区别在于port值不一样,一个包含48229,一个包含20462

其实MySQL优化器会自动判断in是否走二级索引,也就是port字段的索引
or 查询和 in 一样,都是可能会用到索引,可以试下下面二条sql

explain select * from pre_request_logs_20180524 where port = 51161 or port = 20462;
explain select * from pre_request_logs_20180524 where port = 51161 or port = 48229;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/49384.html

相关文章

  • MySQL实验: 实践索引对全列匹配、最左前缀匹配、范围查询条件的影响以及了解脏读、幻读等

    摘要:索引实验实验目的了解索引对于全列匹配,最左前缀匹配范围查询的影响。因此在中要谨慎地区分多值匹配和范围匹配,否则会对的行为产生困惑。事务隔离层级实验实验目的了解中事务隔离级别以及什么是脏读,幻读,不可重复读。 索引实验 实验目的:了解索引对于全列匹配,最左前缀匹配、范围查询的影响。实验所用数据库见文章最底部连接。 实验软件版本:5.7.19-0ubuntu0.16.04.1-log (U...

    lewinlee 评论0 收藏0
  • MySQL实验: 实践索引对全列匹配、最左前缀匹配、范围查询条件的影响以及了解脏读、幻读等

    摘要:索引实验实验目的了解索引对于全列匹配,最左前缀匹配范围查询的影响。因此在中要谨慎地区分多值匹配和范围匹配,否则会对的行为产生困惑。事务隔离层级实验实验目的了解中事务隔离级别以及什么是脏读,幻读,不可重复读。 索引实验 实验目的:了解索引对于全列匹配,最左前缀匹配、范围查询的影响。实验所用数据库见文章最底部连接。 实验软件版本:5.7.19-0ubuntu0.16.04.1-log (U...

    baukh789 评论0 收藏0
  • MySQL数据SQL优化索引不被使用的典型场景总结

    摘要:一般都推荐使用全文索引来解决类似的全文检索问题。用分割开的条件,如果前的条件中有列索引,而后面的列中没有索引,那么涉及的索引都不会被用到。 有些时候虽然有索引,但是不被优化器选择使用,下面是开发过程中遇到的不能使用索引的几种情况: 1.以%开头的like查询不能够利用B-tree索引,执行计划中key的值为NULL表示没有使用索引。 mysql> explain select * fr...

    My_Oh_My 评论0 收藏0
  • Mysql索引优化

    摘要:例如,检索租赁表中客户编号在指定范围内的记录类型为说明优化器选择范围查询,索引为说明优化器选择索引来加速访问,注意到这个列子中列为表示使用了来进一步优化查询。一般推荐使用全文索引来解决类似的全文检索的问题。 一、索引的数据结构 B-Tree(mysql主要使用 B-tree 平衡树) 聚簇索引与非聚簇索引 聚簇索引:索引的叶节点指向数据 非聚簇索引:索引的叶节点指向数据的引用 索...

    MageekChiu 评论0 收藏0
  • MySQL数据库之索引的应用

    摘要:唯一索引用来唯一标识数据库中的一条记录,但是与主键索引稍有不同,唯一索引允许索引列的值为空,但是不允许索引列的值发生重复。 前面几篇文章详细介绍了MySQL数据库的DML,DDL,DCL,DQL常用操作,本篇文章将介绍MySQL中一块对于开发和维护都比较重要的内容--MySQL索引的应用! 1、索引的作用(1)如果索引为唯一索引,可以保证数据库中每一行数据的唯一性(2)索引如果创建的合...

    lx1036 评论0 收藏0

发表评论

0条评论

Yangyang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<