加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

面试官出的MySQL索引问题,这篇文章全给你解决!

发布时间:2019-10-13 13:35:57 所属栏目:MySql教程 来源:欧阳思海
导读:0 前言 这篇文章不会讲解索引的基础知识,主要是关于MySQL数据库的B+树索引的相关原理,里面的一些知识都参考了MySQL技术内幕这本书,也算对于这些知识的总结。对于B树和B+树相关的知识,可以参考我的这篇博客:面试官问你B树和B+树,就把这篇文章丢给他 1

如果想要查看表中的索引信息,可以使用命令SHOW INDEX,下面的例子,我们查看表table_index的索引信息。

  1. SHOW INDEX FROM table_indexG; 

面试官出的MySQL索引问题,这篇文章全给你解决!

得到上面的信息,上面的信息什么意思呢?我们逐一介绍!

  •  step4:删除索引

直接删除索引方式

  1. DROP INDEX idx_a ON table_index; 

修改表结构时删除索引

  1. ALTER TABLE table_index DROP INDEX idx_b; 

1.5 Cardinality关键字解析

在上面介绍了那么多个关键字的意思,但是Cardinality这个关键字非常的关键,优化器会根据这个值来判断是否使用这个索引。在B+树索引中,只有高选择性的字段才是有意义的,高选择性就是这个字段的取值范围很广,比如姓名字段,会有很多的名字,可选择性就高了。

一般来说,判断是否需要使用索引,就可以通过Cardinality关键字来判断,如果非常接近1,说明有必要使用,如果非常小,那么就要考虑是否使用索引了。

需要注意的一个问题时,这个关键字不是及时更新的,需要更新的话,需要使用ANALYZE TABLE,例如。

  1. analyze table table_index; 

面试官出的MySQL索引问题,这篇文章全给你解决!

因为目前没有数据,所以,你会发现,这个值一直都是0,没有变化。

面试官出的MySQL索引问题,这篇文章全给你解决!

InoDB存储引擎Cardinality的策略

在InnoDB存储引擎中,这个关键字的更新发生在两个操作中:insert和update。但是,并不是每次都会更新,这样会增加负荷,所以,对于这个关键字的更新有它的策略:

  •  表中1/16的数据发生变化
  •  InnoDB存储引擎的计数器stat_modified_conter>2000000000

默认InnoDB存储引擎会对8个叶子节点进行采样,采样过程如下:

  •  B+树索引中叶子节点数量,记做A
  •  随机取得B+树索引中的8个叶子节点。统计每个页不同的记录个数,分别为p1-p8
  •  根据采样信息得到Cardinality的预估值:(p1+p2+p3+...+p8)*A/8

因为随机采样,所以,每次的Cardinality值都是不一样的,只有一种情况会一样的,就是表中的叶子节点小于或者等于8,这时候,怎么随机采样都是这8个,所以也就一样的。

1.6 Fast Index Creation

在MySQL 5.5之前,对于索引的添加或者删除,每次都需要创建一张临时表,然后导入数据到临时表,接着删除原表,如果一张大表进行这样的操作,会非常的耗时,这是一个很大的缺陷。

InnoDB存储引擎从1.0.x版本开始加入了一种Fast Index Creation(快速索引创建)的索引创建方式。

这种方式的策略为:每次为创建索引的表加上一个S锁(共享锁),在创建的时候,不需要重新建表,删除辅助索引只需要更新内部视图,并将辅助索引空间标记为可用,所以,这种效率就大大提高了。

1.7 在线数据定义

MySQL5.6开始支持的在线数据定义操作就是:允许辅助索引创建的同时,还允许其他insert、update、delete这类DM操作,这就极大提高了数据库的可用性。

所以,我们可以使用新的语法进行创建索引:

  1. ALTER TABLE table_name ADD [UNIQUE|FULLLTEXT] INDEX index_name (column(length))  
  2. [ALGORITHM = {DEFAULT|INPLACE|COPY}]  
  3. [LOCK = {DEFAULT|NONE|SHARED|EXLUSIVE}] 

ALGORITHM指定创建或者删除索引的算法

  •  COPY:创建临时表的方式
  •  INPLACE:不需要创建临时表
  •  DEFAULT:根据参数old_alter_table参数判断,如果是OFF,采用INPLACE的方式

LOCK表示对表添加锁的情况

  •  NONE:不加任何锁
  •  SHARE:加一个S锁,并发读可以进行,写操作需要等待
  •  EXCLUSIVE:加一个X锁,读写都不能并发进行
  •  DEFAULT:先判断是否可以使用NONE,如不能,判断是否可以使用SHARE,如不能,再判断是否可以使用EXCLUSIVE模式。

2 B+ 树索引的使用

2.1 联合索引

联合索引是指对表上的多个列进行索引,这一部分我们将通过几个例子来讲解联合索引的相关知识点。

首先,我们先创建一张表以及为这张表创建联合索引。

  1. create table t_index(  
  2. a char(2) not null default '',  
  3. b char(2) not null default '',  
  4. c char(2) not null default '',  
  5. d char(2) not null default ''  
  6. )engine myisam charset utf8; 

创建联合索引

  1. alter table t_index add index abcd(a,b,c,d); 

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读