我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL的show index 选择率

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL的show index 选择率

show index from tbl_name\G;

里面的每个字段信息各代表什么呢?

DROP TABLE IF EXISTS t;

CREATE TABLE t(

a  int not null,

b varchar(2000) ,

c int not null,

d int,

e varchar(200),

primary key(a),

key idx_b(b),

key idx_c(c),

key idx_c_b(c,b),

unique key(d),

key idx_e(e(10))

)engine=innodb;


mysql>show index from t;

+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |

+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

| t     |          0 | PRIMARY  |            1 | a           | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |

| t     |          0 | d        |            1 | d           | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |

| t     |          1 | idx_b    |            1 | b           | A         |           0 |      191 | NULL   | YES  | BTREE      |         |               |

| t     |          1 | idx_c    |            1 | c           | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |

| t     |          1 | idx_c_b  |            1 | c           | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |

| t     |          1 | idx_c_b  |            2 | b           | A         |           0 |      191 | NULL   | YES  | BTREE      |         |               |

| t     |          1 | idx_e    |            1 | e           | A         |           0 |       10 | NULL   | YES  | BTREE      |         |               |

+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

7 rows in set (0.00 sec)



#说明

TABLE:索引所在的表名

Non_unique:非唯一的索引,必须要唯一, 例如上面定义到主键a,unique d   都是显示是0

Key_name:索引的名字

Seq_in_index:索引中该列的位置,如idx_c_b 的联合索引

Column_name:索引列的名称

Collation:列是以什么方式存在在索引中索引中的,可以是A或是NULL,B+树索引总是A,即是排序的。如果使用了Heap存储引擎,并且建立了Hash索引,这里就会显示NULL了

          因为Hash根据hash桶存放索引数据的,而不是对数据进行排序。

Cardinalilty:这个值非常关键,表示索引中唯一值的数目的估计值。Cardinality表的行数应尽可能接近1(为什么?怎么计算这个值?),下面会对这个字段进行详细的说明:

Sub_part:是否是列的部分索引,例如上面的idx_e就显示10,表示只对e列的前10个字符进行索引。如果索引整个列,则该字段为NULL。(idx_b,idx_c_b为什么只索引191个呢?)

Packed:关键字如何被压缩。若没有,则显示为NULL

Null:是否索引的列含有NULL值,例如看到的idx_b,就表示可以有NULL值,所以显示YES,而主键和定义了c列就不允许有NULL值

Index_type:索引的类型,InnoDB存储引擎只支持B+树索引,所以这里显示的都是BTREE。

Comment:注释

Index_comment:索引注释


////////////////////////////////////////

Cardinalilty:因为单词的意思为:基数、基准的意思

 并不是在所有的查询条件中出现的列都需要添加索引,对于什么时候添加B+树索引,一般情况下,在访问表中很少的一部分数据时使用B+树索引才有意义。对于性别字段、地区字段、

类型字段,它们可取值的范围很小,成为低选择性。

e.g:

select * from stu where sex='F';

按性别进行查询时,可取值的范围一般只有'M','F'。因此上述得到结果可能是表50%的数据。这时添加索引完全没有必要。

相反,如果某个字段的取值范围比较广,几乎没有重复,即属于高选择性,则使用索引比较合适。

那怎么样看索引是否有高选择率呢?

一是通过show index结果中的列Cardinalilty来观察,此值表示索引中不重复记录数量的预估值(是通过采用来进行计算的),这个值不是一个精确值。Cardinalilty/table_row_counts尽可能的接近1


InnoDB存储引擎内部对更新Cardinalilty信息的策略为:

1.表中1/16的数据已发生变化就需要更新信息

2.stat_modified_counter>2 000 000 000 (20亿)

也是就是当计数器stat_modified_counter发生变化的次数大于20亿时,需要更新Cardinalilty信息。


第二种方法可以用SQL语句来进行计算是否是高选择率:

DROP TABLE IF EXISTS t_car;

CREATE TABLE t_car(

id BIGINT NOT NULL AUTO_INCREMENT ,

mem_id BIGINT NOT NULL,

status TINYINT(1),

dept_no INT NOT NULL,

PRIMARY KEY(id),

KEY idx_mem_id(mem_id),

KEY idx_status(status),

KEY idx_dept_no(dept_no)

)ENGINE=innodb;


insert into t_car values(NULL,1,1,101);

insert into t_car values(NULL,2,0,102);

insert into t_car values(NULL,3,1,103);

insert into t_car values(NULL,4,1,104);

insert into t_car values(NULL,5,0,105);

insert into t_car values(NULL,6,1,106);

insert into t_car values(NULL,7,1,107);

insert into t_car values(NULL,8,0,108);

insert into t_car values(NULL,9,1,109);

insert into t_car values(NULL,10,1,110);


insert into t_car

select NULL,id,status,dept_no from t_car;   -- 多多执行几次


mysql>select count(*) from t_car;

+----------+

| count(*) |

+----------+

|    20480 |

+----------+

1 row in set (0.10 sec)




mysql>update t_car set mem_id=id;

Query OK, 20460 rows affected (3.43 sec)

Rows matched: 20480  Changed: 20460  Warnings: 0


mysql>show index from t_car;

+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

| Table | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |

+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

| t_car |          0 | PRIMARY     |            1 | id          | A         |       20108 |     NULL | NULL   |      | BTREE      |         |               |

| t_car |          1 | idx_mem_id  |            1 | mem_id      | A         |       20108 |     NULL | NULL   |      | BTREE      |         |               |

| t_car |          1 | idx_status  |            1 | status      | A         |       10054 |     NULL | NULL   | YES  | BTREE      |         |               |

| t_car |          1 | idx_dept_no |            1 | dept_no     | A         |       20108 |     NULL | NULL   |      | BTREE      |         |               |

+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

4 rows in set (0.00 sec)



root@localhost[zjkj]:04:07:14>select count(distinct(id))/count(*) as id_select,count(distinct(status))/count(*) as status from t_car;

+-----------+--------+

| id_select | status |

+-----------+--------+

|    1.0000 | 0.0001 |

+-----------+--------+

1 row in set (0.16 sec)


#说明id列的选择率较高,适合建立索引,而status列选择性较低,因此status列上不适合建立索引。

这也是为什么Cardinality表的行数应尽可能接近1越好的缘故了。


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL的show index 选择率

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Oracle Index函数与查询计划的选择

在Oracle数据库中,索引(Index)是一种用于加快查询速度的数据结构。当执行查询时,Oracle会根据查询条件和已有的索引来选择合适的查询计划,以尽可能快地返回结果。Oracle会通过查询优化器来选择最佳的查询计划,其中索引的使用是
Oracle Index函数与查询计划的选择
2024-08-16

使用关系型选择器优化CSS选择器:提升选择效率的技巧

优化CSS选择器:如何使用关系型选择器提高选择效率引言:在前端开发中,CSS选择器是一个非常重要的概念。它用来为HTML元素添加样式,控制页面的外观和布局。然而,在大型项目中,优化CSS选择器的效率显得尤为重要。本文将介绍如何使用关系型选择
使用关系型选择器优化CSS选择器:提升选择效率的技巧
2023-12-26

Oracle Index函数与数据库的索引选择算法

Oracle Index函数是一个用于创建和管理数据库索引的函数。它可以帮助数据库管理员在数据库中创建索引,以提高查询性能和加速数据访问。Oracle Index函数包括各种类型的索引,如B树索引、位图索引、哈希索引等。数据库索引选择算法
Oracle Index函数与数据库的索引选择算法
2024-08-15

MySQL 时间类型的选择

目录DATETIMETIMESTAMP如何选择如何存储毫秒级时间结语MySQL 提供了 DATETIME 和 TIMESTAMP 两种非常相似的类型处理日期和时间,大部分情况下两种都是 OK 的,但是有些情况二者会互有优劣。 DATETIM
2022-05-29

云服务器怎么选择带宽的内存频率

云服务器的带宽是一个很有意思的话题,因为不同的云服务器提供商提供的内存频率可能相差很大。以下是一个简单的选择带宽的公式,用于选择您需要的带宽:带宽:服务器内存带宽+服务器硬盘带宽根据这个公式,我们需要选择一个足够大的服务器,并选择足够高的带宽,以满足您的需求。您可以查看云服务器的官方文档,或者咨询该云服务器的供应商,他们会向您推荐一些带宽较高的云服务器提供商,包括亚马逊,谷歌和微软等。选
2023-10-26

MySQL存储引擎在Linux的选择

在MySQL中,存储引擎是用于存储和处理数据的核心组件。在Linux系统中,MySQL支持多种存储引擎,包括InnoDB、MyISAM、MEMORY、CSV等。以下是一些常见的MySQL存储引擎在Linux中的选择建议:InnoDB:Inn
MySQL存储引擎在Linux的选择
2024-08-16

mysql中的字段选择是什么

这篇文章主要讲解了“mysql中的字段选择是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql中的字段选择是什么”吧!说明1、根据实际需要,明确所需字段名称,用英文逗号分隔。2、获
2023-06-20

MySQL库表名大小写的选择

目录1.决定大小写是否敏感的参数2.参数变更注意事项总结:1.决定大小写是否敏感的参数 在 MySQL 中,数据库与 data 目录中的目录相对应。数据库中的每个表都对应于数据库目录中的至少一个文件(可能是多个文件,具体取决于存储引擎)。因
2022-05-27

MySQL 选择合适的存储引擎

对于数据库这一块询问比较多的就是在 MySQL 中怎么去选择一种何时当前业务需求的存储引擎,而 MySQL 中支持的存储引擎又有很多种,那么 MySQL 中分别又有那些,怎么优雅的使用呢? 划分引擎原因 在文件系统中,MySQL 将每个数据
2022-05-24

阿里云服务器功率选择的策略与建议

阿里云作为全球领先的云计算服务提供商,其服务器功率的选择非常重要。选择适当的功率可以保证服务器的稳定运行和数据的安全存储。本文将详细介绍如何根据业务需求选择阿里云服务器的功率,希望能对读者有所帮助。阿里云服务器的功率选择策略:根据业务需求选择:首先,我们需要根据业务的需求来选择阿里云服务器的功率。例如,如果我们的
阿里云服务器功率选择的策略与建议
2023-12-11

低代码工作流提高工作效率的新选择

在数字化时代,许多企业都在寻找更高效的工作方式。其中一种方法是通过使用低代码工作流来实现。低代码工作流是一种基于规则和流程自动化的技术,能够帮助企业实现自动化处理,从而提高工作效率。本文将详细介绍低代码工作流的概念、优势以及如何应用它。一、什么是低代码工作流?低代码工作流是一种基于规则和流程自动化的技术。它利用图
低代码工作流提高工作效率的新选择
2024-01-26

选择正确的numpy版本,提高数据处理效率

选择正确的numpy版本,提高数据处理效率,需要具体代码示例对于数据分析和机器学习的从业者来说,常常需要使用Numpy进行数组计算,因为Numpy拥有快速计算、广播(broadcasting)、索引(indexing)和矢量化运算的特性,
选择正确的numpy版本,提高数据处理效率
2024-01-19

编程热搜

目录