今天偶然发现了一个mysql的in语句,没有使用索引。
背景:
建表语句:
CREATE TABLE `BillPlus` (
`id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
`feeRate` decimal(4,4) NOT NULL DEFAULT '0.0000' COMMENT '服务费率',
`billDownloadKey` varchar(255) NOT NULL COMMENT '下载文件的ossKey',
`orderCount` int(11) unsigned NOT NULL COMMENT '订单总数量',
`billId` bigint(11) unsigned NOT NULL COMMENT 'bill.id',
`invoiceId` int(11) NOT NULL,
`monthlyMemberCount` int(11) NOT NULL COMMENT '企业月活跃有效人数',
`timeCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`timeModified` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
PRIMARY KEY (`id`),
UNIQUE KEY `billId` (`billId`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4;
查询语句是这样的:
select * from BillPlus where billId in (12,23,34,45,454,65);(为了图省事,就使用了*)
并没有使用索引,百思不得解,请教同事之后,得知,mysql并不会一直使用索引,它有自己的优化查询方法,并赠与博客一篇,在此感谢同事。博客地址:一文说尽 MySQL 优化原理
该博客中的一段话:
经过前面的步骤生成的语法树被认为是合法的了,并且由优化器将其转化成查询计划。多数情况下,一条查询可以有很多种执行方式,最后都返回相应的结果。优化器的作用就是找到这其中最好的执行计划。
MySQL使用基于成本的优化器,它尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最小的一个。在MySQL可以通过查询当前会话的last_query_cost的值来得到其计算当前查询的成本。
果然不出所料,于是使用:
show status like 'last_query_cost';
Last_query_cost 10.499000
原本就是测试数据,整个表里,只有10条数据,mysql查询优化认为:数据量过少,不使用索引比使用索引更快。
长见识了。