一、索引的本质:

数据库查询是数据库的最主要的功能之一,数据库系统的设计者从查询算法的角度对数据库进行了一定的优化。

最基本的顺序查找算法的复杂度为O(n),在数据量很大的时候算法的效率是很低的。虽然也有一些更优秀的查询算法:二分查找、二叉树查找,但这些算法都只能应用在特定的数据结构之上,如二分查找要求被检索数据本身是有序的、二叉查找则只能应用在二叉查找树上。但数据本身的组织结构不可能完全满足各种数据结构。

因此,在数据之外,数据库系统还维护这满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据。这样就可以在这些数据结构之上实现高级查找算法。这种数据结构,就是索引。


二、索引的分类

  • 普通索引:这是最基本的索引,而且没有唯一性之类的限制。普通索引可以通过以下集中方式创建:
    1. 在已经创建好的表之上添加索引:create index 索引名 on 表名(列名1,列名2,...);
    2. 修改表来添加索引:alter table 表名 add index 索引名(列名2,列名2,...);
    3. 创建表的时候指定索引:create table 表名([...],index 索引名(列名1,列名2,...);
  • 唯一索引:表示唯一,不允许有重复的索引。如果某字段信息保证不会重复用作索引时,可以设置为unique。唯一索引也有三种方式创建:
    1. 在已经创建好的表之上添加索引:create unique index 索引名 on 表名(列名1,列名2,...);
    2. 修改表来添加索引:alter table 表名 add unique 索引名(列名2,列名2,...);
    3. 创建表的时候指定索引:create table 表名([...],unique 索引名(列名1,列名2,...);
  • 主键索引:是一种唯一索引,同时它必须指定为"primary key":
    1. 主键一般在创建表的时候指定:create table 表名([...],primary key (列名));
    2. 修改表的时候加入主键也是可以的: alter table 表名 add primary key(列名);

三、索引选择原则

  1. 比较频繁的作为查询条件的字段应该创建索引
  2. 唯一性太差的字段不适合单独创
    建索引,即使频繁作为查询条件
  3. 更新非常频繁的字段不适合创建索引
  4. 不会出现在WHERE子句中的字段不该创建索引

四、索引的弊端

       索引能极大提高数据检索的效率,但有一个不能忽略的问题是,索引是完全独立于基础数据之外的一部分数据——也就是索引要占据额外的存储空间。
       另外,数据库还要腾出部分开销用于维护索引。索引虽然能增加查询的效率,但是降低了其他操作的效率。数据表有变化影响到索引时,数据库也必须随时调整索引。

MySQL进阶之索引的更多相关文章

  1. 数据库 MySQL进阶之索引

    数据库的索引非常重要,基本面试数据库的问题都在索引上,所以这里小编整理出来,一方面为了自己复习,一方面也方便大家. 一,索引前传 在了解数据库索引之前,首先有必要了解一下数据库索引的数据结构基础,那么 ...

  2. MySQL 进阶之索引

    一,索引前传 在了解数据库索引之前,首先有必要了解一下数据库索引的数据结构基础,那么什么样的数据结构可以作为索引呢? B-tree是最常用的用于索引的数据结构.因为它们是时间复杂度低, 查找.删除.插 ...

  3. mysql进阶(二)索引简易教程

    Mysql索引简易教程 基本概念 索引是指把你设置为索引的字段A的内容储存在一个独立区间S里,里面只有这个字段的内容.在找查这个与这个字段A的内容时会直接从这个独立区间里查找,而不是去到数据表里查找. ...

  4. MySQL进阶篇(03):合理的使用索引结构和查询

    本文源码:GitHub·点这里 || GitEE·点这里 一.高性能索引 1.查询性能问题 在MySQL使用的过程中,所谓的性能问题,在大部分的场景下都是指查询的性能,导致查询缓慢的根本原因是数据量的 ...

  5. mysql进阶(二十七)数据库索引原理

    mysql进阶(二十七)数据库索引原理 前言   本文主要是阐述MySQL索引机制,主要是说明存储引擎Innodb.   第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础.    ...

  6. mysql进阶(二十六)MySQL 索引类型(初学者必看)

    mysql进阶(二十六)MySQL 索引类型(初学者必看)   索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型.   在数 ...

  7. Python进阶----索引原理,mysql常见的索引,索引的使用,索引的优化,不能命中索引的情况,explain执行计划,慢查询和慢日志, 多表联查优化

    Python进阶----索引原理,mysql常见的索引,索引的使用,索引的优化,不能命中索引的情况,explain执行计划,慢查询和慢日志, 多表联查优化 一丶索引原理 什么是索引:       索引 ...

  8. MySQL进阶篇(02):索引体系划分,B-Tree结构说明

    本文源码:GitHub·点这里 || GitEE·点这里 一.索引简介 1.基本概念 首先要明确索引是什么:索引是一种数据结构,数据结构是计算机存储.组织数据的方式,是指相互之间存在一种或多种特定关系 ...

  9. mysql进阶(二)之细谈索引、分页与慢日志

    索引 1.数据库索引 数据库索引是一种数据结构,可以以额外的写入和存储空间为代价来提高数据库表上的数据检索操作的速度,以维护索引数据结构.索引用于快速定位数据,而无需在每次访问数据库表时搜索数据库表中 ...

随机推荐

  1. linux下的cron定时任务知识梳理

    1 cron定时任务 1.1 cron介绍 为什么需要cron定时任务? 1)cron服务在安装完Linux系统后就默认就存在,主要用来定期执行命令或定期执行指定的应用程序; 2)cron服务默认情况 ...

  2. Django使用 djcelery时报ImportError: No module named south.db错误

    这时候可能是安装的Django-celery.celery的版本过低引起的,可以到pycharm查看推荐的版本,把版本更换到的推荐的版本就解决了

  3. 搭建fastdfs文件服务器

    一.安装FastDFS环境 1.跟踪服务器(Tracker Server) tracker1:192.168.2.134 tracker2:192.168.2.135 2.存储服务器(Storage ...

  4. 图像分割:Semantic/Instance/Panoramic Segmentation

    一. 背景介绍 语义分割(Semantic Segmentation):对一张图片上的所有像素点进行分类,同一物体的不同实例不需要单独分割出来. 实例分割(Instance Segmentation) ...

  5. C#中的WinFrom技术实现串口通讯助手(附源码)

    C#中的WinFrom技术实现串口通讯助手(附源码)   实现的功能: 1.实现自动加载可用串口. 2.打开串口,并且使用C#状态栏显示串口的状态. 3.实现了串口的接收数据和发送数据功能. 4.串口 ...

  6. java面对对象入门(4)-程序块初始化

    Java实例初始化程序是在执行构造函数代码之前执行的代码块.每当我们创建一个新对象时,这些初始化程序就会运行. 1.实例初始化语法 用花括号创建实例初始化程序块.对象初始化语句写在括号内. publi ...

  7. 02-flink时间语义 与 Window 基础概念与实现原理

    Flink 多种时间语义对比 Flink 在流应用程序中支持不同的 Time 概念,就比如有 Processing Time.Event Time 和 Ingestion Time.下面我们一起来看看 ...

  8. Mac 下如何快速重启 Dock 栏?

    两种方法. 如果Dock栏出现了问题或是没有反应,请打开Launchpad并按下Command+D键. 这样就可以关闭Dock栏并重启它,效果和经常用到的killall Dock命令相同.

  9. mybatis 配置--->确认jar包是否正确

    mybatis 配置之前,首先要确保服务器jar包是否成功 配置jar包如下添加mybaties-3.5.2. jar, maven 的 pom.xml 配置如下,查看配置是否成功见 如上分类 Mav ...

  10. mybatis_day02

    2.映射器Mapper 相当于dao层,不用写实现类(mybatis底层会采用动态代理模式 会跟我生成实现) 步骤: (1) 创建项目 配置mybatis-config.xml 和昨天一样 (2) 创 ...