一 介绍

一般刚开始写代码的时候,是不太会注意索引的,甚至是意识不到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. qpython3安装lxml_centos python安装lxml报错
  2. WEB框架原理(socket)
  3. UML用例图间关系说明
  4. ubuntu中mysql操作_uBuntu下安装MySql,及mySql操作!
  5. 论文浅尝 | emrKBQA: 一个面向临床医疗问答的KBQA数据集
  6. 华为(英国)招聘CPU/GPU架构及系统软件工程师
  7. Python使用matplotlib绘制三维曲线
  8. 452A - Eevee 模拟字符串,挺简单的一道题
  9. 乘法逆元 -- 模运算不满足分配律
  10. 李宏毅ML2021 HW3创建pseudo dataset
  11. 保险精算笔记Chapter02
  12. Android计步模块(类似微信运动 今日步数)
  13. 万洲金业:日内黄金价格下跌,关注千八支撑反弹。
  14. 感觉生活一直在退步~
  15. 用nodejs配合python破解X-Ca-Signature,抓取博客积分数据
  16. [BZOJ4084][Sdoi2015]bigyration hash
  17. 初中数学抽象教学的案例_初中数学典型教学案例与反思.doc
  18. NOIP 2014 飞扬的小鸟
  19. STM32-(ADC,DMA,重映射)
  20. 【C++】读取 .csv / .xlsx 文件中的指定数据(非常实用)

热门文章

  1. 机智云、凯立德、赛亿联袂打造物联网LBS生态平台
  2. 什么是金融杠杆?什么是金融泡沫?
  3. [转]2012,写给24岁的自己
  4. 中科协回应提名李彦宏增选院士:贡献在搜索引擎
  5. 从windows到ubuntu--输入法
  6. 基于GoogleAuthenticator的Totp手机宝令功能
  7. 西安华育java_成为Java程序员高手的8个条件
  8. Java学习笔记6.3.4 文件操作 - Path接口和Files工具类
  9. 青铜修炼手册:Axure实现汉字拼音首字母查询(非JS版)
  10. 计算机键盘回车键换行,Win7系统下键盘Enter回车键五大功能介绍