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变小了,说明按索引扫描的行明显变少了,所以有了提高.
分享到:
相关推荐
MySQL是世界上最流行的开源关系型数据库管理系统之一,而`mysql-connector-java`是MySQL官方提供的用于Java应用程序连接到MySQL服务器的驱动程序。`mysql-connector-java-5.1.27.jar`是这个驱动的一个特定版本,它...
mysql-essential-5.1.44-win32.part3.rar
- 注意`type`列,如`const`、`ref`、`range`、`index`和`ALL`,了解MySQL如何使用索引。 10. 索引优化策略: - 避免在索引列上使用NOT、!、、IS NULL、LIKE '%value%'等操作,这些会导致索引失效。 - 尽量让经常...
这个"mysql-connector-java-5.1.45-bin.jar"文件是该驱动的一个特定版本,即5.1.45版。这个版本是纯净且正版的,适合于Java开发者在他们的项目中直接集成使用。 在Java编程中,为了连接到MySQL数据库,我们需要一个...
MySQL-connector-java-8.0.28 是MySQL数据库与Java应用程序之间通信的重要组件,它是一个JDBC(Java Database Connectivity)驱动程序,使得Java开发者能够通过编写Java代码来访问和操作MySQL数据库。在这个版本中,...
使用"mysql-connector-java-5.1.7-bin.jar"时,需要将其添加到Java项目的类路径中。这可以通过多种方式实现,例如在IDE(如Eclipse或IntelliJ IDEA)中设置库依赖,或者在命令行运行Java程序时使用`-cp`或`-...
在这个"mysql-connector-java-8.0.11"压缩包中,包含的是MySQL官方发布的针对Java的最新版本连接器,版本号为8.0.11。 1. **JDBC接口**:JDBC是Java语言访问数据库的标准接口,由Java SE的java.sql包提供。它定义了...
`mysql-connector-java-5.1.47.jar`是这个驱动程序的特定版本,发布于MySQL的5.1系列,它提供了与MySQL 5.1数据库版本兼容的连接功能。 **JDBC(Java Database Connectivity)** JDBC是Java平台上的标准API,由Sun ...
使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的 SQL 操作,同时也可以防止事务或者表锁死,并且写起来也很容易。但是,有些情况下,子查询可以被更有效率的连接(JOIN) 替代。 六、索引的使用 索引是...
mysql驱动包 mysql-connector-java-5.1.13-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/J的一个特定版本,发布于GPL(GNU General Public License)许可下,意味着它是开源且可自由分发的。 MySQL Connector/J 5.1.36是针对MySQL 5.1系列数据库...
5.6.20 最新JDBC mysql-connector-java-5.1.32-bin.jar
"mysql-connector-java-3.0.16-ga-bin.jar" 是这个特定版本的驱动程序,用于与MySQL 3.x至5.x版本兼容。 该驱动程序的主要功能包括: 1. **连接建立**:通过提供JDBC URL、用户名和密码,Java应用程序可以使用`...
本资源提供的"mysql-connector-java-8.0.31-jar包"正是这样一个驱动程序的最新版本,即8.0.31。 MySQL Connector/J 8.0.31版本包含了对MySQL 8.x系列数据库的全面支持,提供了许多新特性和改进。以下是一些关键知识...
- `seq_in_index`: 在多列索引中,该列的位置序号。 - `collation`: 列在索引中的排序方式。 - `cardinality`: 索引中不同值的数量估计。 - `sub_part`: 如果索引列是部分索引,则表示部分长度。 - `packed`: 索引的...
"mysql-connector-java-5.1.40.tar.gz" 是这个驱动程序的一个特定版本,版本号为5.1.40。这个压缩包包含了运行Java应用与MySQL数据库进行交互所需的类库和其他相关文件。 在Linux环境中处理这个压缩包,首先需要将...
mysql-connector-odbc-5.2.7-winx64.msi MySQL Connector/ODBC 有时也可以叫做 MyODBC,用户可以用ODBC (Open Database Connectivity,开放数据库互联)数据库连接Mysql的服务器。比如说,用户可以使用Windows或者...
MySQL是世界上最受欢迎的关系型数据库管理系统之一,而`mysql-connector-java-5.1.30`是MySQL官方为Java开发者提供的数据库连接驱动包。这个驱动包使得Java应用程序能够与MySQL数据库进行无缝通信,执行SQL查询,...
最后,外键是表中用于建立和加强两个表数据链接的一列或多列。外键用于在两个表的列之间建立链接,保证数据的一致性、完整性和引用的完整性。外键的设置要求父表中的外键列必须是键,通常是一个主键或唯一键。在本...