Mysql不止CRUD,聊聊索引( 二 )
明明在建表的时候只创建了一个索引 , 查询出来的有三个 , 其实主键 , 唯一约束列 , 外键这些都自动会生成索引 , 至于外键大家可以去尝试下 。
上表格中各个列的说明:
table #表名称non_unique#如果索引不能包括重复词 , 为0 , 如果可以 , 则为1key_name#索引的名称seq_in_index #索引中的列序号column_name#列名称collation#列以什么方式存储在索引中 , 在mysql中 , 有值'A'(升序)或者NULL(无分类)cardinality#索引在唯一值的数据的估值 , 通过运行analyze table xxx_table;或者 myisamchk -a 可以更新 , 技术根据被存储为整数的统计数据来计数 , 所以即使对于小型表 , 该值也没必要是精确的 , 基数越大 , 当进行联合所饮食 , mysql使用该索引的机会越大 。 myisam中 , 该值是准确的 , INNODB中该值数据是估算的 , 存在偏差sub_part#如果列只是部分的编入索引 则为被编入索引的字符的数目 , 如果整列被编入索引 , 则为NULLpacked#指示关键词如何被压缩 , 如果没有被压缩 , 则为NULLNULL#如果列含有NULL , 则含有YES , 如果没有 , 则该列为NOindex_type#用过的索引方法(BTREE,FULLTEXT,HASH,RTREE)comment#备注index_comment#为索引创建时提供了一个注释属性的索引的任何评论
1.2、索引的创建原则
- 索引并非越多越好 , 一个表中如果有大量的索引 , 不仅占用磁盘空间 , 而且会影响INSERT、DELETE、UPDATE等语句的性能 , 因为在表中的数据更改的同时 , 索引也会进行调整和更新
- 避免对经常更新的表进行过多的索引 , 并且索引中的列尽可能少 。 而对经常用于查询的字段应该创建索引 , 但要避免添加不必要的字段 。
- 数据量小的表最好不要使用索引 , 由于数据较少 , 查询花费的时间可能比遍历索引的时间还要短 , 索引可能不会产生优化效果 。
- 在条件表达式中经常用到的不同值较多的列上建立索引 , 在不同值很少的列上不要建立索引 。 比如在学生表的“性别”字段上只有“男”与“女”两个不同值 , 因此就无须建立索引 。 如果建立索引 , 不但不会提高查询效率 , 反而会严重降低数据更新速度 。
- 当唯一性是某种数据本身的特征时 , 指定唯一索引 。 使用唯一索引需能确保定义的列的数据完整性 , 以提高查询速度 。
- 在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引 , 如果待排序的列有多个 , 可以在这些列上建立组合索引 。
- 搜索的索引列 , 不一定是所要选择的列 。 换句话说 , 最适合索引的列是出现在WHERE子句中的列 , 或连接子句中指定的列 , 而不是出现在SELECT关键字后的选择列表中的列 。
- 使用短索引 。 如果对字符串列进行索引 , 应该指定一个前缀长度 , 只要有可能就应该这样做 。 例如 , 有一个CHAR(200)列 , 如果在前10个或20个字符内 , 多数值是唯一的 , 那么就不要对整个列进行索引 。 对前10个或20个字符进行索引能够节省大量索引空间 , 也可能会使查询更快 。 较小的索引涉及的磁盘 IO 较少 , 较短的值比较起来更快 。 更为重要的是 , 对于较短的键值 , 索引高速缓存中的块能容纳更多的键值 , 因此 , MySQL 也可以在内存中容纳更多的值 。 这样就增加了找到行而不用读取索引中较多块的可能性 。
- 利用最左前缀 。 在创建一个n列的索引时 , 实际是创建了MySQL可利用的n个索引 。 多列索引可起几个索引的作用 , 因为可利用索引中最左边的列集来匹配行 。 这样的列集称为最左前缀 。
- 对于InnoDB存储引擎的表 , 记录默认会按照一定的顺序保存 , 如果有明确定义的主键 , 则按照主键顺序保存 。 如果没有主键 , 但是有唯一索引 , 那么就是按照唯一索引的顺序保存 。 如果既没有主键又没有唯一索引 , 那么表中会自动生成一个内部列 , 按照这个列的顺序保存 。 按照主键或者内部列进行的访问是最快的 , 所以InnoDB表尽量自己指定主键 , 当表中同时有几个列都是唯一的 , 都可以作为主键的时候 , 要选择最常作为访问条件的列作为主键 , 提高查询的效率 。 另外 , 还需要注意 , InnoDB 表的普通索引都会保存主键的键值 , 所以主键要尽可能选择较短的数据类型 , 可以有效地减少索引的磁盘占用 , 提高索引的缓存效果
数据制造完成后会有四个数据库:
- 手机|用手机镜头展示丛林秘境,vivo S7带来的不止是高清
- Note9|Redmi Note9 Pro首发体验,原来不止“差评”
- Reno5|通过HDR10+认证!OPPO Reno5惊喜果然不止这几点
- pymysql 连接 MySQL 实现简单登录
- GET|有赞教育负责人胡冰:做教育招生“新基建”不止于工具
- mysql 8.0.21 安装配置方法图文教程
- SpringBoot+MyBatis+MySQL读写分离实现
- 真正福利果粉时刻!iPhone12不止定价合理,续航提升明显
- 详解mysql执行计划
- 什么是MySQL的执行计划(Explain关键字)?