一 介绍

一般刚开始写代码的时候,是不太会注意索引的,甚至是意识不到sql优化,查询性能的。

一方面索引能极大的提高查询性能,另一方面索引建的过多或不合理,会对应用程序造成影响,所以程序员很有必要了解它!有些开发人员在DBA反馈慢sql的时候,才意识到建索引,甚至觉得是DBA优化的工作,这其实是一个误区,我们应该再一开始设计的时候,根据可能的数据流添加索引。

我们接下来探讨一下Mysql的索引。由于InnoDB支持事物,是很多OLTP应用的首选,而InnoDB支持3种常见索引:

1.B+索引

2.全文索引

3.哈希索引

其中B+索引时最常见也是最有效的关系型数据库索引,而全文索引只支持英文,对中文的分词效果并不好;哈希索引属于数据库InnoDB引擎层面的,用户干预不了

二 数据结构

三 B+索引

数据库中的B+索引时基于B+树的,其实就是B+树在数据库中的实现;其中又分为

聚集索引:

内部是B+树,叶子节点存放所有数据,并且是完整的一整行信息

InnoDB是索引组织表,即表中数据按照主键顺序存放。而聚集索引是按照每张表的主键构造B+树,同时叶子节点存放的即为整张表的行记录数据,也将聚集索引的叶子节点称为数据页。实际上一张表只能有一个聚集索引,而查询优化器页倾向与采用聚集索引,因为能够再B+树叶子节点上直接找到数据。

而且由于B+树是主键排序的,能够很快的进行范围查找。

那可能就有疑惑,如果表沒有主键呢?这就涉及到InnoDB对聚集索引的选择

1.如果有主键,自动选择主键

2.如果无主键,选择第一个唯一非空索引

3.如果1,2都不满足,默认生成一个6字节的隐藏自增序列

辅助索引:

内部是B+树,叶子节点存放所有数据,但不是完整的一整行信息。那么到底存放什么呢,一般辅助索引存放的是主键+索引列的值。比如表t

CREATE TABLE test1(
id int not null,
age int not null,
PRIMARY key (id),
INDEX idx_age(age)
) ENGINE=INNODB CHARSET=utf8

列age有一个辅助索引(普通索引),那么索引上存放的是test1表的主键id值+列age的值。当通过idx_age来查找数据时,InnoDB会遍历索引idx_age并通过叶级别的指针找到主键索引的主键id,然后再通过主键索引找到一个完整的行记录,所以辅助索引查找效率一般比聚集索引低。(也有例外的情况,就是覆盖索引,后面再介绍)

四 索引的管理

方式1:alter table
ALTER TABLE tb_name
ADD {INDEX|KEY} [index_name]
[index_type] (index_col_name,...) [index_option]
ALTER TABLE tb_name
DROP PRIMARY key
| DROP {INDEX|KEY} index_name

看一个例子

首先建一个表test2,不添加任何索引

CREATE TABLE test2(
id INT NOT NULL,
name VARCHAR(255) not null,
age int not null
) ENGINE=INNODB CHARSET=utf8;

添加一个主键索引到id上

ALTER TABLE test2
ADD PRIMARY KEY idx_name (id);

查看一下索引

说明创建成功

删除索引

ALTER TABLE test2
DROP PRIMARY key;
方式2:create /drop index

建表时创建索引

CREATE TABLE test2(
id INT NOT NULL,
name VARCHAR(255) not null,
age int not null,
PRIMARY KEY (id) -- 默认主键索引
) ENGINE=INNODB CHARSET=utf8;
CREATE INDEX idx_name  ON test2(name);

添加联合索引

CREATE INDEX idx_name_age ON test2(name, age);

删除索引

DROP INDEX idx_name ON test2;
索引的查看
SHOW INDEX FROM tb;

查看索引里面会有以下几个属性

Table:索引所在的表名

Non_unique:是否唯一索引,0-是,1-否

Key_name:索引名称,PRIMARY-主键索引,用户可以通过这个名称来drop index

Seq_in_index:列在索引中的位置;对于联合索引idx_name_age,name在前,所以是1,age在后,为2

Column_name:索引的列名称

Collation:列在索引中的存储方式。B+索引是A,Hash索引是NULL

Cardinality:索引中唯一值的数目估计值,这个值应尽可能接近1。这个值很关键!

Sub_part:是否列的部分被索引;如果整个列被索引,为NULL,否则为索引的字符长度。

比如现在建一个索引,只对列name前100索引

CREATE INDEX idx_name  ON test2(name(100));

查看一下索引

发现name列的Sub_part为100了

Packed:关键字如何压缩;无压缩,则为NULL

Null:是否索引的列含有NULL值。

Index_type:索引的类型。InnoDB只支持B+索引,所以都显示BTREE

Comment:注释

如果添加索引是,有注释

CREATE INDEX idx_name  ON test2(name(100)) COMMENT 'name普通索引';

看下索引

五 索引的使用

前面讲了聚集索引,辅助索引,它们是B+索引在数据库的实现与本质,那么怎么去用呢?一般有2种索引方式

联合索引

对表中多个列进行索引,即创建一个索引时,有多个列,比如上面的

CREATE INDEX idx_name_age ON test2(name, age);

现在向表里面插入几条数据

INSERT INTO test2(id,name,age) VALUES(1,'tw',20);
INSERT INTO test2(id,name,age) VALUES(2,'tw',21);
INSERT INTO test2(id,name,age) VALUES(3,'tw',20);
INSERT INTO test2(id,name,age) VALUES(4,'tw',24);

现在创建一个联合索引idx_id_age

CREATE INDEX idx_id_age ON test2(id,age) COMMENT '联合索引';

比如现在有如下sql

SELECT * FROM test2 WHERE
id = xx AND age=xxSELECT * FROM test2 WHERE
id = xx 

查看一下执行计划

会发现在都走了联合索引idx_id_age

但是这个sql

SELECT * FROM test2 WHERE
age = xx

却不能走索引,查看一下执行计划验证下,的确如此?

EXPLAIN SELECT * FROM test2 WHERE
age = 20 

这是为什么呢?因为联合索引是也排序的,内部类似(1,20),(2,21),(3,20),(4,24),数据按(id,age)排序,单个id列也排序,但是单个age列并不排序,因此无法使用到联合索引, 这被称为索引的最左原则,也是面试中很容易问到的

覆盖索引

InnoDB支持覆盖索引,即从辅助索引中就可以取出查询的记录,而不用查询聚集索引。这样的好处是,辅助索引没有存放整行的记录,占用空间更小,可以大大减少IO操作。

所以如果我们要查询主键的一些信息,就可以通过辅助索引,这也是有些Mysql分页优化的常用手段,在大数据下规制limit的一个选择

Mysql索引是什么相关推荐

  1. mysql索引空间太大_MySQL优化索引

    1.  MySQL如何使用索引 索引用于快速查找具有特定列值的行.如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行.表越大,花费越多.如果表中有相关列的索引,MySQL可以快速确 ...

  2. mysql索引教程_MySQL教程96-MySQL索引类型

    索引的类型和存储引擎有关,每种存储引擎所支持的索引类型不一定完全相同.MySQL 索引可以从存储方式.逻辑角度和实际使用的角度来进行分类. 存储方式区分 根据存储方式的不同,MySQL 中常用的索引在 ...

  3. mysql 树形结构_再读MySQL索引-《高性能MySQL》索引手记

    最近工作中经常和MySQL打交道,当数据量小的时候,不同查询方式以及是否使用索引并无大碍,当数据量随着业务的成长急剧加速时,索引的重要性不言而喻. 本篇文章以<高性能MySQL>中的索引章 ...

  4. MySQL索引背后的数据结构及算法原理【转】

    http://blog.codinglabs.org/articles/theory-of-mysql-index.html MySQL索引背后的数据结构及算法原理[转] 摘要 本文以MySQL数据库 ...

  5. mysql 索引合并

    索引合并是mysql底层为我们提供的智能算法.本文就介绍了mysql 索引合并的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 索引合并是mysql底层为我们提 ...

  6. mysql中groupby会用到索引吗_开发人员不得不知的MySQL索引和查询优化

    本文主要总结了工作中一些常用的操作及不合理的操作,在对慢查询进行优化时收集的一些有用的资料和信息,本文适合有 MySQL 基础的开发人员. 索引相关 索引基数 基数是数据列所包含的不同值的数量,例如, ...

  7. mysql索引底层实现原理_mysql的索引底层之实现原理

    MySQL索引背后的数据结构及算法原理 一.定义 索引定义:索引(Index)是帮助MySQL高效获取数据的数据结构. 本质:索引是数据结构. 二.B-Tree m阶B-Tree满足以下条件: 1.每 ...

  8. 不会MySQL索引,面试官让回家等通知!

    " 你是不是对于 MySQL 索引的知识点一直都像大杂烩,好像什么都知道,如果进行深究的话可能一个也答不上来. 假如你去面试,面试官让你聊一下对索引的理解,然而你对索引的理解仅限于,检索数据 ...

  9. ElasticSearch 索引 VS MySQL 索引

    前言 这段时间在维护产品的搜索功能,每次在管理台看到 elasticsearch 这么高效的查询效率我都很好奇他是如何做到的. 这甚至比在我本地使用 MySQL 通过主键的查询速度还快. 为此我搜索了 ...

  10. mysql索引排序算法_MySQL中利用索引对数据进行排序的基础教程

    MySQL中,有两种方式生成有序结果集:一是使用filesort,二是按索引顺序扫描.利用索引进行排序操作是非常快的,而且可以利用同一索引同时进行查找和排序操作.当索引的顺序与ORDER BY中的列顺 ...

最新文章

  1. Unbutu下安装mysql服务并允许远程登录
  2. 卷积核个数和输入输出通道数的关系
  3. 如何把文件模版上传到SAP数据库层.
  4. 网管交换机和非网管交换机有什么区别?
  5. 在Google使用Borg进行大规模集群的管理 5-6
  6. Redis基础(四)——持久化
  7. Chapter 4 Invitations——10
  8. 大学英语 unit 2 第五题
  9. java中socket学习_java的socket学习
  10. mv单位是什么意思_mv单位(mv是什么意思单位)
  11. V4L2- Memory
  12. 一台“真正的”网吧电影服务器只要6000元
  13. 你一事无成,还在那里傻乐
  14. Nginx下同域部署多个Vue项目(history路由模式),报404、500错误
  15. 缓解 WPF 应用程序中的空域问题
  16. 安全系列之——数据传输的完整性、私密性、源认证、不可否认性
  17. Win10 21H2 19044+vs2019 WDK驱动开发,错误 MSB8040缓解Spectre 漏洞的库以及输出SXS.DLL的垃圾信息
  18. unity lua C# 这边 new 了一个GameObject 对象并发给Lua那边, 这时C# 这边在通过GC释放掉这个对象;lua 那边会报错;遇到这种问题的解决方案
  19. 一个失职妈妈的悔过书
  20. 数据分析实战项目-用户行为分析(Python)

热门文章

  1. ipad怎样和计算机连接网络,ipad怎么连接电脑教程 ipad怎么和电脑连接【详细步骤】...
  2. 《Outlook时间整理术》一第1章 在电子邮件泛滥狂潮中屹立
  3. 使用 OLE/COM 对象查看器
  4. 【求职】搜狗 Java 方向面经
  5. java进阶Kafka集群实战之原理分析及优化教程全在这里
  6. 智能手机之双卡双待(续)
  7. python初学之人机猜拳游戏
  8. 哪种餐饮管理软件比较好?
  9. 如何将数字转换成英语
  10. PX4位置控制offboard模式说明