-
尽量是对那些字段的类型比较小的列来设计索引
,比如说什么tinyint之类的,因为他的字段类型比较小,说明这个字段自己本身的值占用磁盘空间小,此时你在搜索的时候性能也会比较好一点。 -
建立出来的索引其实类似于KEY my_index(name(20),age,course);假设name是varchar(255)类型的,但是在索引树里你对name的值仅仅提取前20个字符而已。
-
where条件里搜索的时候就可以使用前20个字符在索引中搜索
-
但order by name、group by就不行
-
因为你插入的数据值可能根本不是按照顺序来的,很可能会导致索引树里的某个页就会自动分裂,这个页分裂的过程就很耗费时间,因此一般让大家设计索引别太多,建议两三个联合索引就应该覆盖掉你这个表的全部查询了。
-
建议
主键一定是自增
的,别用UUID之类的,因为主键自增,那么起码你的聚簇索引不会频繁的分裂
,主键值都是有序的,就会自然的新增一个页而已,但是如果你用的是UUID,那么也会导致聚簇索引频繁的页分裂。 -
实际场景中,往往
where和order by是没法都用到索引
的 -
设计索引的时候,必须把经常用做
范围查询
的字段放在联合索引的最后一个
,才能保证你SQL里每个字段都能基于索引去查询。 -
在查询的时候如果有些字段是不使用的,可以用
in (所有枚举值)的方式
去写,这样可以让所有查询条件都用上你的索引,同时对范围查询的age字段必须放在最后一个,这样保证范围查询也能用上索引 -
计算或者是函数
不能使用索引 -
可以将一个范围查询,去增加一个字段,让这个字段变成枚举查询;
-
where xx xxx and age>=xx and age<=xxx and
latest_login_time
>=xx(原来) -
(province, city, sex, hobby, character, age,
latest_login_time
) -
加一个
does_login_in_latest_7_days
,用户是否7天内登录的 字段 -
索引改成(province, city, sex, hobby, character,
does_login_in_latest_7_days
, age) -
这个字段就是1,否则超过7天没登录,这个字段就是0
-
where xx xxx and age>=xx and
does_login_in_latest_7_days=1
and age<=xxx(现在) -
针对一些
低基数字段筛选(比如性别筛选)+评分排序(比如对分数排序)
的查询场景,可以设计类似(sex, score)的辅助索引
尽量利用一两个复杂的多字段联合索引,抗下你80%以上的 查询,然后用一两个辅助索引抗下剩余20%的非典型查询,保证你99%以上的查询都能充分利用索引,就能保证你的查询速度和性能!
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
cs/618164986)
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!