[MySQL] 利用explain查看sql语句中使用的哪个索引
2023-02-18 15:36:30 时间
字段类型是:
`enterpriseId` int(10) unsigned DEFAULT NULL,
`email` char(255) NOT NULL DEFAULT '',
表的索引是:
UNIQUE KEY `emailent` (`email`,`enterpriseId`),
KEY `edf` (`enterpriseId`,`departId`,`flag`),
有这么两条sql语句,分别表现是:
explain select email from email where enterpriseId=23684 and (email like 'aaa%'); +----+-------------+-------+------+---------------+------+---------+-------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+-------+------+-------------+ | 1 | SIMPLE | email | ref | emailent,edf | edf | 5 | const | 6 | Using where |
看到key_len的长度是5 ,可以知道使用的是edf这个索引 , 因为edf索引中的enterpriseId是int类型4个字节 ,默认null 加1个字节,总共5个字节
也就是先使用enterpriseId查到索引,在索引中使用where过滤数据
explain select email from email where enterpriseId=23684 and (email like 'aaas%'); +----+-------------+-------+-------+---------------+----------+---------+------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+----------+---------+------+------+--------------------------+ | 1 | SIMPLE | email | range | emailent,edf | emailent | 770 | NULL | 2 | Using where; Using index | +----+-------------+-------+-------+---------------+----------+---------+------+------+--------------------------+
在like的时候比上面多了一个字符,这个时候的索引情况是key_len是770,可以知道使用的是emailent这个索引,因为这个的索引长度是
255*3+5=770 varchar是255个字符,utf8下是*3, 加上int 5个字节
like两边都有%的情况,只会使用第一个条件的edf索引
mysql> explain select * from email where enterpriseId=23684 and (email like '%shihanasas%'); +----+-------------+-------+------+---------------+------+---------+-------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+-------+------+-------------+ | 1 | SIMPLE | email | ref | edf | edf | 5 | const | 6 | Using where | +----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
相关文章
- 从统一视角看各类高效finetune方法
- .NET6打包部署到Windows Service
- .NET7 一个实用功能-中央包管理
- Docker 部署Redis哨兵
- 单细胞转录组 | 多样本处理与Harmony整合
- 聊聊如何利用redis实现多级缓存同步
- docker高级篇4-分布式存储之实战案例:Redis集群主从容错切换迁移案例
- Redis的数据持久化
- Redis的AOF持久化
- Redis高可用之哨兵机制实现细节
- 剑指 Offer 10- II. 青蛙跳台阶问题
- 1137. 第 N 个泰波那契数
- 46. 全排列
- 231. 2的幂
- bitset
- 371. 两整数之和
- 1356. 根据数字二进制下 1 的数目排序
- 数组中出现次数超过一半的数字
- 476. 数字的补数
- 剑指 Offer 15. 二进制中1的个数