mysql索引的新手入门详解_Mysql索引进阶入门

1. 索引操作

2. 索引类型

PRIMARY

唯一且不能为空;一张表只能有一个主键索引

INDEX

普通索引

UNIQUE

唯一性索引

FULLTEXT

全文索引:用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以

3. 聚集索引 VS 非聚集索引

3.1 区别

* 聚集索引:主键索引,索引中键值的逻辑顺序决定了表中相应行的物理顺序

* 非聚集索引(非主键索引,也称二级索引):除主键索引(普通索引、唯一索引、全文索引),索引的逻辑顺序与磁盘上行的物理存储顺序不同

查询过程:

查询聚集索引能直接得到所有数据,

查非聚集索引需要先得到聚集索引地址,回表 再得到数据。

3.1 聚集索引规则

如果一个主键被定义了,那么这个主键就是作为聚集索引

如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引

如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增。

4 索引结构

默认 B+Tree, Hash(key-value的插入以及查询,哈希表的时间复杂度都是O(1),如果不需要有序的遍历数据,哈希表性能最好。)

B+树 由二叉树演变的m阶树

为什么是B+树(配合磁盘的读写特性,减少单次查询的磁盘访问次数。)

4.1 B+树特点

每个节点中子节点的个数不能超过 m,也不能小于 m/2;

根节点的子节点个数可以不超过 m/2,这是一个例外;

m 叉树只存储索引,并不真正存储数据,这个有点儿类似跳表;

通过链表将叶子节点串联在一起,这样可以方便按区间查找;

一般情况,根节点会被存储在内存中,其他节点存储在磁盘中。

复杂度

所有操作(查、插、删) 时间复杂度 O(logm(N)),

空间复杂度 最差 O(n)

4.2 m阶怎么计算来?

操作系统按页读取(默认是4k或者8k),为了提高I/O效率,所以一个索引页和操作系统读取空间保持一致。

m = 数据页大小/索引项大小

所以索引项字段占空空间越小(int 4byte,比bigint 8byte少一半),一页存的索引数据越多,在优化的时候也要考虑索引字段的长度。

子节点是 双向链表 结构,方便范围查询及排序。

考虑:

1000万数据,树有多高?

InnoDB页的大小默认是16k,16k=16384byte,一般一行数据为1k,单个叶子节点(页)的记录数为16/1 = 16,假设主键id为bigint8字节,指针大小默认为6字节,一页能存放 16384/14 = 1170 高度为2的能存放 1170*16 = 18720 高度为3的能存放 1170*1170*16= 21902400

5. 覆盖索引

select 主键 from table where 普通索引字段 = ** ;

覆盖索引概念:通过索引直接插到结果,不需要回表操作。

例子:身份证号 和 姓名

如果要根据身份证号查询信息,只要在身份证上建立索引,需要建[身份证、姓名] 组合索引吗?

如果有身份证号查询姓名的高频查询,则建立上边的组合索引,则可达到覆盖索引,不需要回表查到整行数据,减少执行时间。

6. 最左前缀原则

两个概念:

这个最左前缀可以是 组合索引的最左N个字段

也可以是 字符串索引的最左M个字符。

建立组合索引(a,b,c)相当于建立了 (a,b,c) (a,b) (a,c) (a) 四个索引

只要能匹配到最左N个字段,则能使用索引。 如 [a,b,c] [a,c] [a,b] [a] 都能触发索引,内部顺序可变,mysql自动调整。

字符串索引

最左M个字符:如like x% ok, %x,%x% 不行。

7. 索引下推

MySQL 5.6 引入的索引下推优化(index condition pushdown)

可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

8. 索引是否生效,优化

可以使用 EXPLAIN 来分析索引是否起效,慢sql做一些索引优化 Explain优化查询检测

索引字段为int类型时,条件可用' '包起来 也可以直接是数值比较

索引字段为varchar类型时,条件要使用' '包起来

能触发range范围索引 >,

9. 常用索引命名规范

唯一 uk_[字段名]_[字段名]...

普通 idx_[字段名]_[字段名]...

MySQL索引优化入门

索引简介 官方定义:索引(Index) 是帮助MySQL高效获取数据的数据结构.大家一定很好奇,索引为什么是一种数据结构,它又是怎么提高查询的速度?我们拿最常用的二叉树来分析索引的工作原理.看下面的图 ...

MySQL索引入门

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 索引分单列索引和组合索引.单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引. ...

mysql进阶(二十六)MySQL 索引类型(初学者必看)

mysql进阶(二十六)MySQL 索引类型(初学者必看)   索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型.   在数 ...

mysql运维入门4:索引、慢查询、优化

MySQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都是以B-树的形式保存 如果没有索引,执行查询时,MySQL必须从第一个记录开始整表扫描,知道查询到符合要求的记录,记录越大,花费时 ...

重新学习Mysql数据库4:Mysql索引实现原理和相关数据结构算法

本文转自互联网 本系列文章将整理到我在GitHub上的仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

mysql索引的使用和优化

参考: http://blog.csdn.net/xluren/article/details/32746183 http://www.cnblogs.com/hustcat/archive/2009 ...

理解MySQL——索引与优化

转自:理解MySQL——索引与优化 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存 ...

mysql索引需要了解的几个注意

板子之前做过2年web开发培训(入门?),获得挺多学生好评,这是蛮有成就感的一件事,准备花点时间根据当时的一些备课内容整理出一系列文章出来,希望能给更多人带来帮助,这是系列文章的第一篇 注:科普文章一 ...

mysql 索引篇

一.索引优化   索引优化主要还是依赖explain命令,关于explain命令相信大家并不陌生,具体用法和字段含义可以参考官网explain-output,这里需要强调rows是核心指标,绝大部分r ...

随机推荐

Conquer and Divide经典例子之汉诺塔问题

递归是许多经典算法的backbone, 是一种常用的高效的编程策略.简单的几行代码就能把一团遭的问题迎刃而解.这篇博客主要通过解决汉诺塔问题来理解递归的精髓. 汉诺塔问题简介: 在印度,有这么一个古老 ...

快速创建 IEqualityComparer 实例:改进

两年前,我写了篇文章 和 IComparer 的实例>,文中给出了一个用于快速创建 IEqualityCo ...

AngularJS XMLHttpRequest $http服务

$http 是 AngularJS 中的一个核心服务,用于读取远程服务器的数据. 读取JSON文件 以下是存储在web服务器上的 JSON 文件: http://www.runoob.com/try/ ...

java为什么要设置环境变量

1. PATH环境变量.作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中查找看是否能找到相 应的命令程序.我们需要把 jdk安装目录下的bin目录增加到现有的PAT ...

Atitit。如何实现dip, di ,ioc ,Service Locator的区别于联系

Atitit.如何实现dip, di ,ioc  ,Service Locator的区别于联系 1. Dip原则又来自于松耦合思想方向1 2. 要实现dip原则,有以下俩个模式1 3. Ioc和di的 ...

substr

substr(string,start,length) string - 指定的要截取的字符串 start - 必需,规定在字符串的何处开始 正数 - 在字符串的指定位置开始 负数 - 在从字符串结尾 ...

Oracle MySQL

http://blog.jobbole.com/46510/ http://blackproof.iteye.com/blog/1570456 http://blog.csdn.net/yzsind/ ...

js设计模式(7)---装饰者模式

0.前言 下午做事效率很低,无精打采的,整个脑子就跟浆糊一样,看看时间一点点流去,心中只能无可奈何,哎,码农的激情难道就这么容易熄灭吗? 1.该模式的使用情况 假如我们想给对象增加功能,但是又不想修改 ...

I.MX6 busybox set hosname and login with root

/************************************************************************** * I.MX6 busybox set hosn ...

Java SE知识点

Java概述 Java的运行机制 JDK,JRE,JVM Java开发环境搭建 用记事本编写运行一个Hello World的完整过程 如何在Java中使用注释 使用Eclipse开发Java程序 使用 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值