在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
本文实例讲述了mysql索引基数概念与用法。分享给大家供大家参考,具体如下: Cardinality(索引基数)是mysql索引很重要的一个概念 索引基数是数据列所包含的不同值的数量。例如,某个数据列包含值1、2、3、4、5、1,那么它的基数就是5。索引的基数相对于数据表行数较高(也就是说,列中包含很多不同的值,重复的值很少)的时候,它的工作效果最好。如果某数据列含有很多不同的年龄,索引会很快地分辨数据行。如果某个数据列用于记录性别(只有”M”和”F”两种值),那么索引的用处就不大。如果值出现的几率几乎相等,那么无论搜索哪个值都可能得到一半的数据行。在这些情况下,最好根本不要使用索引,因为查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描。惯用的百分比界线是”30%” 另一个概念叫做索引选择性 索引选择性=索引基数/数据总数,基数可以通过“show index from 表名”查看。 这里是我自己的一张表,数据量并不高,只是为了测验索引选择性 select * from articles id 标题 姓名 15 Title 0 大熊 16 Title 1 大熊 17 Title 2 大熊 18 Title 3 大熊 19 Title 4 大熊 20 Title 5 大熊 21 Title 6 大熊 22 Title 7 大熊 23 Title 8 二熊 24 Title 9 二熊 id为默认整型自增主键 现在增加author列为索引并查看articles表的所有索引 ALTER TABLE `articles` ADD INDEX (`author`) SHOW INDEX FROM articles table non_unique key_name seq_in_index column_name collation cardinality sub_part packed null index_type articles 0 PRIMARY 1 id A 10 NULL NULL BTREE articles 1 author 1 author A 2 NULL NULL BTREE 说下各个字段的意义
可以看到,表articles已经有两个索引了 id索引不包含重复词 为主键 列名id 升序排列 索引基数为10 没有部分索引 没有压缩 不含null 存储方式为btree author索引包含重复词 索引名author 列名author 升序排列 索引基数为2 没有部分索引 没有压缩 不含null 存储方式为btree 根据索引选择性的算法,id索引选择性为10/10 =1 author索引选择性为2/10=0.2, 下面咱们测试一下,使用explain看一下语句分析 explain select * from articles where id = 15 id select_type table partitions type possible_keys key key_len ref rows filtered extra 1 SIMPLE articles NULL const PRIMARY PRIMARY 4 const 1 100.00 NULL 这边再说一下explain这个命令 explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。说一下每个字段的意义 1.id SELECT识别符。这是SELECT查询序列号。这个不重要,查询序号即为sql语句执行的顺序 2.select_type select类型 2.1.SIMPLE 进行不需要Union操作或不含子查询的简单select查询时,响应查询语句的select_type 即为simple,无论查询语句是多么复杂,执行计划中select_type为simple的单位查询一定只有一个 3.table 表名 4.type 连接类型,有多个参数,先从最佳类型到最差类型介绍 也是本篇的重点 4.1 const,表最多有一个匹配行,const用于比较primary key 或者unique索引。因为只匹配一行数据,所以很快,也可以理解为最优化的索引,常数查找 5.possible_keys 提示使用哪个索引会在该表中找到行,不太重要 6.keys 指明MYSQL查询使用的索引 7.key_len MYSQL使用的索引长度 8.ref 显示使用哪个列或常数与key一起从表中选择行 9.rows 显示MYSQL执行查询的行数,数值越大越不好,说明没有用好索引 10.Extra 该列包含MySQL解决查询的详细信息 可以看到 id查询 使用了id索引 简单查询 查询类型为最优的常量查询 explain select * from articles where author = "大熊" 1 SIMPLE articles NULL ALL author NULL NULL NULL 10 80.00 Using where 可以很清楚的看到 使用了author索引 简单查询 查询类型为最差的全表扫描 explain select * from articles where author = "二熊" 1 SIMPLE articles NULL ref author author 1022 const 2 100.00 NULL 可以看到这次的查询类型为ref 也就是说,因为作者为大熊的数据行数,超过了总数据的百分之30 所以mysql认为全表扫描比使用索引更快 更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL索引操作技巧汇总》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》及《MySQL数据库锁相关技巧汇总》 希望本文所述对大家MySQL数据库计有所帮助。 |
请发表评论