mysql 联合唯一索引失效

如下图所示,在mysql 一张表中 联合唯一索引按照业务要求由三个字段构成 , 其中name和isbn是varhar,type是tinyint

然后又一次查询接口返回报错,提示返回了多个结果,然后我一看表里面,有同样的两条数据,其中name和type有值,但是isbn是NULL。这个时候我去查询资料发现联合唯一索引中,要是有一个存在null那么整个都会失效。可是,为什么会这样呢?要是是联合索引的话会不会也失效呢?这就需要我们来探索下索引这个东西了。

参考一篇写的很好的文章关于索引的基本都讲到了,

http://blog.codinglabs.org/articles/theory-of-mysql-index.html

但是对于b_tree和b+tree实际上讲的不是很详细,可以看这篇文章

https://www.cnblogs.com/gym333/p/6877023.html

这个图就一目了然了

另外看的途中我们自己要在本机做测试的话需要安装mysql或者native的,但是如果是drds的话他的expalin的展现形式会变成这样

对于一般正常的数据库会是这样

所以,这个可能需要其他的途径解决

### MySQL 中 `LIMIT` 导致索引失效的原因 当查询中包含 `LIMIT` 子句时,MySQL 的优化器可能会选择不同的执行计划来处理查询。通常情况下,`LIMIT` 不会导致索引完全失效,但如果配合不当的排序 (`ORDER BY`) 或者其他复杂条件,则可能导致性能下降。 #### 排序与 LIMIT 组合的影响 如果查询包含了 `ORDER BY` 并且该排序依据的列未被适当索引,即使存在针对其他字段的有效索引,也可能因为需要先完成全表扫描再取前几条记录而导致整体效率低下[^3]。具体来说: - 当 `ORDER BY` 后面跟的是没有建立索引的列时,MySQL 可能不得不读取大量数据并对其进行排序才能返回指定数量的结果集; - 如果确实有必要进行排序操作,建议确保所涉及的所有列都已创建合适的复合索引,从而让数据库可以直接利用这些结构快速定位所需的数据片段而无需额外的工作量。 ```sql -- 建议做法:为经常用于 ORDER BY 和 LIMIT 查询组合中的各列创建联合索引 CREATE INDEX idx_order_limit ON table_name (column_for_order, other_columns); ``` #### 使用 PRIMARY KEY / UNIQUE 字段时的情况 对于基于主键或唯一键上的简单查找上 `LIMIT 1` ,一般不会引起显著的问题,因为这类约束本身就意味着每一条记录都是独一无二的,在这种条件下应用 `LIMIT` 几乎没有任何实际意义——除非是为了提高可读性或是防止意外获取多于预期的结果数[^4]。 然而需要注意的是,某些特定版本下的 MySQL 对此可能存在特殊行为;因此始终要测试具体的环境配置以确认最佳实践方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值