数据库添加索引导致前端页面异常/加载不出来的神奇情况
今天在优化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的学习还是不够啊。。。