数据库添加索引导致前端页面异常/加载不出来的神奇情况

数据库添加索引导致前端页面异常/加载不出来的神奇情况

今天在优化mysql,看到一个主要的select联合其他表的patient_id没有索引,先在线下测试过后没有问题,跑到线上数据库加索引,加完了,页面加载不出来了----->wtf???
报错显示type_id有null值??我加个索引怎么把值搞没了?

前面上答案,解析在下面

线上存在逻辑上不应该为空的值,只不过加载的时候mysql通过offset的方式并没有加载到那一页(几百页谁去慢慢翻),空值的情况可能是有人在做测试懒得加type_id了,而加上索引导致排列顺序变了空值提到了最前方。知道了索引可能会改变数据的排列顺序就比较容易定位问题了。

为什么索引会改变顺序?

首先在InnoDB中,表数据文件本身就是按B+树组织的一个索引结构,

https://www.jianshu.com/p/71700a464e97 B+树总结

在这里插入图片描述
添加了索引后的数据假如是这个样子的,在没有添加索引前比如我要找13,那就遍历整个列找13 ,而添加索引后会先判断13是0-8还是9-15,确认在9到15后进入下一层确认是9-11还是13-15,然后在13 15里找到13。只进行了三次io。而三层b+树可以存放21902400条数据。这也是为什么索引这么快。

我还是有点不懂

为什么数据的排列会因为一个新添加的普通索引改变,不是根据主索引排序吗(InnoDB必须有主键)。
然后我查到了聚簇索引(逻辑顺序与物理顺序一致的索引,可能是添加了patient_id被当作了聚簇索引改变了顺序???????)
聚簇索引的侯选列:
1、主键列,该列在where子句中使用并且插入是随机的。
2、按范围存取的列,如pri_order > 100 and pri_order < 200。
3、在group by或order by中使用的列。
4、不经常修改的列。
5、在连接操作中使用的列。

https://www.cnblogs.com/wyy123/p/6269875.html Mysql的聚簇索引与非聚簇索引

mysql的学习还是不够啊。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值