一、引言

  • 对于该文章,照例尽量通俗的写,并注明一些细节和可能出现问题的地方。
  • 此外,该文章只是写了索引的创建,不代表检索(查询)的应用,检索后面会写道。
  • 标注:红色表示十分重要,蓝色表示细节;
  • 在阅读这文章之前,如果初学MySQL不久,应已经熟悉:表约束操作、表的创建以及增删改查数据、熟知InnoDB和M有ISAM存储引擎、SQL数据类型更好

二、索引基本概念和功能

1.索引概念

  • 索引本质:索引就是数据库表中字段值的复制,该字段称为索引的关键字
  • 索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录
  • 索引往往通过复杂的数据结构(双向链表、B+树/B树、hash)实现
  • MyISAM存储引擎的表支持主索引,InnoDB存储引擎的表支持聚簇索引(主索引)与非聚簇索引(辅助索引)索引优化使用

2.索引的优缺点

@优点:

  • MySQL的索引的建立对于MySQL的高效运行非常重要,可以大大提高MySQL的检索速度。
  • 在分组和排序字句进行数据检索,可以减少查询时间中 分组 和 排序时所消耗的时间(数据库的记录会重新排序)
  • 在表连接的连接条件 可以加速表与表直接的相连

@缺点:

  • 但过多使用索引会造成索引滥用,提高了检索速度,缺降低了表的更新速度

如:对表进行增删改查操作时,MySQL不仅要保存数据,还要保存索引文件,建立索引会占用磁盘空间的索引文件

  • 在创建索引和维护索引 会耗费时间,随着数据量的增加而增加

3.不使用索引的情况

  • 查询中很少使用的列和很少数据的字段,不应该创建索引,否则会降低MySQL性能、增加空间需求
  • text、image、bit数据类型字段不应该增加索引
  • 修改操作远大于检索操作,不应该增加索引

4.索引关键字选取规则

  • 离散度高。例如性别只要男女,离散度低;而学号,每个人对应一个,离散度高。
  • 占用存储空间少的字段 。例如 字符串与 int ,选int
  • 存储空间固定的字段。例如text与char,选char
  • where语句字段、group by分组字段、order by排序字段通常使用索引 ,单独order by 用不了索引,可以使用where/limit
  • 尽量使用前缀索引 ,即将字段值的前部分作为索引 前缀索引能有效减小索引文件的大小,提高索引的速度。但是前缀索引也有它的坏处:MySQL 不能在 ORDER BY 或 GROUP BY 中使用前缀索引

三、索引分类

PS:此处没有讲MyISAM与InnoDB引擎,所以这个分类代表常用索引分类。后续参考索引拓展部分。该两个引擎在MySQL5.6版本之后,都支持以下索引。读者在阅读其它文章时,需要分辨一下。

1.  索引按用法技巧分为

  • 单列索引 和  组合索引 (最左前缀索引或者多列索引或者复合索引)
  • 单列索引:即一个索引只包含单个字段,一个表可以有多个单列索引
  • 组合索引: 即一个索引包含多个字段。遵从最左前缀原则

2. 单列索引:

  • 普通索引:(最基本):没有任何约束的索引;通常创建外键约束时自动创建普通索引,索引名与外键约束名相同
  • 主键索引(主索引):与主键约束相关。通常在创建主键时自动创建了主索引,索引名与主键约束名相同

+ 主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)

  • 唯一索引 unique:与唯一约束相关。通常在创建唯一约束时自动创建唯一索引,索引名与唯一约束名相同

+ 索引列的值必须唯一,但允许有空值

  • 全文索引 fulltext:全文索引的诞生是为了解决模糊查询效率低的

+ 全文索引支持的字段类型包括 char ,varchar , text 。是目前实现大数据搜索的关键技术

3.组合索引

即一个索引包含多个字段。遵从最左前缀原则。知道这点即可

四、索引的创建和删除语法

1.索引的创建

按创建索引的时间分为两大类

  • 创建表的时候创建索引

在建表反括号之前 [无|unique|fulltext]index 索引名(字段名[(长度)][asc|desc])   

[ ]内属于可选选项,根据参数创建不同索引

asc与desc表示可选参数,分别表示升序与降序,通常默认asc就行了

例如:创建一个名为information的表,依次定义唯一性、(普通、主)、全文索引、组合索引。

PS : 普通索引与主索引创建方式相同 ,故写一个 ,蓝色为索引名

create table information (

ID char(20) primary key,          ID普通字符主键

name char(20)not null,           名字普通字符字段

introduction text not null,          介绍文本字段

price int ,                                   价格整型字段

time_s date not null,                  时间date类型字段

unique index ID_unique (No),   唯一性索引

index name_key (name(20)),    普通、主索引

fulltext index introName_fulltext (name,introduction),  全文索引  有name和introduction两个字段

index priTime_group(price,time_s)                               组合索引 有price与time两个字段

) engine = MyISAM default charset = utf8;

  • 在已有的表上创建索引  (通常推荐该种创建索引的方式)

主要有两种

CREATE [无|unique|fulltext]index索引名 ON 表名(字段名[(长度)][asc|desc])

ALTER TABLE 表名 ADD [无|unique|fulltext]index 索引名(字段名[(长度)][asc|desc])

例如:创建上方的唯一性索引

create unique index  introName_fulltext on information (name,introduction)

等同于 alter table information add unique introName_fulltext  (name,introduction)

2.索引的删除

drop index 索引名 on 表名

例如:删除上方的唯一性索引

drop index introName_fulltext   on information

五、索引的失效

可以查看一下别人的分享:http://blog.csdn.net/guoxingege/article/details/51034387

六、索引的拓展—存储引擎

1.常用索引实现的数据结构

  • MySQL普遍使用B+Tree实现索引结构

2.MyISAM索引实现

  • MyISAM引擎使用B+Tree为索引结构
  • MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分

3.InnoDB索引实现

  • InnoDB也用B+Tree为索引结构。
  • 与MyISAM区别

No.1 :InnoDB的数据文件本身就是索引文件,MyISAM索引文件与数据文件是分开的

No.2 :InnoDB的辅助索引data域存储相应记录主键的值,而MyISAM是地址

PS:这篇文章相当于是初级索引,如果想更加深入,可以学习索引的调优,数据结构,存储引擎等方面。

MySQL索引作用和用法详解相关推荐

  1. mysql中 where in 用法详解

    https://blog.csdn.net/haibo0668/article/details/52584307 sssss mysql中 where in 用法详解 我是高手高手高高手 2016-0 ...

  2. mysql increment_mysql中auto_increment用法详解

    在mysql中AUTO_INCREMENT类型的属性用于为一个表中记录自动生成ID功能,也就是会自动自增一个ID了,如现在是1下次会自动是2了,就这么简单,下面来看mysql中auto_increme ...

  3. MySQL中Case When用法详解

    最近,在学习Hive基础知识时,遇到了遇到了Case When Else End语法,以前学习MySQL时忽略了这部分知识点,现总结一下相关的知识给大家.首先练习一个例子如下: 一.学生课程成绩统计 ...

  4. shadow dom的作用和用法详解(createShadowRoot, attachShadow)

    相信shadow dom很多前端开发工作者都遇到过,它是web component的一部分.不过对于shadow dom很多人并不深入了解,只晓得是影子dom结构,那么到底什么是shadow dom的 ...

  5. mysql 创建游标报错,MySQL游标概念与用法详解

    本文实例讲述了mysql游标概念与用法.分享给大家供大家参考,具体如下: 1.游标的概念(cursor) 一条sql,对应n条资源,取出资源的接口,就是游标,沿着游标,可以一次取出1行.如果开发过安卓 ...

  6. mysql中in的用法详解

    一.基础用法 mysql中in常用于where表达式中,其作用是查询某个范围内的数据. select * from where field in (value1,value2,value3,-) 当 ...

  7. Mysql 索引模型 B+ 树详解

    一.认识二叉树 首先,在了解 mysql 中的 B+ 树之前,我们需要搞懂什么是二叉树.二叉树是一种常见的非线形数据结构,数据是以一对多的形态组织起来的,我画了一张图来帮助你理解: 在二叉树中,有一种 ...

  8. MySQL事务操作原理与用法详解

    事务: 有多个连续操作, 是一个整体: 要么所有的操作都成功, 要么所有的操作都失败. 事务实现: 有两种方式 手动实现: 用户自定义事务区间, 自己对事务进行整体把握, 自己对事务进行最终处理(通过 ...

  9. mysql中declare语句用法详解

    mysql中的DECLARE语句是在复合语句中声明变量的指令.  (1)Example with two DECLARE statements  两个DECLARE语句的实例  CREATE PROC ...

最新文章

  1. java学习笔记-java中运算符号的优先顺序
  2. Vue安装配置以及入门案例
  3. 在所有浏览器下一次性测试您的网站
  4. matlab中方波信号的谐波表示
  5. 软件构造学习笔记-第六周
  6. 进阶– Java EE 7前端5强
  7. LeetCode 459. 重复的子字符串(数学)
  8. Hex Workshop(16进制编辑利器) 6.7.2绿色版
  9. 吴恩达机器学习之线性逻辑回归实现部分
  10. linux终端输入lsblk无命令,lsblk
  11. 今日头条 mysql_今日头条的核心技术细节是什么?
  12. Mysql Sql语句令某字段值等于原值加上一个字符串
  13. python应用系列教程——python操作office办公软件(excel)
  14. java后台实现弹窗提示_java后台代码弹窗
  15. 大数据数据仓库-简介
  16. SQL获取当天0点0分0秒和23点59分59秒方法
  17. WIN10中IE双击没有反应打不开要右键以管理员身份才能运行
  18. Swift SwiftUI 必备础库之 01 Introspect
  19. V853 替换开机启动LOGO
  20. vue-router有哪几种导航钩子

热门文章

  1. solaris jumpstart
  2. python编写会计凭证金蝶_怎么在金蝶财务软件中录入会计凭证
  3. NSAT-2000三极管自动测试系统
  4. 都不知道怎么好了。。。。。
  5. 音频频谱动画的原理与实现(一)
  6. 绝对好用,解决:Invalid character found in the request target. The valid characters are defined。。。
  7. Android Studio 添加图标
  8. 仿个人税务 app html5_你下载的个税APP可能是假的!当心抢你的钱!
  9. (附源码)基于Spring boot开发电子宿舍管理系统 毕业设计132056
  10. 特别策划 | 5G最新进展深度解析2020版-技术应用篇(68页附下载)