当前位置: 首页 > news >正文

(六十五)大白话设计索引的时候,我们一般要考虑哪些因素呢?(中)

今天我们继续来说一下,在设计索引的时候要考虑哪些因素。之前已经说了,你设计的索引最好是让你的各个where、order by和group by后面跟的字段都是联合索引的最左侧开始的部分字段,这样他们都能用上索引。

但是在设计索引的时候还得考虑其他的一些问题,首先一个就是字段基数问题,举个例子,有一个字段他一共在10万行数据里有10万个值对吧?结果呢?这个10万值,要不然就是0,要不然就是1,那么他的基数就是2,为什么?因为这个字段的值就俩选择,0和1。

假设你要是针对上面说的这种字段建立索引的话,那就还不如全表扫描了,因为你的索引树里就仅仅包含0和1两种值,根本没法进行快速的二分查找,也根本就没有太大的意义了,所以这种时候,选用这种基数很低的字段放索引里意义就不大了。

其次的话,你尽量是对那些字段的类型比较小的列来设计索引,比如说什么tinyint之类的,因为他的字段类型比较小,说明这个字段自己本身的值占用磁盘空间小,此时你在搜索的时候性能也会比较好一点。

不过当然了,这个所谓的字段类型小一点的列,也不是绝对的,很多时候你就是要针对varchar(255)这种字段建立索引,哪怕多占用一些磁盘空间,那你也得去设计这样的索引,比较关键的其实还是尽量别把基数太低的字段包含在索引里,因为意义不是太大。

那当然了,万一要是你真的有那种varchar(255)的字段,可能里面的值太大了,你觉得都放索引树里太占据磁盘空间了,此时你仔细考虑了一下,发现完全可以换一种策略,也就是仅仅针对这个varchar(255)字段的前20个字符建立索引,就是说,对这个字段里的每个值的前20个字符放在索引树里而已。

此时你建立出来的索引其实类似于KEY my_index(name(20),age,course),就这样的一个形式,假设name是varchar(255)类型的,但是在索引树里你对name的值仅仅提取前20个字符而已。

此时你在where条件里搜索的时候,如果是根据name字段来搜索,那么此时就会先到索引树里根据name字段的前20个字符去搜索,定位到之后前20个字符的前缀匹配的部分数据之后,再回到聚簇索引提取出来完整的name字段值进行比对就可以了。

但是假如你要是order by name,那么此时你的name因为在索引树里仅仅包含了前20个字符,所以这个排序是没法用上索引了!group by也是同理的。所以这里大家要对前缀索引有一个了解。

好了,同学们,今天给大家重点讲了索引字段的基数和前缀索引的知识,大家就记住两点,对于那种字段基数很低的列尽量别包含到索引里去,没多大用;

另外就是对于那种比较长的字符串类型的列,可以设计前缀索引,仅仅包含部分字符到索引树里去,where查询还是可以用的 ,但是order by和group by就用不上了。

http://www.lryc.cn/news/35533.html

相关文章:

  • Spring事务管理
  • 数字化工厂装配线生产管理看板系统
  • vxe-grid 全局自定义filter过滤器,支持字典过滤
  • ECharts 环形图组件封装
  • c++ 怎么调用python 提供的函数接口
  • 【动态规划】背包问题(01背包,完全背包)
  • 记录 UE5 完全重新构建 UE C++项目
  • java版云HIS系统源码 微服务架构支持VUE
  • 苹果内购支付检验错误码
  • day27_css
  • 智慧赋能,聚力开源——第四届OpenI/O 启智开发者大会开源治理专场顺利举办!
  • Java工程师应该如何成长?
  • 【数据分析师求职面试指南】必备编程技能整理之Hive SQL必备用法
  • Maven - Linux 服务器 Maven 环境安装与测试
  • 5G模块可以注册到4G,不能注册到5G;SIM卡接到5G手机是可以注册到5G网络的?
  • 宝塔webhook自动化打包vue项目时,npm不生效问题
  • 嵌入式 Linux进程间通信之信号量
  • 谷粒学院开发(一):基础准备
  • Photoshop如何安装ZXP扩展插件?
  • c++面试技巧-基础篇4
  • openEuler用户软件仓(EUR)介绍
  • MySQL的图形化界面开发工具DataGrip的下载安装
  • Azure Portal 访问安全性增强
  • mysql安全值守数据库常用语句
  • CSS快速入门
  • emq-docker安装配置
  • Bean三种实例化方式的底层原理
  • java25种设计模式之适配器模式
  • 【微服务】—— 初识微服务
  • Unity使用webSocket与服务器通信(二)——C#服务器端使用Fleck时的简单服用方法