Mysql不止CRUD,聊聊索引( 二 )
创建一个简单的表:
CREATE TABLE my_test (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(50) DEFAULT NULL,`sex` varchar(5) DEFAULT NULL,`address` varchar(100) DEFAULT NULL,`birthday` datetime NOT NULL,`user_num` int(11) unique,PRIMARY KEY (`id`),index(username));
show index from my_test;
文章插图
明明在建表的时候只创建了一个索引 , 查询出来的有三个 , 其实主键 , 唯一约束列 , 外键这些都自动会生成索引 , 至于外键大家可以去尝试下 。
上表格中各个列的说明:
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 也可以在内存中容纳更多的值 。 这样就增加了找到行而不用读取索引中较多块的可能性 。
推荐阅读
- 小米无缘手机好评榜!不止小米11!看来卢伟冰有一句话说错了
- 不止有Mate40,另一张“底牌”也被曝光,华为也是迫不得已
- 不止业务合作而是“全面支持”获富士康支持拜腾“重回赛道”
- 打乱全球供应链!每年损失千亿?美对华芯片封锁的后果不止这些
- 华为P50战斗不止,6.1英寸小屏+联发科5nm芯片,支持吗
- 手机手电筒不止是能照明,其实还有很多隐藏功能
- 基于Spring+Angular9+MySQL开发平台
- 不止32核 苹果自研ARM芯片或将达到64核
- 手机行业将迎“变革”?华为P50消息流出,不止有鸿蒙
- 不止玩游戏!肯德基也要出主机:还能做烤鸡?