• 什么是索引
  • 索引的四大作用 (参考百度百科:百度百科-索引
  • 索引的优缺点
  • 索引分类
  • 什么地方需要建索引
  • 索引优化

什么是索引?

  宏观来说,索引是一种检索工具,目录也是一种检索工具,但是两者是有区是别的
  官方概念是说:
  索引与目录的根本区别就在于著录的对象不同,目录所著录的是一个
  完整的出版单位,如一种图书、一种期刊等,而索引所著录的则是完整的出版物的
  某一部分、某一观点、某一知识单元、一种期刊等;
  简单来说,
  目录能定位到一本书,而索引能定位到这本书的一段内容或是更细的一行文字。

  在关系型数据库中,索引是一个特有术语:
  在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,
  它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
  简单来说,
  有了索引,可以通过索引找到指定列的指定记录

索引的四大作用

  ①更快读取数据(至于为什么能加快速度,可参考博文:(转)深入浅出数据库索引原理 | (转)MySql数据库索引原理);
  ②保证数据记录的唯一性(唯一索引确保的);
  ③实现表与表之间的参照完整性;
    ### 这里穿插一些关于数据库完整性的概念(参考百度文库文档:(转)文库文档):
      1)参照完整性
        作用:保证数据之间的完整性;
        实现:在数据库设计器中设计表之间的联系时,要在父表中建立主索引或候选索引,在子表中建立普通索引,

        然后通过父表的主索引(候选索引)和子表的普通索引建立起两个表之间的联系。
      2)实体完整性
        作用:保证表中记录唯一的特性;
        实现:主关键字建立主索引/唯一索引;
      3)域完整性
        作用:保证表中字段的正确性;
        实现:通过限定字段的类型、字段(表)有效性规则、默认值来实现;
  ④在使用ORDER by、group by子句进行数据检索时,利用索引可以减少排序和分组的时间;

索引的优缺点

  优点:

  1、大大加快数据的检索速度;
  2、创建唯一性的索引,保证数据库表中每一行数据的唯一性;
  3、加速表与表之间的连接;
  4、在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间;

  缺点:

  1、索引需要占用物理空间;
  2、当对表中的数据进行增加、删除和修改的时候,索引也要有动态的维护,降低了数据的维护速度;

索引分类

   普通索引

  最基本的索引类型,没有唯一性之类的限制。

//创建索引
create index my_index on my_table(username(15));
//修改索引
alter table my_table add index my_index(my_column);
//创建表时创建索引
create table my_table(
id int not null,
username varchar(15) not null,
index my_index (username(15))
);
//删除索引
drop index my_index;

  唯一索引(关键词:unique)

  唯一索引是不允许其中任何两行具有相同索引值的索引(与主键索引的区别是唯一索可允许为空而主键索引不能)。

//创建唯一索引
create unique my_index on my_table(username(15));
//修改唯一索引
alter table my_table add unique my_index(my_column);
//创建表时创建唯一索引
create table my_table(
id int not null,
username varchar(15) not null,
unique my_index (username(15))
);
//删除索引
drop index my_index;
//显示索引信息
show index from my_table;

  主键索引

  在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型(主键索引=唯一索引+非空);

  候选索引

  与主索引一样要求字段值的唯一性,并决定了处理记录的顺序。

    聚集索引(关键词:clustered)

  也称为聚簇索引,在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引;例如时间、年份、这类可以排序的列就可用聚集索引;

    非聚集索引(关键词:nonclustered)

  也叫非簇索引,在非聚集索引中,数据库表中记录的物理顺序与索引顺序可以不相同。一个表中只能有一个聚集索引,但表中的每一列都可以有自己的非聚集索引;

什么地方需要建索引(参考原文:(转)Mysql哪些地方需要建立索引

  1、表的主键、外键必须有索引;

  2、数据量超过300的表应该有索引;

  3、经常与其他表进行连接的表,在连接字段上应该建立索引;

  4、经常出现在where子句中的字段,特别是大表的字段,应该建立索引;

  5、索引应该建立在选择性高的字段上;

  6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;

  7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替;

    a、正确选择复合索引中的主列字段,一般是选择性较好的字段;

    b、复合索引的几个字段是否经常以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;

    c、如果复合索引中包含的字段经常单独出现在where子句中,则分解为多个单字段索引;

    d、如果复合索引中包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;

    e、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

  8、频繁进行数据操作的表,不要建立太多的索引;

  9、删除无用的索引,避免对执行计划造成负面影响;

索引优化

  暂无,详解可参考:(转)MySQL 索引及优化实战

索引-mysql的更多相关文章

  1. mysql 添加索引 mysql 创建索引

    1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引 ...

  2. macOS安装Solr并索引MySQL

    安装 Java 语言的软件开发工具包 brew cask install java 或者在 Oracle官网 中选择 Mac 版本 jdk-8u111-macosx-x64.dmg 下载并安装. 安装 ...

  3. 真分布式SolrCloud+Zookeeper+tomcat搭建、索引Mysql数据库、IK中文分词器配置以及web项目中solr的应用(1)

    版权声明:本文为博主原创文章,转载请注明本文地址.http://www.cnblogs.com/o0Iris0o/p/5813856.html 内容介绍: 真分布式SolrCloud+Zookeepe ...

  4. mysql 添加索引 mysql 如何创建索引

    1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引 ...

  5. 使用Solr索引MySQL数据

    环境搭建 1.到apache下载solr,地址:http://mirrors.hust.edu.cn/apache/lucene/solr/ 2.解压到某个目录 3.cd into D:\Solr\s ...

  6. 使用sphinx索引mysql数据

    数据库表如下 mysql> select * from tb_account; +----+-------+------+ | id | name | age | +----+-------+- ...

  7. solr5.5索引mysql数据(新手总结)

    一 solr5.5环境部署到Eclipse(luna版) solr部署参见:http://blog.csdn.net/csmnjk/article/details/64121765 二 Ik分词器设置 ...

  8. 为什么用B+树做索引&MySQL存储引擎简介

    索引的数据结构 为什么不是二叉树,红黑树什么的呢? 首先,一般来说,索引本身也很大,不可能全部存在内存中,因此索引往往以索引文件的方式存在磁盘上.然后一般一个结点一个磁盘块,也就是读一个结点要进行一次 ...

  9. 索引-mysql索引创建、查看、删除及使用示例

    mysql索引创建.查看.删除及使用示例 1.创建索引: ALTER TABLE用来创建普通索引.UNIQUE索引或PRIMARY KEY索引. ALTER TABLE table_name ADD ...

随机推荐

  1. .NET Core实战项目之CMS 第四章 入门篇-Git的快速入门及实战演练

    写在前面 上篇文章我带着大家通过分析了一遍ASP.NET Core的源码了解了它的启动过程,然后又带着大家熟悉了一遍配置文件的加载方式,最后引出了依赖注入以及控制反转的概念!如果大家把前面几张都理解了 ...

  2. 我的2017OKR - 年中回顾

    自从订阅了吴军老师的<硅谷来信>之后,对其中一篇介绍Google的目标管理方法OKR的文章记忆犹新.想到自己喜欢在每年年初的时候给自己定制一些规划,于是乎了解了一下OKR并重构了一下我的2 ...

  3. asp.net core 系列 2 启动Startup类介绍

    一.Startup类 ASP.NET Core 应用是一个控制台应用,它在其 Program.Main 方法中创建 Web 服务器.其中Main方法是应用的托管入口点,Main 方法调用 WebHos ...

  4. [转载] Relearning to Learn - 学会学习

    学会学习 说明: 本文是在阅读了下述博客后, 所作的梳理与总结, 原文链接是: 学会学习 阅读和理解是不够的, 你还需要记住你学的内容. 可通过把知识讲给不懂的人听, 抓住细节, 讲清讲透, 从而加深 ...

  5. Python SQLalchemy的学习与使用

    SQLAlchemy是python中最著名的ORM(Object Relationship Mapping)框架了. 前言:什么是ORM? ORM操作是所有完整软件中后端处理最重要的一部分,主要完成了 ...

  6. express中间件系统的基本实现

    一直觉得express的中间件系统这种流式处理非常形象,就好像加工流水线一样,每个环节都在针对同一个产品的不同部分完成自己的工作,最后得到一个成品.今天就来实现一个简易的[中间件队列]. 一. API ...

  7. “/"应用程序中的服务器错误

    运行ASP.NET MVC项目时,出现了如下错误: 在网上搜索了很久并没有找到有用的答案,后来请朋友看了一下,最后改了端口号才运行成功,错误应该是之前的端口号被占用导致的.

  8. [Go] golang缓冲通道实现资源池

    go的pool资源池:1.当有多个并发请求的时候,比如需要查询数据库2.先创建一个2个容量的数据库连接资源池3.当一个请求过来的时候,去资源池里请求连接资源,肯定是空的就创建一个连接,执行查询,结束后 ...

  9. [Go] golang原子函数实现goroutine同步

    启动了两个goroutine,并完成一些工作.在各自循环的每次迭代之后,在goroutine 会使用LoadInt64 来检查shutdown 变量的值.这个函数会安全地返回shutdown 变量的一 ...

  10. C# /VB.NET操作Word批注(一)—— 插入、修改、删除Word批注

    批注内容可以是对某段文字或内容的注释,也可以是对文段中心思想的概括提要,或者是对文章内容的评判.疑问,以及在阅读时给自己或他人起到提示作用.本篇文章中将介绍如何在C#中操作Word批注,主要包含以下要 ...