索引用来加速查询。正常来说,当查询数据时,MySQL 需要从表的第一条记录开始,读取整个表的内容,进行查询。

但如果有索引,MySQL 可根据索引快速定位需要查询条目的具体位置,加快了查询速度。

原理

索引的原理是将被索引列的值,单独取出来存到另一种结构中以获取快速查询的效果。

当列有这些属性中任意一个时,会被索引, PRIMARY KEYUNIQUEINDEX, 以及 FULLTEXT

大部分索引以 B-trees 结构存储。但有些例外:

  • Spatial Data 数据类型,一种基于地理坐标使用数字来标识现实中对象的数据类型,使用 R-trees
  • MEMORY 内存表同时支持使用 hash 索引
  • InnoDB 引擎中对于全文本索引(FULLTEXT)直接使用列表(lists)结构。

MySQL 使用索引的场景

以下场景将借助或依赖于索引:

  • 使用 WHERE 进行条件查询时
  • 用于排除一些记录。存在多个索引可选时,MySQL 选择会获取最小记录的那个索引(the most selective index)。
  • 存在多列索引的情况下,从左排开始的列的组合都可用于查询时的优化。比如三个索引列 (col1, col2, col3),查询时可以有这些组合的优化查询 (col1), (col1, col2), and (col1, col2, col3),详见 Section 8.3.6, “Multiple-Column Indexes”
  • 联表查询时。特别地,如果列的类型及大小相同的话,查询时会更加高效。比如 VARCHAR 和 CHAR 会当成同一类型,VARCHAR(10) and CHAR(15) 则不是同一类型,因为长度不同。
  • 使用 MIN()MAX() 函数时。
  • 进行排序或分组时。
  • 某些情况下,仅仅通过索引就能完成查询操作,无须操作真实的表记录。这种提供了查询中足够信息的索引被称为 covering index

索引并不是万能的,对于数据量小的表以及对于那些查询全部数据的操作,索引的效果并不明显。相反,对于那些查询时涉及到表中大部分数据的情况下,逐条查询比使用索引要快。

索引的类型

主要有以下四种索引类型,关于创建索引的其他详情可参见 MySQL Manual - 13.1.15 CREATE INDEX Syntax

  • Index Prefixes
  • FULLTEXT 索引
  • Spatial 索引
  • MEMORY Storage Engine 中的索引

Index Prefixes

对于字符串类型的列,在索引创建语法中指定 col_name(N),可将该列中前 N 个字符进行索引。通过只索引列中前 N 个字符 而非整列,可有效减小索引大小。比如索引 BLOB or TEXT 类型的列:

CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));

查询时,如果查询项超过了索引长度,索引将用来排除掉那些在索引长度范围内匹配失败的记录,剩下的记录则正常查询。

FULLTEXT 索引

全文本索引用于全文本(full-text)的搜索。只 InnoDBMyISAM 两种引擎下的 CHAR,VARCHAR,TEXT 数据类型支持全文本索引。不像 Index Prefixes,该类型的索引是会对整列的。

Spatial 索引

Spatial Data 数据类型 上创建的索引。

MEMORY Storage Engine 中的索引

MEMORY 存储引擎默认使用 HASH 索引,但也支持 BTREE 索引。

索引的创建

索引可在创建表时创建,参考 13.1.20 CREATE TABLE Syntax,也可针对已有的表进行创建,使用 CREATE INDEX 语句。

创建索引的语法
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
[index_type]
ON tbl_name (key_part,...)
[index_option]
[algorithm_option | lock_option] ... key_part: {col_name [(length)] | (expr)} [ASC | DESC] index_option:

KEY_BLOCK_SIZE [=] value

| index_type

| WITH PARSER parser_name

| COMMENT 'string'

| {VISIBLE | INVISIBLE} index_type:

USING {BTREE | HASH} algorithm_option:

ALGORITHM [=] {DEFAULT | INPLACE | COPY} lock_option:

LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}

有如下类型的索引指定方式,

  • 以列前缀的方/Column Prefix Key Parts
  • 函数形式/Functional Key Parts
  • Unique 索引
  • Full-Text 索引
  • Spatial 索引

以列前缀的方

可用于创建列中指定前缀部分 col_name(length) 的索引。

示例:

CREATE INDEX part_of_name ON customer (name(10));

以上语句对名为 name 的例索引其前 10 个字符。

函数形式

普通形式的索引只能索引列中的值,比如:

CREATE TABLE t1 (
col1 VARCHAR(10),
col2 VARCHAR(20),
INDEX (col1, col2(10))
);

以上语句对 col1 整列 及 col2 前 10 个字符进行索引。

但使用函数形式,可创建针对表达式的索引,而不是表中的列。

CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);

函数形式的索引在定义时需要满足以下的条件,否则抛错:

  • 表达式使用括号包裹,以和列名或列的其他前缀属性区别开来。
/* 												

MySQL 中的索引的更多相关文章

  1. MySQL(五) MySQL中的索引详讲

    序言 之前写到MySQL对表的增删改查(查询最为重要)后,就感觉MySQL就差不多学完了,没有想继续学下去的心态了,原因可能是由于别人的影响,觉得对于MySQL来说,知道了一些复杂的查询,就够了,但是 ...

  2. 一、MySQL中的索引 二、MySQL中的函数 三、MySQL数据库的备份和恢复 四、数据库设计和优化(重点)

    一.MySQL中的索引###<1>索引的概念 索引就是一种数据结构(高效获取数据),在mysql中以文件的方式存在.存储建立了索引列的地址或者指向. 文件 :(以某种数据 结构存放) 存放 ...

  3. MySQL中的索引详讲

    一.什么是索引?为什么要建立索引? 索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的 ...

  4. mysql 中添加索引的三种方法

    原文:http://www.andyqian.com/2016/04/06/database/mysqleindex/ 在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以 ...

  5. (转)MySQL中的索引详讲

    序言 之前写到MySQL对表的增删改查(查询最为重要)后,就感觉MySQL就差不多学完了,没有想继续学下去的心态了,原因可能是由于别人的影响,觉得对于MySQL来说,知道了一些复杂的查询,就够了,但是 ...

  6. MySQL中是索引

    MySQL中是索引: --.唯一索引: 一行中的内容不能一样, create t2( id int , num int, unique weiyisuiyin (id,num) ) --唯一; --约 ...

  7. 一步一步带你入门MySQL中的索引和锁 (转)

    出处: 一步一步带你入门MySQL中的索引和锁 索引 索引常见的几种类型 索引常见的类型有哈希索引,有序数组索引,二叉树索引,跳表等等.本文主要探讨 MySQL 的默认存储引擎 InnoDB 的索引结 ...

  8. MySQL中的索引优化

    MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 过多的使用索引将会造成滥用.因此索引也会有它的缺点.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 ...

  9. MySQL中的索引简介

    MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 一. 索引的优点 为什么要创建索引?这是因为,创建索引可以大大提高系统的查询性能. 第一.通过创建唯一性索引,可以保 ...

  10. java面试一日一题:讲下mysql中的索引

    问题:请讲下mysql中的索引 分析:mysql中有很多索引,要对对这些索引有所掌握,还要弄清楚每种索引的本质? 回答要点: 主要从以下几点去考虑 1.索引的本质是什么 2.mysql的索引分类: 3 ...

随机推荐

  1. vue-router之前端路由的学习总结

    什么是路由 路由就是通过互联网把信息从源地址传输到目的地的活动 --维基百科 举例路由器: 路由器提供了两种机制:路由和转送 路由是决定数据包从来源到目的地的路径 转送将输入端的数据转移到合适的输出端 ...

  2. IT兄弟连 HTML5教程 CSS3揭秘 CSS常见的样式属性和值4

    6  鼠标光标属性 在网页中默认的鼠标指针只有两种,一种是最普通的箭头,另一种是当移动到链接上时出现的“小手”.但现在越来越多的网页都使用了CSS鼠标指针技术,当将鼠标移动到链接上时,可以看到多种不同 ...

  3. BootStrap 关于input与btn的点击focus取消特效相关css

    取消btn按钮点击出现的外边框: .btn:focus, /*清除btn按钮点击出现的边框*/.btn:active:focus,.btn.active:focus,.btn.focus,.btn:a ...

  4. jquery使用on()方法绑定的事件被执行多次的问题

    jQuery用on()方法绑定了事件之后,在代码执行过程中,可能会遇到事件被多次执行的情况. 本来以为是事件冒泡的问题,后来发现是on()方法的特性引起的问题. 简单还原一下问题的场景 这里简单还原一 ...

  5. 前端深入之js篇丨Array数组操作从入门到成神Up Up Up,持续更新中

    写在前面 随着前端深入的不断学习,发现数组这个数据结构在前端中有着相当大的存在感,由于我初学前端的时候并没有系统性的学习数组,所以我将通过这篇文章同你一起学习数组,希望我们能一起进步,学会熟练操作数组 ...

  6. VS2019 .Net Core 3.0 Web 项目启用动态编译

    VS2019 中 .Net Core 3.0 项目默认没有启用动态编译, 这导致按F5调试的时候,修改了 HTML 代码,在浏览器上刷新没有效果. 启用动态编译方法如下: 1. 安装 Microsof ...

  7. golang中,new和make的区别

    在golang中,make和new都是分配内存的,但是它们之间还是有些区别的,只有理解了它们之间的不同,才能在合适的场合使用. 简单来说,new只是分配内存,不初始化内存: 而make即分配又初始化内 ...

  8. JavaWeb问题记录——SessionIdGeneratorBase.createSecureRandom

    JavaWeb问题记录——SessionIdGeneratorBase.createSecureRandom 摘要:本文主要记录了在启动Tomcat时,出现的一个警告以及解决办法. 部分内容来自以下博 ...

  9. Node JS爬虫: 阮老师网站背景图

    小白,轻喷,本文教你三分钟入门爬虫 前言 有一天发现,阮一峰老师的博客图片很好看,想收藏一下,因为几百张,一张张下载太慢,朋友推荐了个谷歌插件(Fatkun)确实挺好用的,这之后就对爬虫有了兴趣,这个 ...

  10. 浅谈Django基础(HttpResponse、render、redirect)

    1. 使用之前先导入他们 from django.shortcuts import HttpResponse, render, redirect 2. HttpResponse: 它是作用是内部传入一 ...