mysql join on 索引_MySQL的JOIN不使用索引

MySQL 5.7.18版出现问题. MySQL的早期版本的行为符合预期.

这是两个表.表格1:

CREATE TABLE `test_events` (

`id` int(11) NOT NULL,

`event` int(11) DEFAULT '0',

`manager` int(11) DEFAULT '0',

`base_id` int(11) DEFAULT '0',

`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

`client` int(11) DEFAULT '0',

`event_time` datetime DEFAULT '0000-00-00 00:00:00'

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `test_events`

ADD PRIMARY KEY (`id`),

ADD KEY `client` (`client`),

ADD KEY `event_time` (`event_time`),

ADD KEY `manager` (`manager`),

ADD KEY `base_id` (`base_id`),

ADD KEY `create_time` (`create_time`);

第二张表:

CREATE TABLE `test_event_types` (

`id` int(11) NOT NULL,

`name` varchar(255) DEFAULT NULL,

`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

`base` varchar(255) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `test_event_types`

ADD PRIMARY KEY (`id`);

让我们尝试从基础“ 314”中选择最后一个事件:

EXPLAIN SELECT `test_events`.`create_time`

FROM `test_events`

LEFT JOIN `test_event_types`

ON ( `test_events`.`event` = `test_event_types`.`id` )

WHERE base = 314

ORDER BY `test_events`.`create_time` DESC

LIMIT 1;

+----+-------------+------------------+------------+------+---------------+------+---------+------+--------+----------+----------------------------------------------------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+------------------+------------+------+---------------+------+---------+------+--------+----------+----------------------------------------------------+

| 1 | SIMPLE | test_events | NULL | ALL | NULL | NULL | NULL | NULL | 434928 | 100.00 | Using temporary; Using filesort |

| 1 | SIMPLE | test_event_types | NULL | ALL | PRIMARY | NULL | NULL | NULL | 44 | 2.27 | Using where; Using join buffer (Block Nested Loop) |

+----+-------------+------------------+------------+------+---------------+------+---------+------+--------+----------+----------------------------------------------------+

2 rows in set, 1 warning (0.00 sec)

MySQL不使用索引,而是读取整个表.

没有WHERE语句:

EXPLAIN SELECT `test_events`.`create_time`

FROM `test_events`

LEFT JOIN `test_event_types`

ON ( `test_events`.`event` = `test_event_types`.`id` )

ORDER BY `test_events`.`create_time` DESC

LIMIT 1;

+----+-------------+------------------+------------+--------+---------------+-------------+---------+-----------------------+------+----------+-------------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+------------------+------------+--------+---------------+-------------+---------+-----------------------+------+----------+-------------+

| 1 | SIMPLE | test_events | NULL | index | NULL | create_time | 4 | NULL | 1 | 100.00 | NULL |

| 1 | SIMPLE | test_event_types | NULL | eq_ref | PRIMARY | PRIMARY | 4 | m16.test_events.event | 1 | 100.00 | Using index |

+----+-------------+------------------+------------+--------+---------------+-------------+---------+-----------------------+------+----------+-------------+

2 rows in set, 1 warning (0.00 sec)

现在,它使用索引.

MySQL 5.5.55在两种情况下都使用索引.为什么会这样以及如何处理呢?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值