Mysql - 哪些字段适合建立索引
在这篇文章开始之前,我们需要注意一下,并不是索引越多越好,索引是一种以空间换取时间的方式,所以建立索引是要消耗一定的空间,况且在索引的维护上也会消耗资源。
数据库建立索引的常用规则如下:
1.表的主键和外键建立索引【主键具有唯一性,索引值也是有唯一,查询时可以快速定位到数据行;外键一般关联的是另一个表的主键,所以在多表查询时也可以快速定位。】
2.在order by 或 group by 或 count/max 后面的字段(分组字段或排序字段或统计字段)建立索引
3.数据量超过300w时应该建立索引
4.索引应该建在小字段上【占用存储空间少的字段更适合选作索引的关键字,例如,与字符串相比,整型字段占用的存储空间较少,因此整型较为适合选作索引。】
5.较长的字符串则使用前缀索引,定义合适的长度,就可以节省空间又不用额外增加太多的查询成本。
6.存储空间固定的字段更适合选作索引的关键字。【与 text 类型的字段相比,char 类型的字段较为适合选作索引关键字。】
7.经常与其他表进行连接的表的字段,应该在该连接字段上建立索引【左连接,右表加索引;同理:右连接,左表加索引;解释:小表驱动大表】
8.经常出现在where子句中的字段应该建立索引,特别是大表字段(频繁作为查询条件的字段)
9.索引应建立在选择性较高(离散度)的字段(索引不重复的值和表记录数N的比值,范围从1/N 到 1 ,比如性能最高的唯一索引的选择性是 1)
10.尽量地扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,则只要修改原来的索引即可(修改为复合索引,不要新增)
11.复合索引在建立时应该具体分析,尽量用单字段索引替代
1)、正确选择复合索引中的主列(靠近左边的字段),一般是选择性较好的字段;
2)、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
3)、如果复合索引中包含的字段经常单独出现在Where子句,则分解为多个单字段索引;
4)、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
5)、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引。
不应该建立索引的字段规则
1.不应该在字段比较长的字段上建立索引,因为会消耗大量的空间
2.对于频繁更新、插入的字段应该少建立索引,因为在修改和插入之后,数据库会去维护索引,会消耗资源
3.尽量少在无用字段上建立索引【where条件中用不到的字段】
4.表记录太少不应该创建索引(少于300w)
5.数据重复且分布平均的表字段不应该创建索引【选择性太低,例如性别、状态、真假值等字段】
6.参与列计算的列不适合建索引【保持列"干净",比如from_unixtime(create_time) = '2014-05-29'就不能使用到索引,原因是b+树中存的都是数据表中的字段值,但进行检索时需要把所有元素都应用函数才能比较,显然成本太大,所以语句应该写成create_time = unix_timestamp('2014-05-29')】
Mysql - 索引失效的原因
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」