数据库索引本质上是一种数据结构(存储结构+算法),目的是为了加快数据检索速度。

1、索引的类型(待完善)

主键索引:给表设置主键,这个表就拥有主键索引。

唯一索引:unique

普通索引:增加某个字段的索引,比如用户表根据用户名查询。

组合索引:使用多个字段创建索引,遵循最左原则,比如创建索引(col1 + col2 + col3),相当于创建了(col1)、(col1,col2)、(col,col2,col3)三个索引。

全文索引:

2、聚簇索引与非聚簇索引(待完善)

MySQL的InnoDB主键使用的是聚簇索引,MyISAM 不管是主键索引,还是二级索引使用的都是非聚簇索引。

非聚簇索引(右图),表数据和索引是分成两部分进行存储,主键索引和二级索引存储上没有任何区别。使用B+树作为索引的存储结构,所有的节点都是索引,叶子节点存储的是索引+索引对应的记录的地址。

聚簇索引(左图),表数据和主键一起存储的,主键索引的叶结点存储行数据(包含主键值),二级索引的叶结点存储行的主键值。使用B+树作为索引的存储结构,非叶子节点都是索引关键字,但非叶子节点中的关键字中不存储对应记录的具体内容或内容地址。叶子节点上的数据是主键与具体记录(数据内容)。

聚簇索引优点:

①当需要取出一定范围内的数据时,用聚簇索引比用非聚簇索引好。
②当通过聚簇索引查找目标数据时理论上比非聚簇索引要快,因为非聚簇索引定位到对应主键时还要多一次目标记录寻址,即多一次I/O

聚簇索引缺点:

①插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键。
②更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。
③二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据。
二级索引的叶节点存储的是主键值,而不是行指针(非聚簇索引存储的是指针或者说是地址),这是为了减少当出现行移动或数据页分裂时二级索引的维护工作,但会让二级索引占用更多的空间。
④采用聚簇索引插入新值比采用非聚簇索引插入新值的速度要慢很多,因为插入要保证主键不能重复,判断主键不能重复,采用的方式在不同的索引下面会有很大的性能差距,聚簇索引遍历所有的叶子节点,非聚簇索引也判断所有的叶子节点,但是聚簇索引的叶子节点除了带有主键还有记录值,记录的大小往往比主键要大的多。这样就会导致聚簇索引在判定新记录携带的主键是否重复时进行昂贵的I/O代价。

3、索引实践(待完善)

#创建班级表
CREATE TABLE class
(
pid INTEGER not null AUTO_INCREMENT,
class_code VARCHAR(200) not null,
class_name VARCHAR(200) not null,
created_by VARCHAR(200),
created_date DATE,
updated_by VARCHAR(200),
updated_date DATE,
CONSTRAINT pk_class_pid PRIMARY KEY(pid)
);

#插入数据
insert into stu.class (class_code,class_name,created_by,created_date,updated_by,updated_date)
values
( '1-001', '一年级1班','system', NOW(),'system',NOW()),
( '1-002', '一年级2班','system', NOW(),'system',NOW()),
( '2-001', '二年级1班','system', NOW(),'system',NOW()),
( '2-002', '二年级2班','system', NOW(),'system',NOW());

#使用主键索引

EXPLAIN
select * from class where pid = 2;

#创建普通索引

CREATE INDEX idx_class_class_code ON class(class_code);
#使用索引
EXPLAIN
select * from class where class_code = '2-001';

#创建组合索引

CREATE INDEX idx_class_class_code_name ON class(class_code,class_name);
#使用索引
EXPLAIN
select * from class where class_code = '2-001' and class_name = '一年级2班';
#使用索引,组合索引所有字段与顺序无关
EXPLAIN
select * from class where class_name = '一年级2班' and class_code = '2-001';

#组合索引只使用第一个字段时,索引可生效

#删除索引
DROP INDEX idx_class_class_code ON class;

EXPLAIN
select * from class where class_code = '2-001';

 #未使用索引,遵循最左原则

EXPLAIN
select * from class where class_name = '一年级2班';

#创建唯一索引

CREATE UNIQUE INDEX idx_uq_class_class_code ON class(class_code);
#删除已有的组合索引
DROP INDEX idx_class_class_code_name ON class;
#使用唯一索引
EXPLAIN
select * from class where class_code = '2-001';

MySQL索引实践的更多相关文章

  1. MySQL 索引最佳实践

    原文请关注 这里 这是 文章 的翻译,在翻译过程中,会对其中涉及到的语句加上一些个人理解以及 SQL 语句的执行,并进行特别的标注. 1. 你做了一个很棒的选择,因为: 对于普通开发者和 DBA,理解 ...

  2. mysql索引最佳实践

    索引最佳实践使用的表CREATE TABLE `employees` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(24) NOT ...

  3. Mysql索引最佳实践笔记0524

    #mysql5.7 innodb默认存储引擎 一.关于索引二.最佳实践三.避坑实践 一.关于索引 1.索引的作用 -提高查询效率 -数据分组.排序 -避免回表查询 -优化聚集查询 -用于多表join关 ...

  4. [译] MYSQL索引最佳实践

    近日整理文档时发现多年前的这个文档还是蛮实用的,然后在网络搜索了一下并没有相关的译文,所以决定把它翻译过来,如有不当的地方请多包涵和指正.原文地址:https://www.percona.com/fi ...

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

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  6. [转]MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  7. MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  8. [纯干货] MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  9. MySQL 索引背后的数据结构及算法原理

    本文转载自http://blog.jobbole.com/24006/ 摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引 ...

随机推荐

  1. 开始写博客的第一天,如何用c实现“hello wolrd”

    “hello world” 应该是大多数人学习的第一个代码 那也就作为我第一篇博客的开端吧 实现的代码如下 #include <stdio.h> int main() { printf(& ...

  2. 【Linux学习】【第一节】【vi命令】

    在linux下操作文件,通常会用到vi命令,现对其常用命令进行总结. 基本上vi/vim共分为三种模式,分别是命令模式.输入模式和底线命令模式,三者之间的关系如图所示. 一.移动光标的方法 (1)上下 ...

  3. ssh别名登录,非常适合从跳板机登录其他主机

    一般连主机会是这样的: ssh admin@IP 端口变了的话还要加上端口号 ssh admin@IP -p 10022 可以用ssh别名简化这个操作: vim .ssh/config 想要全局生效的 ...

  4. spark机器学习从0到1协同过滤算法 (九)

      一.概念 协同过滤算法主要分为基于用户的协同过滤算法和基于项目的协同过滤算法.   基于用户的协同过滤算法和基于项目的协同过滤算法 1.1.以用户为基础(User-based)的协同过滤 用相似统 ...

  5. git init 后关联github仓库是发生错误:

    : failed to push some refs to 'git@github.com:AlanKnightly/reactC.git'hint: Updates were rejected be ...

  6. Python的逻辑结构和函数

    1.Python中的逻辑结构 ①顺序执行 ②选择执行: if...elif...else... 没有switch..case.. ③循环执行: for...in... while... 没有do..w ...

  7. Adaboost原理及相关推导

    提升思想 一个概念如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么,这个概率是强可学习的.一个概念如果存在一个多项式的学习算法能够学习它,并且学习的正确率仅比随机猜测略好,那么,这个概念是 ...

  8. asp中设置session过期时间方法总结

    http://www.jb51.net/article/31217.htm asp中设置session过期时间方法总结 作者: 字体:[增加 减小] 类型:转载   asp中默认session过期时间 ...

  9. JSP知识点回顾

  10. Vue踩坑日记

    1.错误:找不到模块'eslint-config-standard' https://github.com/standard/eslint-config-standard/issues/84 我遇到了 ...