MySQL什么时候用索引比不用索引还慢?

假设我们现在有一个表,表结构如下所示:

CREATE TABLE `table` (
    `id` INT unsigned NOT NULL AUTO_INCREMENT,
    `a` varchar(255) NOT NULL DEFAULT '',
    `b` INT unsigned NOT NULL DEFAULT 0,
    `c` text NOT NULL DEFAULT '',
    PRIMARY KEY (`id`),
    KEY `index` (`a`, `b`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

可以看到,我们定义了一个复合索引 index(a,b),现在我们用这个复合索引来进行一条SQL查询:

select * from table where b = 88;

当查询的是所有字段,那么此时就没有必要使用索引了,为啥?

我们来个反证:假设现在还是使用 index 复合索引,那么就需要把 index 索引整个读一遍,然后过滤出满足条件的数据,由于索引中没有保存 c 字段的值,所以还需要回表操作,再去主键索引中找到对应的记录,这一路操作下来太麻烦了,光 B+Tree 都读了两棵(而且第一颗 B+Tree 还是遍历),那我们还不如直接遍历主键索引呢!主键索引里要啥有啥,遍历完了想要的数据都有了,遍历主键索引其实就是我们常说的全表扫描。

最后总结一下:是否索引并非万金油,还得结合业务和现实情况!

### Mysql 中 LIKE 语句使用索引的条件和限制 #### 条件 当 `LIKE` 语句能够利用索引时,通常满足以下条件之一: - **前缀匹配模式**:如果 `LIKE` 表达式的模式是以固定字符串开头而是通配符 `%` 或 `_` 开头,则可以有效利用索引。例如,`SELECT * FROM table WHERE column LIKE 'prefix%'` 可以通过 B-Tree 索引来加速查询[^1]。 #### 限制 然而,在某些情况下,即使存在索引,`LIKE` 查询也可能会使用它: 1. **前置通配符** 如果 `LIKE` 模式以 `%` 或 `_` 开始(如 `'%suffix'`),则无法利用索引进行查找,因为 MySQL 数据库引擎无法预测这些通配符可能表示的内容长度或范围,从而执行全表扫描来找到符合条件的结果[^1]。 2. **大小写敏感性与校对规则影响** 当字段具有特定的校对规则 (collation),特别是那些忽略大小写的规则时,可能会干扰索引的有效应用。尽管此因素并非直接针对 `LIKE` 运算符本身,但它确实会影响整体性能表现以及是否会选择基于该列上的任何可用索引[^4]。 3. **数据分布稀疏程度足** 即使某个字段上有定义好的索引,并且查询形式理论上支持其运用,但如果目标记录占总记录比例过高以至于接近整个表格内容的话,MySQL 的查询优化器仍有可能决定放弃采用索引而改采更高效的全表扫瞄方式完成检索操作[^2]。 4. **函数调用或表达式计算破坏了索引连续性** 若在涉及索引字段的操作过程中引入额外逻辑处理比如拼接其他值形成新的比较对象等情况发生时,同样会造成原本可被正常使用的索引变得可访问状态[^3]。 ```sql -- 正确示例:能索引 SELECT * FROM users WHERE email LIKE 'example@domain.com%'; -- 错误示例:索引 SELECT * FROM users WHERE email LIKE '%com'; ``` 以上情况均可能导致 `LIKE` 子句未能充分利用已建立起来的相关联索引结构来进行高效的数据定位工作流程之中去实现预期效果达成目的所需时间成本降效率提升等方面取得良好成效的同时也需要注意避免必要的资源浪费现象产生出来才行啊朋友们! ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值