一、索引是什么?

索引是本质是一种数据结构,索引的目的在于提高查询效率。【排好序的快速查找的数据结构】

每个节点包含索引键值和一个指向对应数据记录物理地址的指针。

索引往往以索引文件的形式存储在磁盘。

二、索引的优缺点:

优势:

提高数据检索的效率,降低数据库的IO成本

通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗

缺点:

索引提高了查询效率,但是同时会降低更新表的速度(MySQL不仅要更新数据,还要保存索引文件每次更新添加了索引列的字段)

三、MySQL索引分类

单值索引

唯一索引

复合索引:一个索引

基本语法:

创建索引:create index <索引的名字> on table_name (列的列表)
修改表索引: alter table table_name add index [索引的名字] (列的列表);
删除索引:drop index <索引的名字> on table_name
查看索引:show index from table_name;

四、MySQL索引结构

BTree索引

Hash索引

full-text全文索引

R-Tree索引

四、MySQL索引原理

一颗B+树,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示)

真实的数据存在于叶子节点即3、5、9、10、13、15、28、29、36、60、75、79、90、99。

非叶子节点只不存储真实的数据,只存储指引搜索方向的数据项。

  • B+树查找过程

如果要查找数据项29,首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针。

通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针。

通过磁盘块3的P2指针的磁盘地址把磁盘块8由磁盘加载到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。

真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的。

如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。

五、什么情况下需要创建索引

六、explain分析

1、id:查询中执行select子句或操作表的顺序

id相同:执行顺序由上到下

id不同:如果是子查询,id的序号会递增,id越大优先级越高,越先被执行

id相同、不同同时存在:,id越大优先级越高,越先被执行

2、select_type:主要是用于区别普通查询、联合查询、子查询等的复杂查询

SIMPLE:简单SELECT,不使用UNION或子查询等

PRIMARY:查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY

SUBQUERY:在select或where列表中包含子查询

DERIVED

UNION

UNION RESULT:

3、table:这一行的数据是关于哪个表的

4、type:

从最好到最差依次是:system>const>eq_ref>ref>range>index>ALL【一般来说至少达到range或ref级别】

system:表只有一行记录(等于系统表)

const:

eq_ref

ref

range

index:Full Index Scan,index与ALL区别为index类型只遍历索引树

ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行

5、possible_keys

6、key

7、key_len

8、ref

9、rows

10、extra:包含不适合在其他列中显示但十分重要的额外信息

Using filesort:MySQL中无法利用索引完成的排序操作称为“文件排序”

Using temporary:MySQL需要使用临时表来存储结果集,常见于排序 order by和分组查询group by

Using index

五、提高Order By的速度

  • 当query的字段大小总和小于max_length_for_sort_data,而且排序字段不是TEXT|BLOB类型时,使用单路排序。否则使用多路排序
  • 两种算法的数据都有可能超出sort_buffer_size的容量,超出之后,会创建tmp文件进行合并排序,导致多次IO。
  • 尝试提高sort_buffer_size
  • 尝试提高max_length_for_sort_data,如果设置太高,数据总容量超出sort_buffer_size的概率增大,会导致高磁盘IO和低的处理器使用率。

mysql常用的七种join查询

MySQL-索引简介的更多相关文章

  1. Mysql 索引 简介

    Mysql索引 索引的分类 索引的创建 索引的注意事项 什么是索引 索引是存储引擎用于快速查找记录的一种数据结构. 索引由数据库中一列或者多列组成,作用是提高表的查询速度. 索引的优点,提高检索数据的 ...

  2. MySQL索引简介(转)

    一.为什么用索引例:先假设有一张表,表的数据有10W条数据,其中有一条数据是nickname='css',如果要拿这条数据的话需要写的sql是 SELECT * FROM award WHERE ni ...

  3. MySql索引简介

    从"找"到B+树 索引是用来查找的. 折半查找是一种很优秀的方式.适合于 范围查找,固有缺点就是需要元素是有序的.二叉搜索树就是对折半查找的一种基础的实现. 但二叉搜索树当遇到特殊 ...

  4. MySQL中的索引简介

    MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 一. 索引的优点 为什么要创建索引?这是因为,创建索引可以大大提高系统的查询性能. 第一.通过创建唯一性索引,可以保 ...

  5. Mysql 索引优化分析

    MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...

  6. MySQL索引介绍+索引的存储类型+索引的优点和缺点+索引的分类+删除索引

    什么是索引? 索引用于快速找出某个列中有一特定值的行,不使用索引,mysql必须从第1条记录开始读完整的表,直到找出相关的行.表越大,查询数据所花费的实际越多.如果表中查询的列有一个索引,mysql能 ...

  7. Mysql索引整理总结

    一.索引概述 1. 简介 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 举例说明索引:如果把数据库中的某一张看成一本书,那么索引就像是书的目录,可以通过 ...

  8. mySql索引优化分析

    MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...

  9. MySQL索引优化入门

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

  10. 再谈MySql索引

    一.索引简介 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 索引分单列索引(主键索引.唯一索引.普通索引)和组合索引.单列索引,即一个索引只包含单个列 ...

随机推荐

  1. Github Trending All In One

    Github Trending All In One github trending https://github.com/trending https://github.com/trending/j ...

  2. BGV等 DeFi产品暴涨背后隐藏着什么?

    比特币突破两万七千美金,在此创造了历史.在比特币一路飙升的背后,到底是谁注入了"强心针".笔者认为今年以来推动BTC长期上涨的主要动力主要包括四个:经济形势恶化.央行大量放水(主要 ...

  3. Iterable object of JavaScript

    数组是可迭代的,所以数组可以用于for of,字符串也是可迭代的,所以字符串也可以用作for of,那么,对象呢? 试一试: var somebody = { start:0, end:100 } f ...

  4. ForkJoinPool大型图文现场(一阅到底 vs 直接收藏)

    知识回顾 并发工具类我们已经讲了很多,这些工具类的「目标」是让我们只关注任务本身,并且忽视线程间合作细节,简化了并发编程难度的同时,也增加了很多安全性.工具类的对使用者的「目标」虽然一致,但每一个工具 ...

  5. window.onresize绑定事件以及解绑事件

    问题描述 在Vue工程中,添加样式,部分需要做到自适应,需要添加resize事件,由于是单页面应用,如果组件初始化的时候绑定事件,在切换页面的时候不去注销事件,如果来回切换,会让resize事件执行多 ...

  6. Vue学习笔记-Vue.js-2.X 学习(五)===>脚手架Vue-CLI(PyCharm)

    Vue项目在pycharm中配置 退出运行: ctrl+c Vue学习笔记-Vue.js-2.X 学习(六)===>脚手架Vue-CLI(项目说明)

  7. TkMybatis添加对象后返回数据的id

    在实体类的id属性上加上下面的注解 //导入的包import javax.persistence.GeneratedValue; @GeneratedValue(generator = "J ...

  8. Django之csrf中间件及auth模块使用

    目录 一.基于配置文件的编程思想 1. importlib 模块 2. 配置文件 二.跨站请求伪造(csrf) 1.csrf简介以及由来 2.Django中的csrf中间件如何使用 2.1 普通for ...

  9. Gradle 差异化构建

    Compile 默认的依赖方式,任何情况下都会依赖. Provided 只提供编译时依赖,打包时不会添加进去. Apk 只在打包Apk包时依赖,这个应该是比较少用到的. TestCompile 只在测 ...

  10. elasticsearch如何设计集群

    本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 在写本文时就在想,如果让你负责一个elasticsearch集群,从零开始,你会从哪些方面 ...