`
kabike
  • 浏览: 609580 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

mysql多列索引(Multiple-Part Index)多个列上range scan时使用in

阅读更多
show create table 20130314t1

CREATE TABLE `20130314t1` (
  `id` int(11) NOT NULL,
  `col1` int(11) NOT NULL,
  `col2` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `key1` (`col1`,`col2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

其中表里插入了100w数据,col1和col2都是100以内的随机数.

进行如下的查询,
select COUNT(*) from 20130314t1 where col1 >19 and col1 <30 and col2 >30 and col2 <33;

这是在多列索引上进行的range scan,理论上mysql只能使用索引的一部分,即col1那部分,从查询计划来看,key_len是4
mysqlslap工具测试下,平均时间是0.178s

把查询改成
select COUNT(*) from 20130314t1 where col1 BETWEEN 20 and 29 and col2 >30 and col2 <33;

这个非常奇怪,理论上key_len应该还是4,因为5.1的文档说
引用

If the operator is >, <, >=, <=, !=, <>, BETWEEN, or LIKE, the optimizer uses it but considers no more key parts.

结果key_len成了8,不过mysqlslap测试的结果提升不大,变成了0.156s


现在使用in语句,因为都是int类型,语句可以改成
select COUNT(*) from 20130314t1 where col1 in(20,21,22,23,24,25,26,27,28,29)
and col2 >30 and col2 <33

key_len还是8,不过变成了0.005s

这是因为col1 BETWEEN 20 and 29是range scan(范围扫描),
而col1 in(20,21,22,23,24,25,26,27,28,29)是多值相等,尽管结果一样,但是意义有着显著的不同.

可以通过show status like 'Handler_%';来观察三个语句执行中的读情况

select COUNT(*) from 20130314t1 where col1 >19 and col1 <30 and col2 >30 and col2 <33;

| Handler_read_key           | 1     |
| Handler_read_next          | 99856 |

select COUNT(*) from 20130314t1 where col1 BETWEEN 20 and 29 and col2 >30 and col2 <33;
| Handler_read_key           | 1     |
| Handler_read_next          | 90168 |

select COUNT(*) from 20130314t1 where col1 in(20,21,22,23,24,25,26,27,28,29)
and col2 >30 and col2 <33;
| Handler_read_key           | 10    |
| Handler_read_next          | 2072  |


看到使用了in之后,Handler_read_next变小了,说明按索引扫描的行明显变少了,所以有了提高.
1
0
分享到:
评论
2 楼 kabike 2013-03-19  
netkiller.github.com 写道
我也主要到 in 不同,长久以来都SQL军规不能使用in, 但随着技术提高,很多问题都得到了解决。

我说的这个问题是mysql特有的,别的数据库就不清楚了
1 楼 netkiller.github.com 2013-03-19  
我也主要到 in 不同,长久以来都SQL军规不能使用in, 但随着技术提高,很多问题都得到了解决。

相关推荐

    mysql连接包mysql-connector-java-5.1.27.jar

    MySQL是世界上最流行的开源关系型数据库管理系统之一,而`mysql-connector-java`是MySQL官方提供的用于Java应用程序连接到MySQL服务器的驱动程序。`mysql-connector-java-5.1.27.jar`是这个驱动的一个特定版本,它...

    mysql-essential-5.1.44-win32

    mysql-essential-5.1.44-win32.part3.rar

    mysql-connector-java-5.1.45-bin.jar

    这个"mysql-connector-java-5.1.45-bin.jar"文件是该驱动的一个特定版本,即5.1.45版。这个版本是纯净且正版的,适合于Java开发者在他们的项目中直接集成使用。 在Java编程中,为了连接到MySQL数据库,我们需要一个...

    MySQL-connector-java-8.0.28

    MySQL-connector-java-8.0.28 是MySQL数据库与Java应用程序之间通信的重要组件,它是一个JDBC(Java Database Connectivity)驱动程序,使得Java开发者能够通过编写Java代码来访问和操作MySQL数据库。在这个版本中,...

    mysql-connector-java-5.1.7-bin.jar

    使用"mysql-connector-java-5.1.7-bin.jar"时,需要将其添加到Java项目的类路径中。这可以通过多种方式实现,例如在IDE(如Eclipse或IntelliJ IDEA)中设置库依赖,或者在命令行运行Java程序时使用`-cp`或`-...

    mysql-connector-java-5.1.47 jar包

    `mysql-connector-java-5.1.47.jar`是这个驱动程序的特定版本,发布于MySQL的5.1系列,它提供了与MySQL 5.1数据库版本兼容的连接功能。 **JDBC(Java Database Connectivity)** JDBC是Java平台上的标准API,由Sun ...

    mysql-connector-java-8.0.11

    在这个"mysql-connector-java-8.0.11"压缩包中,包含的是MySQL官方发布的针对Java的最新版本连接器,版本号为8.0.11。 1. **JDBC接口**:JDBC是Java语言访问数据库的标准接口,由Java SE的java.sql包提供。它定义了...

    MYSQL专题-查询优化-使用索引-安全隐患-事务与锁.docx

    使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的 SQL 操作,同时也可以防止事务或者表锁死,并且写起来也很容易。但是,有些情况下,子查询可以被更有效率的连接(JOIN) 替代。 六、索引的使用 索引是...

    mysql-connector-java-8.0.11.jar

    `mysql-connector-java-8.0.11.jar`适用于较新的MySQL环境,`mysql-connector-java-5.1.7-bin.jar`满足了对老版本MySQL的兼容需求,而`ojdbc14-10.2.0.1.0.jar`则服务于Oracle 10g数据库。在Java开发中,理解如何...

    mysql驱动包 mysql-connector-java-5.1.13-bin.jar

    mysql驱动包 mysql-connector-java-5.1.13-bin.jar 方便快捷获取。。。

    mysql-connector-java-5.1.40-bin.jar连接器

    在使用mysql-connector-java-5.1.40-bin.jar时,通常需要将其添加到项目的类路径(classpath)中,这样Java虚拟机在运行时才能找到并加载这个驱动。在IDE如Eclipse或IntelliJ IDEA中,可以直接将jar文件添加到项目的...

    mysql-connector-java-gpl-5.1.36

    "mysql-connector-java-gpl-5.1.36"是MySQL Connector/J的一个特定版本,发布于GPL(GNU General Public License)许可下,意味着它是开源且可自由分发的。 MySQL Connector/J 5.1.36是针对MySQL 5.1系列数据库...

    mysql-connector-java-5.1.32-bin.jar

    5.6.20 最新JDBC mysql-connector-java-5.1.32-bin.jar

    mysql-connector-java-8.0.31-jar包

    本资源提供的"mysql-connector-java-8.0.31-jar包"正是这样一个驱动程序的最新版本,即8.0.31。 MySQL Connector/J 8.0.31版本包含了对MySQL 8.x系列数据库的全面支持,提供了许多新特性和改进。以下是一些关键知识...

    查看mySQL数据库索引

    - `seq_in_index`: 在多列索引中,该列的位置序号。 - `collation`: 列在索引中的排序方式。 - `cardinality`: 索引中不同值的数量估计。 - `sub_part`: 如果索引列是部分索引,则表示部分长度。 - `packed`: 索引的...

    mysql-connector-java-5.1.30

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,而`mysql-connector-java-5.1.30`是MySQL官方为Java开发者提供的数据库连接驱动包。这个驱动包使得Java应用程序能够与MySQL数据库进行无缝通信,执行SQL查询,...

    mysql-connector-odbc-5.2.7-winx64.msi

    mysql-connector-odbc-5.2.7-winx64.msi MySQL Connector/ODBC 有时也可以叫做 MyODBC,用户可以用ODBC (Open Database Connectivity,开放数据库互联)数据库连接Mysql的服务器。比如说,用户可以使用Windows或者...

    mysql-connector-java-5.1.40.tar.gz

    "mysql-connector-java-5.1.40.tar.gz" 是这个驱动程序的一个特定版本,版本号为5.1.40。这个压缩包包含了运行Java应用与MySQL数据库进行交互所需的类库和其他相关文件。 在Linux环境中处理这个压缩包,首先需要将...

    MySQL SQL高级特性 字段约束-索引-视图-外键学习实践

    最后,外键是表中用于建立和加强两个表数据链接的一列或多列。外键用于在两个表的列之间建立链接,保证数据的一致性、完整性和引用的完整性。外键的设置要求父表中的外键列必须是键,通常是一个主键或唯一键。在本...

    mysql-connector-java-8.0.18.jar

    这是MySQL最新的jar,mysql-connector-java-8.0.18.jar

Global site tag (gtag.js) - Google Analytics