1. 索引

索引在MySQL中也叫"键"或者"key",是存储引擎于快速找到记录的一种数据结构.

索引的数据结构: B+树

B+树性质: 索引字段要尽量小; 索引的最左匹配特性

2. 索引的种类

  1. 聚集索引(primary key)

    聚集索引就是按照每张表的主键构造一颗B+树,同时叶子结点存放的即为整张表的行记录数据,也将聚焦索引的叶子结点称为数据页.

    优点:

    1. 它对主键的排序查找和范围查找速度非常快,叶子节点的数据就是用户所要查询的数据.
    2. 范围查询,即如果要查找主键某一范围内的数据,通过叶子节点的上层中间节点就可以得到页的范围,之后直接读取数据即可.
  2. 辅助索引(普通索引)

    unique key(唯一索引) , index key(普通索引)

    辅助索引的叶子节点不包含行记录的全部数据,存放的是对应的那条数据的字段的值,除了包含键值以外,每个叶子节点中的索引行中还包含一个书签,书签里存放主键的值,该书签用来告诉InnDB存储引擎去哪找到与索引相对应的行数据,如果我们要的数据就是这个键,我们直接就可以在辅助索引的叶子节点找到对应的值,这种称为覆盖索引.如果通过辅助索引的叶子节点不能直接拿到我们想要的数据,需要通过辅助索引的叶子节点中保存的主键的值再去通过聚焦索引来找到完整的一条记录,这种操作称为回表操作.

  3. 联合索引

    primary key(id,name): 联合主键索引

    unique key(id,name): 联合唯一索引

    index(id,name): 联合普通索引

    如果只查id和查id and name key使用联合索引,如果跳过第一个查后面的,无法使用联合索引.

3. 索引的操作

  1. 聚集索引

    添加: 添加索引的时候要注意,给字段里面数据大小比较小的字段添加,给字段里面的数据区分度高的字段添加.
    创建的时候添加:
    create table t1(id int primary key);
    create table t1(id int,primary key(id));
    表创建完之后添加:
    alter table t1 add primary key(id);
    删除主键索引:
    alter table t1 drop primayr key;
  2. 唯一索引

    创建的时候添加:
    create table t1(id int unique);
    create table t1(id int,unique key uni_name(id));
    表创建完之后添加:
    alter table t1 add unique key u_name(id);
    删除主键索引:
    alter table t1 drop index u_name;
  3. 普通索引

    创建的时候添加:
    create table t1(id int,index index_name(id));
    表创建完之后添加:
    alter table t1 add index index_name(id);
    create index index_name on t1(id);
    删除主键索引:
    alter table t1 drop index index_name;
    drop index index_name on t1;

4. 索引的两大类型

  1. hash类型的索引: 查询速度快,范围查询慢
  2. btree类型的索引: b+数,层数越多,数据量指数级增长(InnoDB默认支持)

8.6.5 使用索引注意事项

  1. 范围问题,或者条件不明确,条件中出现这些符号或关键字: > ,< ,>= , <= ,!= ,between...and... ,like

    使用like的时候,通配符写在最前面,也是需要全匹配一遍,然后在比较字符串的第二个字符,最左匹配的规则

  2. 尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越来越少,唯一键的区分度是1,而一些状态,性别字段可能在大数据面前区分度就0,一般需要join的字段我们要求是0.1以上,即平均1条扫描10条记录.

  3. = 和 in 可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,MySQL的查询优化器会帮你优化成索引可以识别的形式

  4. 索引列不能参与计算,保持列"干净"

  5. and / or

1. and 的工作原理
条件:
a = 10 and b = 'xxx' and c > 3 and d = 4
索引:
制作联合索引(d,a,b,c)
对于连续多个and,mysql会按照联合索引,从左到右的顺序找一个区分度高的索引字段,加快查询,即d>a>b>c
2. or 的工作原理
条件:
a = 10 or b = 'xxx' or c > 3 or d = 4
索引:
制作联合索引(d,a,b,c)
对于连续多个or,mysql会按照条件的顺序,从左到右依次判断,即a>b>c>d
  1. 最左前缀匹配原则

    对于组合索引MySQL会一直向右匹配,直到遇到范围查询(> , < , between , like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

MySQL数据库~~~~~索引的更多相关文章

  1. MySQL数据库索引的4大类型以及相关的索引创建

    以下的文章主要介绍的是MySQL数据库索引类型,其中包括普通索引,唯一索引,主键索引与主键索引,以及对这些索引的实际应用或是创建有一个详细介绍,以下就是文章的主要内容描述. (1)普通索引 这是最基本 ...

  2. (转)MySql数据库索引原理(总结性)

    本文引用文章如链接: http://www.codinglabs.org/html/theory-of-mysql-index.html#more-100 参考书籍:Mysql技术内幕 本文主要是阐述 ...

  3. 知识点:Mysql 数据库索引优化实战(4)

    知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 一:插入订单 业务逻辑:插 ...

  4. 为什么MySQL数据库索引选择使用B+树?

    在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使 ...

  5. MySQL数据库索引之B+树

    一.B+树是什么 B+ 树是一种树型数据结构,通常用于数据库和操作系统的文件系统中.B+ 树的特点是能够保持数据稳定有序,其插入与修改操作拥有较稳定的对数时间复杂度.B+ 树元素自底向上插入,这与二叉 ...

  6. 第二百八十八节,MySQL数据库-索引、limit分页、执行计划、慢日志查询

    MySQL数据库-索引.limit分页.执行计划.慢日志查询 索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获 ...

  7. MYSQL数据库索引类型及使用

    MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与组合索引,这里对这些索引的做一些简单描述: (1)普通索引 这是最基本的MySQL数据库索引,它没有任何限制.它有以下几种创建方式: 创建索引 ...

  8. MySQL数据库索引的底层原理(二叉树、平衡二叉树、B-Tree、B+Tree)

    1.MySQL数据库索引的底层原理 https://mp.weixin.qq.com/s/zA9KvCkkte2mTWTcDv7hUg

  9. MySQL数据库索引常见问题

    笔者看过很多数据库相关方面的面试题,但大多数答案都不太准确,因此决定在自己blog进行一个总结. Q1:数据库有哪些索引?优缺点是什么? 1.B树索引:大多数数据库采用的索引(innoDB采用的是b+ ...

  10. 谈谈MySQL数据库索引

    在分析MySQL数据库索引之前,很多小伙伴对数据结构中的树理解不够深刻.因此我们由浅入深一步步探讨树的演进过程,再一步步引出MySQL数据库索引底层数据结构. 一.二叉树 二叉查找树也称为有序二叉查找 ...

随机推荐

  1. 主题: 002.04 Tkinter 星空大战

    为了更加熟练 Tkinter 的应用,决定只用 Tkinter 来写一个游戏,而不是用 Pygame, 在过程中,出了很多很大的问题,最后留了一点已知的问题,不想在花时间去找出来,不过整个程序算跑的没 ...

  2. CoderForces985F-Isomorphic Strings

    F. Isomorphic Strings time limit per test 3 seconds memory limit per test 256 megabytes input standa ...

  3. UESTC1977-图书馆(AC自动机应用)

    M - 图书馆 Time Limit: 2000 MS     Memory Limit: 256 MB Submit Status 电子科技太学图书馆创建于1956年,馆舍总面积66974平方米,各 ...

  4. 每周一练 之 数据结构与算法(Tree)

    这是第六周的练习题,最近加班比较多,上周主要完成一篇 GraphQL入门教程 ,有兴趣的小伙伴可以看下哈. 下面是之前分享的链接: 1.每周一练 之 数据结构与算法(Stack) 2.每周一练 之 数 ...

  5. docker入门-安装篇

    一.docker介绍 1:docker官网 www.docker.com 2:github  https://github.com/docker/docker.github.io 3:开源的容器引擎, ...

  6. 安装lispbox出现:error while loading shared libraries: libjpeg.so.62: cannot open shared object file: No such file or directory

    如下图,运行lispbox出现如下报错(第一个命令): 检索之后发现解决办法:Solution to libjpeg.so.62 输入一下两条命令(第二条也必须执行): sudo apt-get up ...

  7. 《Java基础知识》Java包的概念

    一.什么是java中的包 Java程序中,为了开发方便,会将功能相似的类放入一个文件夹中,这个文件结构就是包. 二.java中的包的命名规范 域名反写,例如:com.baidu. 三.java中的包的 ...

  8. GHOST CMS - Ghost Handlebars主题 Ghost Handlebars Themes

    Ghost Handlebars主题 Ghost Handlebars Themes Ghost主题层被设计为让开发人员和设计人员能够灵活地构建由Ghost平台支持的自定义发布 The Ghost t ...

  9. 中文站最好WordPress主题,自媒体,博客,企业,商城主题一网打尽

    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...

  10. SpringBoot电商项目实战 — 前后端分离后的优雅部署及Nginx部署实现

    在如今的SpringBoot微服务项目中,前后端分离已成为业界标准使用方式,通过使用nginx等代理方式有效的进行解耦,并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务架构.多端化服务(多 ...