前言

现在的项目对于数据库操作基本上都是使用封装好的ORM框架,这样开发效率相对来说有所提高。但由于框架的封装,会自动生成SQL语句,这让一些小伙伴对SQL产生了一种陌生感(基本不写SQL),导致排查业务执行缓慢问题时比较盲目;其实本质还是SQL,而对于SQL的优化,索引是否使用上是一个关键的点,所以这先来了解一下平时见过的那些索引分类,后续再来好好说说索引的使用。

正文

1. 索引概述

索引是辅助高效获取数据的数据结构,目的就是为了提高查询效率

索引本身也会存在磁盘上,从存储和表数据操作效率来说,一个表创建过多的索引也不是个好事。

2. 索引分类

2.1 按逻辑使用分
  • 主键索引:主键索引也是一种唯一索引,不能有空值,一个表只能有一个主键。

    创建索引

    创建表时创建

    CREATE TABLE tableName(  ID INT NOT NULL,   username VARCHAR(16) NOT NULL,  PRIMARY KEY (ID)
    );

    修改表的形式添加

    ALTER TABLE tableName ADD PRIMARY KEY indexName(columnName);
  • 唯一索引:索引列的值必须唯一,但允许有空值

    创建索引

    创建表时创建

    CREATE TABLE tableName(  ID INT NOT NULL,   username VARCHAR(16) NOT NULL,  UNIQUE indexName (username)
    );

    修改表的形式添加

    ALTER table tableName ADD UNIQUE indexName(columnName)

    有表时直接创建

    CREATE UNIQUE INDEX indexName ON tableName(columnName)
  • 普通索引:基本的索引类型,没有唯一性限制允许有空值,一个表可以有多个普通索引;

    创建索引

    创建表时创建

    CREATE TABLE tableName(  ID INT NOT NULL,   username VARCHAR(16) NOT NULL,  INDEX indexName (username)
    );

    修改表的形式添加

    ALTER table tableName ADD INDEX indexName(columnName)

    有表时直接创建

    CREATE INDEX indexName ON tableName (column_name)
  • 复合索引:一个索引可包含多列,一个表可以有多个复合索引,目的就是针对组合条件查询的场景。

    创建索引的方式和普通索引基本一样,只是可以指定多列。

    ALTER TABLE tableName ADD INDEX indexName(column_name1,column_name2,column_name3);
  • 全文索引:FULLTEXT索引,可以在varchar、char、text类型上创建,用作关键词查询等场景,但一般在关系型数据库中使用的不多,都会使用类似于ES的搜索引擎。

    创建索引

    创建表时创建

    CREATE TABLE tableName(id INT(10) PRIMARY KEY,username VARCHAR(10) NOT NULL,user_desc TEXT,FULLTEXT(user_desc)
    )

    修改表的形式添加

    ALTER TABLE tableName ADD FULLTEXT INDEX indexName(column_name);

    有表时直接创建

    CREATE FULLTEXT INDEX indexName ON tableName (column_name)

    如果是中文,在创建全文索引时,需要指明解析插件WITH PARSER ngram,否则查询不出对应结果,如下:

    CREATE FULLTEXT INDEX indexName ON tableName (column_name) WITH PARSER ngram;

    创建之后就可以针对对应的字段进行关键词搜索了,如下:

    # 针对column_name,如果匹配到有‘工作’两字的数据都查出来
    SELECT * FROM tableName WHERE MATCH(column_name) AGAINST('工作');
2.2 按存储分

索引其实是一种数据结构,可以不同的形式进行存储,所以可以将其进行如下分类:

  • Hash索引:采用Hash的形式进行存储,针对于等值条件的查询,效率很高,但比较耗内存,而在实际应用场景中,范围条件查询的场景比较多,所以Hash索引使用的不多。

  • BTree索引和B+ Tree索引:BTree和B+ Tree都是为了提升IO读效率,目的是减少IO读的次数,从而可以大大提升数据查询效率,B+ Tree其实是对BTree的扩展,B+ Tree能存储更多的数据,对叶子节点数据的存储增加关联关系,提升数据遍历效率。所以在InnoDB创建的索引默认都是B+ Tree索引。

  • R-Tree索引:空间索引,R树就是一棵用来存储高维数据的平衡树,可以用作地理数据存储。比如查看附近的共享单车位置信息这种场景,但对于数据量大点的场景,效率不高,都会使用其他方案代替,比如Redis。

具体的存储细节,暂时就不在这展开,关于数据结构和算法系列的文章,之前也分享过一部分,后续还会持续更新,说到具体内容时,再来详细说说如何在对应数据结构中操作数据。

2.3 聚簇索引和非聚簇索引
  • 聚簇索引(又称聚类索引、簇集索引):索引的顺序和表数据存储的物理顺序一致,因为一个表的数据顺序只有一种,所以一个表中只有一个聚簇索引。

    聚簇索引存储的形式是索引与数据信息存在一起,找到聚簇索引其实就找到了数据。

  • 非聚簇索引(又称非聚类索引、非聚集索引):索引的顺序和存储表数据的顺序无关;

    非聚簇索引存储的形式是索引和数据分开存储,先是根据索引找到对应数据的物理地址,然后根据物理地址再去定位对应的数据信息。

总结

关于索引先聊这么多,虽然ORM帮我们省去了写SQL的时间,但控制ORM生成高效的SQL语句是我们必须要做的,所以小伙伴们赶紧卷起来吧~~~,后面的文章还会继续说说索引在实际场景中的应用、SQL如何才能匹配到索引、如何避免索引失效等,关注“Code综艺圈”,和我一起学习吧。

提的最多的数据库“索引”,先来简单了解一下相关推荐

  1. 【思维导图-索引篇】搞定数据库索引就是这么简单

    该文已加入开源文档:JavaGuide(一份涵盖大部分Java程序员所需要掌握的核心知识).地址:https://github.com/Snailclimb... 思维导图-索引篇 系列思维导图源文件 ...

  2. B+树 -- MySQL数据库索引

    文章目录 1. 定义清楚问题 2. 尝试学过的数据结构解决问题 3. 改造二叉查找树来解决问题 4. 总结 为了加速数据库中数据的查找速度,我们常对表中数据创建索引.数据库索引是如何实现的呢?底层使用 ...

  3. 【面试题】数据库索引及B树、B+树详解

    最近准备找一个实习,所以接下来,会通过其他人分享的面经陆续的总结面试中经常遇到的题 今天是关于数据库索引,以及具体的实现(B树及B+树) 本文参考自两篇博客(个人认为是最好的相关博客了) 数据库索引部 ...

  4. 数据库索引的原理到底是什么?

    引言 中小企业MIS系统的管理基本上由两大部份组成,一是前台的可视化操作,二是后台的数据库管理.网管对前台的管理和维护工作包括保障网络链路通畅.处理MIS终端的突发事件以及对操作员的管理.培训等,这是 ...

  5. 数据库索引-基本知识

    为什么80%的码农都做不了架构师?>>>    数据库索引--基本知识 有许多因素会影响数据库性能.最明显的是数据量:您拥有的数据越多,数据库的速度就越慢.虽然有很多方法可以解决性能 ...

  6. 数据库索引的工作原理及其种类

    数据库索引的工作原理及其种类 数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询.更新数据库表中数据.索引的实现通常使用B树及其变种B+树. 在数据之外,数据库系统还维护着满足特定查找算 ...

  7. 数据库索引的作用和优点缺点

    原文:数据库索引的作用和优点缺点 为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能.  第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性.  第二,可以大大加快 数据的检索速 ...

  8. 数据库索引是什么?新华字典来帮你!

    点击蓝色"程序猿DD"关注我哟 来源:https://zhuanlan.zhihu.com/p/57359378 学过服务器端开发的朋友一定知道,程序没有数据库索引也可以运行.但是 ...

  9. 大于小于优化_以MySQL为例,详解数据库索引原理及深度优化

    本文内容主要来源于互联网上主流文章,只是按照个人理解稍作整合,后面附有参考链接. 一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引 ...

最新文章

  1. SpringCloud 教程 | 第二篇: 服务消费者(rest+ribbon)
  2. 哇哦!恍然大悟般的“share”功能的实现!
  3. linux如何把mysql表名换成小写_让 MySQL 在 Linux 下表名不区分大小写(实为表名全小写)...
  4. Errors occurred during the build. Errors running builder 'Validation' on pro
  5. es6 var、let、const命令
  6. dlgdata.cpp错误提示 解决方案
  7. 机器学习之支持向量机(SVM)总结
  8. SpringNet整合NHibernate相关配置
  9. 学习Java编程语言难不难
  10. idea好用插件及常用开发小工具、文本编辑器(替代notepad++)合集
  11. 凯恩帝数控系统面板介绍_凯恩帝数控车床操作面板按钮详解!
  12. Android桌面插件宽度,android 屏幕适配插件
  13. 《JavaScript学习笔记》
  14. 2018年11月TIOBE编程语言排行榜,Java稳居第一
  15. 爱琴海的伤感空间日志发布:七月的雨,落得太敷衍
  16. apktool工具在kali中的安装步骤
  17. 【Jetson Nano】使用python3模拟向阿里云发送数据
  18. Java实现旅游app_基于安卓Android平台的旅游系统APP的设计(Eclipse,MySQL)
  19. win10系统无法访问ftp服务器地址,win10系统访问不了ftp的解决教程
  20. psvm怎么补全_vi/vim使用进阶: 自动补全

热门文章

  1. Asp.Net MVC4.0 官方教程 入门指南之一-- 入门介绍
  2. 系出名门Android(7) - 控件(View)之ZoomControls, Include, VideoView, WebView, RatingBar, Tab
  3. python字典获取关联值_【Python实战12】使用字典关联数据
  4. MongoDb分片集群认证
  5. Java的接口、继承与多态
  6. 添加dubbo.xsd的方法
  7. 转: telnet命令学习
  8. Window.document对象
  9. 初学者:如何使用虚拟PC将Windows 7安装到虚拟机
  10. icloud 购买存储空间_如何释放iCloud存储空间