来自互联网,整理转载.

摘要:
多关于索引,分为以下几点来讲解:

一、索引的概述(什么是索引,索引的优缺点)

二、索引的基本使用(创建索引)

三、索引的基本原理(面试重点)

四、索引的数据结构(B树,hash)

五、创建索引的原则(重中之重,面试必问!敬请收藏!)

六、百万级别或以上的数据如何删除

一、索引的概述

1)什么是索引?

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,索引就相当于目录。当你在用新华字典时,帮你把目录撕掉了,你查询某个字开头的成语只能从第一页翻到第一千页。累!把目录还给你,则能快速定位!

2)索引的优缺点:

可以大大加快数据的检索速度,这也是创建索引的最主要的原因。且通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。但是,索引也是有缺点的:索引需要额外的维护成本;因为索引文件是单独存在的文件,对数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操作需要消耗额外的IO,会降低增/改/删的执行效率。

二、索引的基本使用

1)创建索引:(三种方式)

第一种方式:

第二种方式:使用ALTER TABLE命令去增加索引:

ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。

其中table_name是要增加索引的表名column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。

索引名index_name可自己命名缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。

第三种方式:使用CREATE INDEX命令创建

CREATE INDEX可对表增加普通索引或UNIQUE索引。(但是,不能创建PRIMARY KEY索引

三、索引的基本原理

索引用来快速地寻找那些具有特定值的记录。

如果没有索引,一般来说执行查询时遍历整张表。

索引的原理很简单,就是把无序的数据变成有序的查询

1、把创建了索引的列的内容进行排序

2、对排序结果生成倒排表

3、在倒排表内容上拼上数据地址链

4、在查询的时候,先拿到倒排表内容,再取出数据地址链从而拿到具体数据

四、索引的数据结构(b树,hash)

1)B树索引

mysql通过存储引擎取数据,基本上90%的人用的就是InnoDB了,按照实现方式分,InnoDB的索引类型目前只有两种:BTREE(B树)索引和HASH索引B树索引是Mysql数据库中使用最频繁的索引类型,基本所有存储引擎都支持BTree索引。通常我们说的索引不出意外指的就是(B树)索引(实际是用B+树实现的,因为在查看表索引时,mysql一律打印BTREE,所以简称为B树索引)

查询方式:

主键索引区:PI(关联保存的时数据的地址)按主键查询.

普通索引区:si(关联的id的地址,然后再到达上面的地址)。所以按主键查询,速度最快

B+tree性质:

1.)n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引。

2.)所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3.)所有的非终端结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。

4.)B+ 树中,数据对象的插入和删除仅在叶节点上进行。

5.)B+树有2个头指针,一个是树的根节点,一个是最小关键码的叶节点。

哈希索引(好技术文)

简要说下,类似于数据结构中简单实现的HASH表(散列表)一样,当我们在mysql中用哈希索引时,主要就是通过Hash算法(常见的Hash算法有直接定址法、平方取中法、折叠法、除数取余法、随机数法),将数据库字段数据转换成定长的Hash值,与这条数据的行指针一并存入Hash表的对应位置;如果发生Hash碰撞(两个不同关键字的Hash值相同),则在对应Hash键下以链表形式存储。当然这只是简略模拟图。

五、创建索引的原则(重中之重)

索引虽好,但也不是无限制的使用,最好符合一下几个原则

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的顺序可以任意调整。

2)较频繁作为查询条件的字段才去创建索引

3)更新频繁字段不适合创建索引

4)不能有效区分数据的列不适合做索引列(如性别,男女未知,最多也就三种,区分度实在太低)

5)尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。

6)定义有外键的数据列一定要建立索引。

7)对于那些查询中很少涉及的列重复值比较多的列不要建立索引

8)对于定义为text、image和bit的数据类型的列不要建立索引。

六、百万级别或以上的数据如何删除

关于索引:由于索引需要额外的维护成本,因为索引文件是单独存在的文件,所以当我们对数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操作需要消耗额外的IO,会降低增/改/删的执行效率。所以,在我们删除数据库百万级别数据的时候,查询MySQL官方手册得知删除数据的速度和创建的索引数量是成正比的。

我们想要删除百万数据的时候步骤如下:
1.可以先删除索引(此时大概耗时三分多钟)

2.然后删除其中无用数据(此过程需要不到两分钟)

3.删除完成后重新创建索引(此时数据较少了)创建索引也非常快,约十分钟左右

注意:与之前的直接删除绝对是要快速很多,更别说万一删除中断,一切删除会回滚。那更是坑了。

转载于:https://www.cnblogs.com/liulei-LL/p/7920394.html

5.MySQL优化---索引优化专题相关推荐

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

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

  2. Mysql之索引优化案例

    Mysql之索引优化案例 1.单表简单案例 1.1创建表 1.2 问题: 1.3 解决:新建索引 1.4 再次执行 2.双表简单案例 2.1创建表并插入数据 2.2 由于是LEFT JOIN,所以左表 ...

  3. MySQL - 践行索引优化

    文章目录 生猛干货 Pre Table Demo DB Version Case 全值匹配 最左前缀 禁止索引列上做任何操作(计算.函数.(自动or手动)类型转换) 存储引擎不能使用索引中范围条件右边 ...

  4. mysql 字符串索引 优化_MySQL性能优化之索引调优实战

    索引失效场景或使用注意事项 a.索引无法存储null值,所以建议都给默认值 b.如果条件中有or,即使使用了索引条件也不起作用,所以尽量少用or 如果想使用or,又让索引生效,只能将or的每个列上加上 ...

  5. MySQL日记——索引优化

    索引优化最简单的一个法则 左连接建在右表,右连接建在左表 例如 select * from book left join category on category.class=book.class 这 ...

  6. Mysql高级 索引优化

    Mysql逻辑架构 Mysql与其他数据库相比有点与众不同,他的架构可以在多种不同的场景中应用并发挥作用,主要体现在存储引擎的架构上,插件式的存储引擎结构将查询处理和其他的系统任务以及数据的存储提取分 ...

  7. mysql复合索引优化

    很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有使用到索引! 一般来说,可能是某些字段没有创建索引,或者是组合索引中字段的顺序与查询语句中字段的顺序不符. 看下面的例子: 假设 ...

  8. MySQL:索引优化、查询优化

    一.哪些情况适合创建索引 1.字段的数值有唯一性的限制: 业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引: 说明:创建唯一索引会影响添加的速度(在添加的时候会维护索引),但是这个速度影响 ...

  9. MySQL高级-索引优化(超详细)

    性能分析 MySQL Query Optimizer Mysql中由专门负责优化SELECT语句的优化器,主要功能就是通过计算分析系统中收集到的统计信息,为客户端请求的Query提供他认为最优的执行计 ...

  10. 【MySQL】索引优化中的最左前缀原则和索引下推

    目录 一.引入 二.覆盖索引 ​ 讲接下来的问题前首先讲一下联合索引的底层存储结构长什么样?联合索引的检索过程是什么样的呢? 三.最左前缀原则 最左前缀原则的定义 四.索引下推 五.小结 一.引入 在 ...

最新文章

  1. new,delete和malloc,free以及allocatorT
  2. 人工智能,机器学习,深度学习入门好文,强烈推荐
  3. 7种JIRA集成可优化Java开发流程
  4. php nowdoc用来做什么,PHP中nowdoc和heredoc使用需要注意的一点
  5. SageMath常用函数
  6. 第十八届全国大学生智能车竞赛竞速比赛规则(讨论版)
  7. java mysql 分区表_mysql分区表
  8. Could not locate call adapter for io.reactivex.Observable
  9. java fact函数_Fact 定义一个类Fact表示无符号有理数(分数) 联合开发网 - pudn.com...
  10. 设置切换输入法按键ctrl+shift
  11. django+javascrpt+python实现私有云盘代码
  12. 如何用计算机打出下划线,电脑下划线怎么打?下划线怎么输入出来
  13. Collecting Luggage - UVALive 2397 - 蓝桥杯 算法训练
  14. anaconda使用和入门
  15. 5 JMeter断言-Jmeter响应中出现乱码时
  16. Python数据分析上机
  17. Vue实现简单聊天对话框案例
  18. Android微信/QQ红包自动抢(AccessibilityService)
  19. Kindle换屏记,图和非常简的介绍
  20. Connector odbc 安装

热门文章

  1. 深入V8引擎-写在前面
  2. 你不可不知的Java引用类型之——ReferenceQueue源码详解
  3. 【转】IT从业人员必看的10个论坛
  4. 嵌入式Linux环境变量如何参与程序运行
  5. Anacond win10安装与介绍
  6. 对Ajax返回的json数据做处理报错
  7. 原创engine中地块的自动编号函数
  8. css中背景的应用及BFC与IFC应用
  9. 数组的声明、创建、初始化
  10. 移动端实现标题文字的截断