5分钟了解MySQL5.7对in用法有什么黑科技

MySQL5.7对in用法有什么黑科技

构建测试环境

Part1:创建测试数据库

[[email protected] ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.15-log MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql> select version();
+------------+
| version()  |
+------------+
| 5.7.15-log |
+------------+
1 row in set (0.00 sec)

[[email protected] ~]# /usr/local/mariadb/bin/mysql -uroot -S /tmp/mariadb.sock 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.1.16-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

MariaDB [helei]> select version();
+-----------------+
| version()       |
+-----------------+
| 10.1.16-MariaDB |
+-----------------+
1 row in set (0.00 sec)

如何构建MySQL5.7测试环境和MariaDB10.1测试环境本文不做赘述,如有需要可移步:

一分钟完成MySQL5.7安装

http://suifu.blog.51cto.com/9167728/1855415

MariaDB10.1自动化部署

http://suifu.blog.51cto.com/9167728/1830575

Part2:构建测试表

CREATE TABLE helei (
id INT (10) UNSIGNED NOT NULL AUTO_INCREMENT,
c1 INT (10) NOT NULL DEFAULT ‘0‘,
c2 INT (10) UNSIGNED DEFAULT NULL,
c5 INT (10) UNSIGNED NOT NULL DEFAULT ‘0‘,
c3 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
c4 VARCHAR (200) NOT NULL DEFAULT ‘‘,
PRIMARY KEY (id),
KEY idx_c1 (c1),
KEY idx_c2 (c2)
) ENGINE = INNODB;


对比测试结果

Part1:MyriaDB10.1.16

MariaDB [helei]> explain select * from helei where (id,c1) in ((100,2684),(101,3566));
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id   | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+
|    1 | SIMPLE      | helei | ALL  | NULL          | NULL | NULL    | NULL | 5198 | Using where |
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

可以看到,MariaDB对这条SQL总共扫描了5198行,且没有用到任何的索引。

Part2:MySQL5.7.15

mysql> explain select * from helei where (id,c1) in ((100,2684),(101,3566));
+----+-------------+-------+------------+-------+----------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys  | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+----------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | helei | NULL       | range | PRIMARY,idx_c1 | PRIMARY | 4       | NULL |    2 |    20.00 | Using where |
+----+-------------+-------+------------+-------+----------------+---------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.29 sec)


可以看到,MySQL5.7版本已经用到了索引,一共扫描条数为2行。这是因为该语句已经被MySQL5.7的内部优化器改写为如下图所示:

——总结——

可以看出,MariaDB版本内部优化器无法改写,因此对于这类查询只能全表扫描。经测试,MySQL5.6和MariaDB10.0/10.1都无法改写。由于笔者的水平有限,编写时间也很仓促,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。

时间: 2024-12-26 12:28:33

5分钟了解MySQL5.7对in用法有什么黑科技的相关文章

5分钟了解MySQL5.7union all用法的黑科技

MySQL5.7union all用法的黑科技 union all在MySQL5.6下的表现 Part1:MySQL5.6.25 [[email protected] ~]# mysql -uroot -p Enter password:  Welcome to the MySQL monitor.  Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.6.25-log MySQL Communit

10分钟了解MySQL5.7对原生JSON的支持与用法

Part1:JSON格式的支持 MySQL5.7版本终于支持了原生的JSON格式,即将关系型数据库和文档型NO_SQL数据库集于一身.本文接下来将对这特性分别就MySQL5.7和MariaDB10.1各自实现的方法异同进行介绍和演示. Part2:创建相应表结构 [[email protected] ~]# mysql -V mysql  Ver 14.14 Distrib 5.7.15, for linux-glibc2.5 (x86_64) using  EditLine wrapper m

5分钟了解MySQL5.7的Online DDL雷区

Part1:写在最前 Online DDL,当新手听到这个名字的时候,非常高兴,以为无论什么情况下,修改表结构都不会锁表,理想很丰满,现实很骨感!读完本文,教你如何避开这些雷区,安全的修改表结构.话不多说,我们分别来看下MySQL5.6和MySQL5.7在修改表结构上的相同和异同. Part2:5.6.25的表现 ①首先我们构造数据并进行测试 mysql> create database helei; Query OK, 1 row affected (0.01 sec) mysql> use

一分钟完成MySQL5.7安装部署

Part1:写在最前 MYSQL5.7.15是截止至本文撰写当日,mysql官网的最新社区版,mysql5.7的多项功能优化可以用激动人心来形容,嫌安装麻烦?没关系,跟着本文,带你1分钟搞定MySQL5.7.15数据库安装部署. Part2:仅仅安装就够了? 不,当然不够,MySQL5.7的多项功能特性更新,无法一一赘述,因此,我们先从和本文最相关的my.cnf,来解读一些MySQL5.7的部分新特性. 在之前我写过一篇MySQL5.6的新特性参数,诸如: innodb_buffer_pool_

5分钟了解MySQL5.7的undo log在线收缩新特性

Part1:写在最前 在MysQL5.6版本中,可以把undo log 回滚日志分离到一个单独的表空间里:其缺点是不能回收空间大小,until MysQL5.7,but MariadDB10.1暂不支持. 本文介绍并演示MysQL5.7是如何在线收缩undo log的. undo log日志是保存在共享表空间ibdata1文件中的,随着数据库的运行时间的不断增长,ibdata1文件会越来越大,在以往的MySQL数据库版本中,如果我们想要回收ibdata1文件所占空间,会非常的复杂和困难,必须先将

MySQL黑科技用法总结(持续更新)

1.利用set插入数值 insert [into] 表名 set 列=值.  2.利用select对字段进行测试 //A表中只有1个字段num1 int(3) ,并且有2条记录 //测试内容:查询出num1的值,测试num1的值是否等于'1',是否等于'3',num1+1的计算结果 tips:相等返回1,否则返回0 select *,num1='1',num1='3',num1+1 from A;

抓腾讯视频真实地址总结

抓腾讯视频裸源总结 腾讯视频必然是国内最全面,最复杂的视频网站之一了,因此研究他的网页结构很有代表性. 首先,腾讯理所当然不会把视频资源暴露在网页源代码里,所以F12查看他的元素以获得重要信息你会无功而返. 所以,凄凉地研究一段时间后断然放弃... 有一个流传已久的经验, 大概是: 攻克一个网页,最好从移动端入手,至于为什么, 大概因为移动端源代码要稍简单一点, 或者说一些加密算法还不成熟. 所以,get一个小技能, 以为只有我知道, 搜寻了半天居然发现是多数浏览器都支持了n久的... 只是以前

1分钟利用mysqlreplicate快速搭建MySQL主从

利用mysqlreplicate快速搭建MySQL主从环境 简介 mysql-utilities工具集是一个集中了多种工具的合集,可以理解为是DBA的工具箱,本文介绍利用其中的mysqlreplicate工具来快速搭建MySQL主从环境. HE1:192.168.1.248 slave HE3:192.168.1.250 master 实战 Part1:安装mysql-utilities [[email protected] ~]# tar xvf mysql-utilities-1.5.4.t

Linux基础 30分钟GDB调试快速突破

引言 Linus心灵鸡汤 在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds Unix 始于上个世纪60年代,在70年代得到了迅猛的发展, 这时候的李纳斯还躺在祖父公寓的摇篮里睡大觉,如果不是后来 Unix 王国自乱阵脚, 出现阵营分裂和法律纠纷,可能 Linux 系统根本都不会出现.真实的情况是, Unix 浪费了大把的时间和机会,似乎就是为了等待这个大鼻子.头发纷乱的芬兰小子长大,然后一决高下. 李纳斯赢得了自己