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

前言

现在的项目对于数据库操作基本上都是使用封装好的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综艺圈”,和我一起学习吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【个人阅读】软件工程M1/M2阶段总结

这次作业是好久以前布置的,由于学期末课程设计任务比较重,我在完善M2阶段的代码的同时又忙于数据库的实现和编译器的实现,一度感觉忙得透不过气来。。。。到这些都基本完成的时候,会看自己以前的阅读心得,觉得经过了M1…

Excel实用函数大全(名称、功能、说明、用法、举例)

我们在使用Excel制作表格整理数据的时候,常常要用到它的函数功能来自动统计处理表格中的数据。这里整理了Excel中使用频率最高的函数的功能、使用方法,以及这些函数在实际应用中的实例剖析,并配有详细的介绍。 1、ABS函数    函数名称:ABS    主要功能:求出相应数字…

DB2 SQL 递归实现多行合并

最终效果 原始数据: 转换脚本: WITH post_a AS ( SELECT DISTINCT T.EMP_NO,S.CODE_ FROM inscndb.DTFMA000_EMP_POST T ,VIEW_BI_POST S WHERE T.POST||-||POST2 S.POST ), post_b AS (SELECT emp_no,code_,ROW_NUMBER() OVER(PARTITION BY EMP_NO ORD…

C++之greater和less

1、greater、 less 他在头文件<functional>里面, greater和less都重载了操作符 定义如下: // TEMPLATE STRUCT greater template<class _Ty> struct greater : public binary_function<_Ty, _Ty, bool> { // functor for operator>bool operator()(cons…

mysql逻辑结构设计_数据库设计:逻辑结构设计

概念结构设计所得的E-R模型是对用户需求的一种抽象的表达形式&#xff0c;它独立于任何一种具体的数据模型&#xff0c;因而也不能为任何一个具体的DBMS所支持。为了能够建立起最终的物理系统&#xff0c;还需要将概念结构进一步转化为某一DBMS所支持的数据模型&#xff0c;然后…

.NET6之MiniAPI(二十五):Dapper

注&#xff1a;如果你使用Dapper一段时间了&#xff0c;这篇你可以跳过去了。在第十二篇中&#xff0c;我们聊过官方的ORM——EntityFramework&#xff0c;它可以把SQL细节都隐藏&#xff0c;这对于一些标准化的关系数据库项目非常便捷。今天&#xff0c;介绍另外一个流行的ORM…

移动端web开发整理

/* 移动端定义字体的代码 */body {   font-family: "Helvetica Neue", Helvetica; } ios端触摸时&#xff0c;会出现一个半透明灰色遮罩  如果想要禁用&#xff0c;可设置-webkit-tap-highlight-color的alpha值为0 body{-webkit-tap-highlight-color: rgba(0,0,…

LeetCode Implement Queue using Stacks (数据结构)

题意&#xff1a; 用栈来实现队列。 思路&#xff1a; 一个栈是不够的&#xff0c;至少要两个。 &#xff08;1&#xff09;插入。永远只插入到stack1中&#xff08;插到栈顶&#xff09;。 &#xff08;2&#xff09;弹出。如果stack2不为空&#xff0c;直接弹出stack2的栈顶&…

C++之STL之priority_queue

1、priority_queue介绍 priority_queue 是优先队列 模板声明带有三个参数,priority_queue<Type, Container, Functional> Type为数据类型,Container为保存数据的容器,Functional为元素比较方式 Container必须是用数组实现的容器,如 vector, deque不能用list, STL里面…

直角三角形知道两边求角度_每日一讲:解直角三角形(3.21)

考点一、直角三角形的性质 1、直角三角形的两个锐角互余&#xff1a;可表示如下&#xff1a;∠C90∠A∠B902、在直角三角形中&#xff0c;30角所对的直角边等于斜边的一半。3、直角三角形斜边上的中线等于斜边的一半4、勾股定理&#xff1a; 如果直角三角形的两直角边长分别为…

用VBA得到EXCEL表格中的行数和列数

用VBA得到EXCEL表格中的行数和列数 每种方法中上面的是Excel的行数&#xff0c;下面的是Excel的列数。 方法1: ActiveSheet.UsedRange.Rows.Count ActiveSheet.UsedRange.Columns.Count 缺点&#xff1a;有时可能会比实际数大一些&#xff0c;原因是如果你把最后几行&#xff0…

Javascript屏蔽鼠标的右键的两种方法。

方法一&#xff1a;利用鼠标button的键值 <script language"javascript">function blockright(oEvent) {var oDiv document.getElementById("display");if (window.event) oEvent window.event; //处理兼容性&#xff0c;获得事件对象if (oEvent.b…

Blazor University (4)组件 — 单向绑定

原文链接&#xff1a;https://blazor-university.com/components/one-way-binding/单向绑定源代码[1]此时我们在页面内显示了一个组件&#xff0c;但内容是静态的。我们真正想要的是能够动态输出内容。如果我们更改 /Components/MyFirstComponent.razor 的内容&#xff0c;我们…

Java Web项目开发流程

2019独角兽企业重金招聘Python工程师标准>>> 1.Web项目开发流程图解 2.Web项目开发的细节&#xff08;转载&#xff09; 任何一个项目或者系统开发之前都需要定制一个开发约定和规则&#xff0c;这样有利于项目的整体风格统一、代码维护和扩展。由于Web项目开发的分…

OpenGL中shader使用

引自&#xff1a;http://blog.csdn.net/wl_soft50/article/details/7916720 http://blog.sina.com.cn/s/blog_923fdd9b0102vbe0.html 与OpenGL ES1.x渲染管线相比&#xff0c;OpenGL ES 2.0渲染管线中“顶点着色器”取代了OpenGL ES 1.x渲染管线中的“变换和光照”&#xff1b;…

mysql输出代码_mysql常用代码

1、mysql导出和导入导入&#xff1a;mysql -uroot -p --default-character-setutf8 数据库名 < 数据SQL文件导出&#xff1a;mysqldump --opt -R -E -u root --password1234 数据库名 > 数据SQL文件.sql2、检查某表字段是否有NULLset dbname库名,tbname表名;select con…

贪心算法之最短路径问题(Dijkstra算法)

1、问题 一个求单源最短路径的问题。给定有向带权图 G =(V, E ), 其中每条边的权是非负实数。此外,给定 V 中的一个顶点, 称为源点。现在要计算从源到所有其他各顶点的最短路径长 度,这里路径长度指路上各边的权之和。 2、分析 3、代码实现 1、普通C++实现 #include &l…

【ArcGIS风暴】ArcGIS获取线段上等间距的点

题目&#xff1a;现需要沿某条道路等间距安装路灯&#xff0c;请给出路灯点的位置及其坐标 实现思路&#xff1a; 一、数字化道路&#xff0c;获取Road线状矢量数据&#xff08;如shapefile文件&#xff09;。 二、在开始编辑状态下&#xff0c;执行Divide命令&#xff0c;按…

Centos实现svn本地认证apache认证

本文系统&#xff1a;Centos6.5_x64 本地lamp环境 ip:192.168.184.129一、搭建svn&#xff0c;实现svn方式访问、本地用户认证二、实现http方式访问、apache本地文件认证subversion目录说明&#xff1a;*dav目录&#xff1a;是提供apache与mod_dav_svn使用的目录&#xff0c;让…

ASP.NET Core 6.0对热重载的支持

.NET 热重载技术支持将代码更改&#xff08;包括对样式表的更改&#xff09;实时应用到正在运行的程序中&#xff0c;不需要重启应用&#xff0c;也不会丢失应用状态。一、整体介绍目前 ASP.NET Core 6.0 项目都支持热重载。在以下情况下支持应用的热重载&#xff1a;1. 仅运行…