mysql索引基数概念与用法示例

  

本文实例讲述了mysql索引基数概念与用法。分享给大家供大家参考,具体如下:

  

<强>基数(索引基数)是mysql索引很重要的一个概念

  

索引基数是数据列所包含的不同值的数量,例如,某个数据列包含值1,2,3,4,5,1,那么它的基数就是5。索引的基数相对于数据表行数较高(也就是说,列中包含很多不同的值,重复的值很少)的时候,它的工作效果最好。如果某数据列含有很多不同的年龄,索引会很快地分辨数据行。如果某个数据列用于记录性别(只有“M”和“F”两种值),那么索引的用处就不大。如果值出现的几率几乎相等,那么无论搜索哪个值都可能得到一半的数据行。在这些情况下,最好根本不要使用索引,因为查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描。惯用的百分比界线是“30%”

  

<强>另一个概念叫做索引选择性

  

索引选择性=索引基数/数据总数、基数可以通过“显示指数从表名“查看。
  越接近1就越有可能利用索引,也可以理解1为百分百
  高索引选择性的好处就是mysql查找匹配的时候可以过滤更多的行,唯一索引的选择性最佳,值为1 .

  

这里是我自己的一张表,数据量并不高,只是为了测验索引选择性

        从文章选择*   id标题姓名   15 0大标题熊   16标题1大熊   17个标题2大熊   18标题3大熊   19个标题4大熊   20标题5大熊   21标题6大熊   22日标题7大熊   23标题8二熊   24标题9二熊      之前      

id为默认整型自增主键

  

现在增加列作者为索引并查表看文章的所有索引

        ALTER TABLE的文章添加索引(作者)   从文章显示指数   表non_unique key_name seq_in_index column_name排序基数sub_part零index_type包装   文章10空零BTREE 0初级1 id   文章作者1零空BTREE作者2      之前      

<强>说下各个字段的意义

  
      <李>表名李   <李>如果索引不能包括重复词,则为0。如果可以,则为1。   <李>索引名李   <李>索引中的列序列号,从1开始李   <李>列名李   <李>列以什么方式存储在索引中。在MySQLSHOW指数语法中,有值A(升序)或零(无分类)   <李>索引基数   <李>如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为零。   <李>指示关键字如何被压缩。如果没有被压缩,则为零。   <李>如果列含有NULL,则含有是的。如果没有,则该列含有不。   <李>所用索引存储方法(BTREE、全文、散列、RTREE)   
  

可以看到,表文章已经有两个索引了

  

id索引不包含重复词为主键列名id升序排列索引基数为10没有部分索引没有压缩不含零存储方式来为

  

作者索引包含重复词索引名作者列作者名升序排列索引基数为2没有部分索引没有压缩不含零存储方式来为

  

根据索引选择性的算法,id索引选择性为10/10=1作者索引选择性为2/10=0.2,下面咱们测试一下,使用解释看一下语句分析

        从文章解释select * id=15   id select_type表分区类型possible_keys关键key_len ref行额外的过滤   1个简单的文章空const主要主要4 const 1 100.00 NULL      之前      

<强>这边再说一下解释这个命令

  

解释显示了mysql如何使用索引来处理选择语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。说一下每个字段的意义

  

1.选择识别符。这是选择查询序列号。这个不重要,查询序号即为sql语句执行的顺序

  

2.选择类型

  

2.1。进行不需要联盟操作或不含子查询的简单选择查询时,响应查询语句的select_type即为简单,无论查询语句是多么复杂,执行计划中select_type为简单的单位查询一定只有一个
  2.2。一个需要联盟操作或含子查询的选择查询执行计划中,位于最外层的select_type即为初选。与简单一样,select_type为主要的单位选择查询也只存在1个
  2.3。由联盟操作联合而成的单位选择查询中,除第一个外,第二个以后的所有单位选择查询的select_type都为union.union的第一个单位选择的select_type不是联盟,而是派生的。它是一个临时表,用于存储联合(联盟)后的查询结果

mysql索引基数概念与用法示例