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. [TimLinux] JavaScript 引用类型——Date

    1. Date var now = new Date(); // 不传参数,获取当前日期.时间. now.getDay(); // 日期 now.getMonth(); // 月份 now.getFu ...

  2. 【Redis】270- 你需要知道的那些 redis 数据结构

    本文出自「掘金社区」,欢迎戳「阅读原文」链接和作者进行技术交流 ?? 作者简介 世宇,一个喜欢吉他.MDD 摄影.自走棋的工程师,属于饿了么上海物流研发部.目前负责的是网格商圈.代理商基础产线,平时喜 ...

  3. leetcode-算法系列-两数之和

    本系列的题目都是出自于"leetcode" 用博客记录是为了加强自己的记忆与理解,也希望能和大家交流更好更优的解题思路. 题目: 给定一个整数数组和一个目标值,找出数组中和为目标值 ...

  4. webpack学习1.1 webpack背景介绍

    一.为什么要前端需要构建? 开发复杂化 框架去中心化(代码中需要的模块都可以通过npm安装佢解决一个问题,包越来越零散,根据需要来安装) 开发编译化 语言模块化 二.为什么要用webpack? 1.三 ...

  5. prototype原型

    1.prototype是函数的一个属性,并且是函数的原型对象.引用它的必然是函数[对象都是通过函数创建的], 这个prototype的属性值是一个对象(属性的集合,再次强调!),默认的只有一个叫做co ...

  6. 常见面试题之*args

    这个地方理解即可,只是面试的时候会被问到,单独做了一下知识点的整理,不推荐使用. def self_max(a,b,c,d,e,f,g,h,k,x=1,y=3,z=4): #默认参数 print(a, ...

  7. 获取本地计算机名称和Ip地址

    using System.Net; Dns.GetHostName();//获取本地计算机主机名 IPAddress[] IP = Dns.GetHostAddresses(Dns.GetHostNa ...

  8. 《Dotnet9》建站-本站使用的什么主题?

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

  9. Python:日期和时间的处理模块及相关函数

    Python:日期和时间的处理模块及相关函数 Python 提供 time 模块和 calendar 模块用于格式化日期和时间. 一.时间戳 在Python中,时间戳是以秒为单位的浮点小数,它是指格林 ...

  10. TypeScript引入moment.js报错“无法找到moment模块”及解决方法

    npm i moment下载moment完成后,在ts文件中引入 import * as moment from "moment"; 结果疯狂报错,未找到moment模块. 一开始 ...