1 引言

  在没有索引的情况下,如果要寻找特定行,数据库可能要遍历整个数据库,使用索引后,数据库可以根据索引找出这一行,极大提高查询效率。本文是对MySQL数据库中索引使用的总结。

2 索引简介

  索引是一个单独的、存储自磁盘上的数据库结构,包含着对数据表里所有记录的引用指针。使用索引用于快速找出在某个或多个列中有一特定值的行,所有MySQL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。

  小时候我们都用过现代汉语词典,当我们要查找某个字时,如果没有目录,我们需要一页一页去寻找,有了目录,直接根据目录就可以找到那个字。数据库中的索引就相当于现代汉语词典中的目
录,目录中存放在一个指向内容真实地址的指针,可以提高我们查找的速度。

  另外需要说明的是,索引是在存储引擎中实现的,因此,每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有的索引类型。MySQL中索引的存储类型有两种:BTREE和HASH,具体和表的存储引擎相关。MyISAM和InnoDB存储引擎只支持BTREE索引,MEMORY/HEAP存储引擎可以支持HASH和BTREE索引。

  索引的有点主要有一下几条:

  (1)通过创建唯一索引,可以保证数据库中每一行数据的唯一性。

  (2)可以大大加快数据的查询速度,这也是创建索引的最主要的原因。

  (3)在实现数据的参考完整性方面,可以加速表和表之间的连接。

  (4)在使用分组和排序子句进行数据查询时,也可以显著减少查询中分组和排序的时间。

  当然,索引也有许多不利方面,主要表现在以下几个方面:

  (1)创建索引和维护索引都要消耗时间,并且随着数据量的增加所耗费的时间也会增加。

  (2)索引需要占用磁盘空间。

  (3)对数据表进行增加、删除、修改时,索引也要动态维护,这样就降低了数据的维护速度。

3 索引的分类

  MySQL的索引可以分为以下几类:

  (1)普通索引和唯一索引

  普通索引和唯一索引是根据索引的功能来划分。

  普通索引是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值。

  唯一索引的索引列的值必须唯一,但允许空值。如果是组合索引,则列的值组合必须唯一。主键索引是一种特殊的唯一索引,不允许有空值。

  (2)单列索引和组合索引

  事实上,单列索引和组合索引的划分是根据创建索引时所引用的列的数量来划分。

  单列索引是只一个索引只包含单个列,一个表可以有多个单列索引。

  组合索引指在表的多个字段组合上创建索引,但只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。

  组合索引可以起到多个索引的作用,但是使用时并不是随便哪个字段都可以使用索引的,而是遵从“最左前缀”:利用索引中最左边的列集列匹配行,这样的列集称为最左前缀。例如由id、name、age这3个字段字段构成的索引,索引行中按id/name/age的顺序存放,索引可以搜索下面字段组合:(id, name , age)、(id , name)、(id)。如果不构成索引的最左边的前缀,MySQL不能使用局部索引,如(age)、(name, age)都不能使用索引进行查询。

  (3)全文索引

  全文索引类型为FULLTEXT,在定义索引的列上至此值需得全文查找,允许在这些索引列上插入空值和重复值。

  (4)空间索引

  很少用到,本文不涉及。

4 创建索引

  创建索引的方式有三种:

  (1)直接创建索引

  语法结果如下:

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name ON table_name (column(length),…) [ASC|DESC]

  a. 创建普通索引

create index bknameIndex on book(bookname) ;

  b. 创建唯一索引

create unique index unique_Index on book(bookId) ;

  c. 创建单列索引

create index single_Index on book(comment(10)) ;

  d. 创建多列索引

create index mutil_Index on book(authors(20) , info(20)) ;

  e. 创建全文索引

create fulltext index fulltext_Index on book(info) ;

  (2)通过修改表结构的方式添加索引

  语法结构如下:

ALTER TABLE table_name ADD [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] index_name (column(length),…) [ASC|DESC]

  a. 创建普通索引

alter table book add index bkName(bookname(30)) ;

  b. 创建唯一索引

alter table book add unique index uniqueIndex(bookId) ;

  c. 创建单列索引

alter table book add index signalIndex2 on(comment(50)) ;

  d. 创建多列索引

alter table book add index mutilIndex (authors(30) , info(50)) ;

  e. 创建全文索引

alter table book add fulltext index fulltextIndex (info) ;

  (3)创建表的时候同时创建索引

  语法结构如下:

CREATE TABLE table_name (
……(创建字段和约束),
[UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [INDEX|KEY] [index_name] (col_name [length]) [ASC|DESC]
)

  a. 创建普通索引

create table book(

     bookid int not null ,

     bookname VARCHAR(255) not null ,

     authors VARCHAR(255) not null ,

     info VARCHAR(255) not null ,

     comment VARCHAR(255) not null ,

     year_publication YEAR not null ,

     index pub_index(year_publication)

);

  b. 创建唯一索引

create table book(

     ……

     unique index pub_index(bookid)

);

  c. 创建单列索引

create table book(

     ……

     index single_index(authors)

);

  d. 多列索引

create table book(

     ……

     index mutil_index(bookid, authors)

);

  e. 创建全文索引

create table book(

     ……

     fulltext index fulltext_index(info)

);

  (注:MySQL5.7中默认存储引擎为InnoDB,在这里创建表时需要修改表的存储引擎为MyISAM,否则会出错)

5 删除索引

  (1)使用ALTER TABLE删除索引

  语法结构:

ALTER TABLE table_name DROP INDEX index_name ;

  (注:有AUTO_INCREMENT约束的字段的唯一索引不能被删除)

  示例:删除book表中名为fulltext_Index的索引

alter table book drop index fulltext_Index ;

  (2)使用DROP INDEX语句删除索引

  语法结构:

DROP INDEX index_name ON table_name ;

  示例:删除book表中名为fulltext_Index的索引

drop index mutil_index on book ;

6 索引设计原则

  索引设计不合理或者缺少索引都会对数据库性能造成不良影响。那么设计索引是该如何考虑呢?

  (1)索引并非越多越好,一个表中如果有大量的索引,不仅占用磁盘空间,而且会影响INSERT、DELETE、UPDATE等语句的性能,因为当表中的数据更改的同时,索引也会进行调整和更新。

  (2)数据量小的表最好不要使用索引,由于数据量较小,查询所花费的时间可能比表里索引的时间还要短,索引可能不会产生优化的效果。

  (3)避免对经常更新的表进行过多的索引,并且索引中的列尽可能少。对经常用于查询的字段应该创建索引,但要避免添加不必要的字段。

  (4)在条件表达式中经常用到的不同值较多的列上建立索引,在不同值很少的列(例如性别字段,只有男女两个取值)不要建立索引。

  (5)当唯一性是数据本身的特征时,指定唯一索引,可确保数据完整性并提高查询速度。

  (6)在频繁进行排序、分组的列上建立索引,如果排序的列有多个,可以在这些列上建立组合索引。

7 总结

本文从索引的概念入手,简单介绍了索引的特点和分类,并通过实例对创建和删除索引进行说明。索引是个好东西,但却并非多多益善,这一点在索引设计原则中有说到。

MySQL数据库之索引的更多相关文章

  1. 千万级MySQL数据库建立索引,提高性能的秘诀

    实践中如何优化MySQL 实践中,MySQL的优化主要涉及SQL语句及索引的优化.数据表结构的优化.系统配置的优化和硬件的优化四个方面,如下图所示: SQL语句及索引的优化 SQL语句的优化 SQL语 ...

  2. Mysql数据库的索引原理

    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将 ...

  3. MySQL数据库对象-索引

    1. 概述2. 索引分类2.1 不同索引的概念2.1.1 普通索引2.1.2 唯一索引2.1.3 全文索引2.1.4 多列索引3. 索引操作3.1 普通索引3.1.1 创建表时创建普通索引3.1.2 ...

  4. MySQL数据库_索引_事务_优化 _锁_存储引擎_存储过程_CAP

    ##一.基础 ## *    插入                   INSERT INTO table_name ( field1, field2,...fieldN )              ...

  5. MySQL数据库中索引的数据结构是什么?(B树和B+树的区别)

    B树(又叫平衡多路查找树) 注意B-树就是B树,-只是一个符号. B树的性质(一颗M阶B树的特性如下) 1.定义任意非叶子结点最多只有M个儿子,且M>2: 2.根结点的儿子数为[2, M]: 3 ...

  6. MySQL数据库之索引、事务、存储引擎详细讲解

    一.索引 1.1 索引的概念 索引是一个排序的列表,存储着索引值和这个值所对应的物理地址 无须对整个表进行扫描,通过物理地址就可以找到所需数据 (数据库索引类似书中的目录,通过目录就可以快速査找所需信 ...

  7. MYSQL数据库查询索引

    1.查看数据库所有索引 SELECT * FROM mysql.`innodb_index_stats` a WHERE a.`database_name` = '数据库名'; 2.查看某一表索引 S ...

  8. 为mysql数据库建立索引

    前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用MySQL的)都没有受过有关数据库的正规培训,尽管他们都为客户做过 ...

  9. Mysql数据库建立索引的优缺点有哪些?

    索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 什么是索引 数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 例如这样一个查询:select * ...

随机推荐

  1. word默认字体与大小

    对于红色地方单击,“正文框”按右键+修改 修改字体大小 修改中文和西文时的字体 注意宋体和宋体 (中文正文)是不同的

  2. 离线安装MySQL5.7

    无网络环境下安装MySQL5.7 前提: 1.系统环境:CentOS 7 64bit 2.需要的rpm包已经在本地 安装: 1.下载需要的rpm包: mysql-community-client-5. ...

  3. CM记录-CDH大数据平台实施经验总结2016(转载)

    CDH大数据平台实施经验总结2016(转载) 2016年负责实施了一个生产环境的大数据平台,用的CDH平台+docker容器的方式,过了快半年了,现在把总结发出来. 1. 平台规划注意事项 1.1 业 ...

  4. Linux之chkconfig命令

    chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...

  5. 蓝桥杯 带分数 DFS应用

    问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...

  6. spring+spring mvc+JdbcTemplate 入门小例子

    大家使用这个入门时候 最好能够去 搜一下 spring mvc 的 原理,我放一张图到这里,自己琢磨下,后面去学习就容易了 给个链接 (网上一把,千万不能懒)    https://www.cnblo ...

  7. 编写安全的API接口

    HTTPS接口参数加密签名设计思路 数名 类型 必选 描述 _appid string 是 调用方身份ID,接口提供方用此来识别调不同的调用者,该参数是API基本规范的一部分,请详见API公共规范. ...

  8. git学习——Git 基础要点【转】

    转自:http://blog.csdn.net/zeroboundary/article/details/10549555 简单地说,Git 究竟是怎样的一个系统呢?请注意,接下来的内容非常重要,若是 ...

  9. mysqldump只导出表结构或只导出数据的实现方法【转】

    mysql mysqldump 只导出表结构 不导出数据 mysqldump --opt -d 数据库名 -u root -p > xxx.sql 备份数据库 #mysqldump 数据库名 & ...

  10. free vmstat查看内存及系统调优【转】

    内存查看 查看内存是否存在瓶颈,使用top指令看比较麻烦,而free命令更为直观: [/home/weber#]free total used free shared buffers cached M ...