在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
之前我们已经详细介绍了关于索引的原理和索引的查询的原则,所谓工欲善其事必先利其器,各位在学习阶段一定要要循序渐进的来学习这块知识,千万不要眼高手低,一定要不急不躁,争取一个萝卜一个坑,学完后能一次性拿下这些知识点,然后再加以运用。 前面的文章我们讨论过,索引的设计要根据 MySQL针对主键索引会维护一个B+树的结构,这个我们称之为聚簇索引,针对非主键(一般都是建立的联合索引)会对索引字段依次排序,然后从第一个字段值开始比较,第一个字段值相同就针对下一个字段值进行比较,依次往后推。 如果联合索引中的字段值都是一样的,那么就根据主键来排序。另外聚簇索引(主键索引)的B+树中保存的是一行记录的所有信息,非聚簇索引(非主键索引)仅仅保存索引字段值和主键字段值。 好了,对于索引原理的回顾我们就介绍到这里,本篇文章,我们继续介绍的是MySQL设置的基本原则,这个也很好理解,就是在设计和建立索引的时候需要遵循哪些原则,按照“标准”去建立索引。今天我们就将关于索引的设计的所有的原则一次性讲清楚。 再多说几句,关于这个知识点,在面试的时候,我经常会问候选人,以此来判断他对索引是不是真的有理解,而不是简单的背八股文! 主键索引对于主键索引其实是最简单的,但是这里有一些注意的地方还是再啰嗦下。 大家在设计主键的时候一定要是自增的,非常不建议使用 为什么?因为 我们还是老规矩,画个图帮助大家理解 如果主键是自增的,MySQL只需要根据主键目录能很快的定位到新增的记录应该插入到哪里,如果主键不是自增的那么每次都需要从头开始比较,然后找到合适的位置,再将记录插入进去,这样真的严重影响效率,所以主键的设计一定要是自增的。 另外唯一索引和主键索引类似,但是唯一索引不一定是自增的,所以维护唯一索引的成本肯定是大于主键索引的。 但是唯一索引的值是唯一的(唯一索引可以有一个值为 NULL),可以更快的通过索引字段来确定一条记录,但是可能需要进行回表查询(至于什么是回表就不再赘述了,前面文章已经详细的讲解过了)。 为频繁查询的字段建立索引我们在建立索引的时候,要为那些经常作为查询条件的字段建立索引,这样能够提高整个表的查询速度。 但是查询条件一般不是一个字段,所以一般是建立的联合索引比较多。 另外查询条件中一般会有like这样的模糊查询,如果是模糊查询请最好遵守最左前缀查询原则。 避免为"大字段"建立索引这个可以换句话说:就是尽量使用数据量小的字段作为索引。 举个例子来说,假设有两个这样的字段,一个是 那假如就要为 CREATE INDEX tbl_address ON dual(address(20)); 选择区分度大的列作为索引这又是什么意思?举个例子相信大家一下子就明白了。 假设现在有一个"性别"字段,里面存放的数据的值要么是男,要么是女,那么这样的字段很不适合作为索引。 这样的字段的值的主要特点就是区分度不够高,而区分度不高的字段不适合做索引,为什么呢? 因为如果值出现的几率几乎相等,那么无论搜索哪个值都可能得到一半的数据。 在这些情况下,还不如不要索引,因为MySQL他还有一个查询优化器,查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描。 惯用的百分比界线是"30%"。(匹配的数据量超过一定限制的时候查询器会放弃使用索引(这也是索引失效的场景之一哦)。 这就是原因。所以看到这里相信大家应该知道为什么要尽量避免使用基数小的字段作为索引了吧。其实这里涉及到 尽量为ORDER BY 和 GROUP BY 后面的字段建立索引将
因为在 如果 然而比较坑的是,如果
不要在条件中使用函数如果是已经建立好的索引的字段在使用的时候执行了函数操作,那么这个索引就使用不到了。 这是为什么? 因为 但是如果有人就犟,那我就要使用到函数怎么办?总不能为了索引而改变业务啊?如果是使用 这又是什么意思?假设有一个字段叫 SELECT * FROM student WHERE round(age) = 2; 这个时候索引是使用不到的,那么如果真的非要让 create index stu_age_round on test(round(age)); 这个时候在通过上面的方式去查询,索引就是生效的,相信这个大家是能想明白的。 不要建立太多的索引因为MySQL维护索引是需要空间和耗费性能的,MySQL会为每个索引字段维护一颗B+树。 所以如果索引过多,这无疑是增加了MySQL的负担。 频繁增删改的字段不要建立索引这个就很好理解了,因为我们前面早就介绍过,字段的变化 假设某个字段频繁修改,那就意味着需要频繁的重建索引,这必然影响MySQL的性能啊。这里不再多说了。 说到这里大部分说的是所以设计的时候需要注意的一些原则,其实真正的原则还是需要根据实际的业务变更的,没有所谓的“公式”,只要适合自己实际的业务场景的设计才是最好的。所以大家也不要过于追求“优化”,因为这样往往会适得其反,毕竟脱离了业务谈技术就是在耍流氓。 好了下面我们再来一起重点看看哪些情况下索引会失效。(PS:本文基本全是理论,我想画图来表达,结果发现根本无法下手希望大家再坚持下,就快完事了。) 索引失效的常见场景
假设字段 SELECT * FROM student WHERE age=15 上面这种情况是能使用到索引的,但是如果你这么写 SELECT * FROM student WHERE age='15' 那这种情况是使用不到索引的,也就是 如果字段基数小也可能会导致索引失效,具体在本文的上面部分已经详细解释了,也就是 其他的一些原则请大家还是要去看下索引的原理和查询的基本原则,如果没有前面的铺垫,这些看起来似乎有些空洞。所以请大家在索引这一块一定要循序渐进的学习,这一块基本也是我们平时在使用 以上就是跳槽必备之你设计索引的原则是什么?怎么避免索引失效?的详细内容,更多关于设计索引的原则的资料请关注极客世界其它相关文章! |
请发表评论