继6-26日索引

今天偶然发现了一个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查询优化认为:数据量过少,不使用索引比使用索引更快。

长见识了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值