MySQL索引总结(Index Type)

目录
  • MySQL Index
  • 1.创建和删除索引
  • 2. 索引类型

MySQL Index

索引是一种数据结构,可以是B-tree、R-tree、或者hash结构。其中,B-tree适用于查找某范围内的数据,可以快速地从当前数据找到吓一跳数据;R-tree常用于查询比较接近的数据;hash结构适用于随机访问场景,查找每条数据时间几乎一致。

优化查询的有效方法是为经常查询的字段建立索引,如无索引查询数据时,会遍历整张表;若建立索引后查找起来会更快速。当进行update、delete、insert操作时,mysql会自动更新索引信息。

1.创建和删除索引

mysql> create index idx_name on tab_name ( col_name );

mysql> alter table tab_name ADD index idx_name ( col_name );

使用create index 需要制定索引名,而用alter table创建时,可以不指定索引名,mysql会自动生成索引名。
若不想用存储引擎默认索引类型,可以指定索引类型:

mysql> alter table tab_name ADD index idx_name ( col_name ) using btree;

2. 索引类型

Btree 适合连续读取数据

  • Rtree 适合根据一条数据 找附近的数据
  • Hash 适合随机读取数据
  • FullText 全文索引,建立倒排索引,适用于判断字段是否包含问题,例如 like“%ss%”
  • Spatial 空间索引,是对空间数据类型的字段建立的索引

索引有如下几种情况:

  • index索引:通常意义的索引
  • unique索引:唯一索引,保证了列不包含重复的值,对于多列唯一索引,它保证值的组合不重复。
  • primary key索引:unique索引的一种,一个表只能有一个primary key

MySQL提供多种索引供选择:

普通索引
最基本的索引类型,没有唯一性限制,通过以下方式创建:
创建索引:create index idx_name on tab_name (col_name);
修改表:Alter table tab_name add index idx_name (col_name);

唯一性索引
与普通索引的区别:索引列的所有值都只能出现一次,即必须唯一。唯一性索引通过以下方式创建:
创建索引 create unique index idx_name on tab_name (col_name);

主键
一种唯一性索引,一个表只有一个。
一般在创建表的时候指定:create table tab_name(…, primary key (col_name));

外键
一般Alter table构建

全文索引
可以在varchar或者text类型列上创建。
通过alter table 或 create index命令创建全文索引要比记录插入带有全文索引的空表更快。

单列索引/多列索引
索引可以是单列索引,也可以是多列索引。为提高搜索效率,需要考虑使用多列索引。
Alter table tab_name add index idx_name (col_name1, col_name2, col_name3);
由于索引文件以B树格式保存。MySQL可以立即找到合适的col_name1, 然后再转到合适的col_name2, 最后转到合适的col_name3。在没有扫描数据文件任何一个记录的情况下,MySQL可以正确地找出了搜索的目标记录。

最左前缀
多列索引在满足最左前缀时会被使用:col_name1, col_name2, col_name3;col_name1, col_name2;col_name1。

到此这篇关于MySQL索引总结(Index Type)的文章就介绍到这了,更多相关MySQL Index Type内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL 创建索引(Create Index)的方法和语法结构及例子

    CREATE INDEX Syntax CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...) [index_type] index_col_name: col_name [(length)] [ASC | DESC] index_type: USING {BTREE | HASH | RTREE} 复制代码 代码如下: -- 创建无索引的表格 create t

  • mysql 的indexof函数用法说明

    如下所示: LOCATE(substr,str) 返回子串substr在字符串str第一个出现的位置,如果substr不是在str里面,返回0. mysql> select LOCATE('bar', 'foobarbar'); -> 4 mysql> select LOCATE('xbar', 'foobar'); -> 0 补充:mysql中类似indexOf的方法LOCATE() LOCATE(substr, str), LOCATE(substr, str, pos) 第一

  • MySQL 8.0 之索引跳跃扫描(Index Skip Scan)

    前言 MySQL 8.0.13开始支持 index skip scan 也即索引跳跃扫描.该优化方式支持那些SQL在不符合组合索引最左前缀的原则的情况,优化器依然能组使用组合索引. talk is cheap ,show me the code 实践 使用官方文档的例子,构造数据 mysql> CREATE TABLE t1 (f1 INT NOT NULL, f2 INT NOT NULL, PRIMARY KEY(f1, f2)); Query OK, 0 rows affected (0.

  • Mysql中key和index的区别点整理

    我们先来看下代码: ALTER TABLE reportblockdetail ADD KEY taskcode (taskcode) ALTER TABLE reportblockdetail DROP KEY taskcode 嗯这确实是比较容易混淆的地方. 在我们使用MySQL中可能压根不会注意这个问题,因为大多数情况下他们展示出来的效果都差不多,但是还是不能将他们划等号(至少理论上是这样) 索引(index)和约束(key)的区别主要在于二者的出发点不同,索引(index)负责维护表的查

  • 简单谈谈MySQL的loose index scan

    众所周知,InnoDB采用IOT(index organization table)即所谓的索引组织表,而叶子节点也就存放了所有的数据,这就意味着,数据总是按照某种顺序存储的.所以问题来了,如果是这样一个语句,执行起来应该是怎么样的呢?语句如下: select count(distinct a) from table1; 列a上有一个索引,那么按照简单的想法来讲,如何扫描呢?很简单,一条一条的扫描,这样一来,其实做了一次索引全扫描,效率很差.这种扫描方式会扫描到很多很多的重复的索引,这样说的话优

  • MySQL Index Condition Pushdown(ICP)性能优化方法实例

    一 概念介绍 Index Condition Pushdown (ICP)是MySQL 5.6 版本中的新特性,是一种在存储引擎层使用索引过滤数据的一种优化方式. a 当关闭ICP时,index 仅仅是data access 的一种访问方式,存储引擎通过索引回表获取的数据会传递到MySQL Server 层进行where条件过滤. b 当打开ICP时,如果部分where条件能使用索引中的字段,MySQL Server 会把这部分下推到引擎层,可以利用index过滤的where条件在存储引擎层进行

  • MySQL 8 新特性之Invisible Indexes

    背景 索引是把双刃剑,在提升查询速度的同时会减慢DML的操作.毕竟,索引的维护需要一定的成本.所以,对于索引,要加上该加的,删除无用的.前者是加法,后者是减法.但在实际工作中,大家似乎更热衷于前者,而很少进行后者.究其原因,在于后者,难.难的不是操作本身,而是如何确认一个索引是无用的. 如何确认无用索引 在不可见索引出现之前,大家可以通过sys.schema_unused_indexes来确定无用索引.在MySQL 5.6中,即使没有sys库,也可通过该视图的基表来进行查询. mysql> sh

  • MySQL索引总结(Index Type)

    目录 MySQL Index 1.创建和删除索引 2. 索引类型 MySQL Index 索引是一种数据结构,可以是B-tree.R-tree.或者hash结构.其中,B-tree适用于查找某范围内的数据,可以快速地从当前数据找到吓一跳数据:R-tree常用于查询比较接近的数据:hash结构适用于随机访问场景,查找每条数据时间几乎一致. 优化查询的有效方法是为经常查询的字段建立索引,如无索引查询数据时,会遍历整张表:若建立索引后查找起来会更快速.当进行update.delete.insert操作

  • 图文并茂地讲解Mysql索引(index)

    目录 前言 1. 索引概述 1.1 什么是索引? 1.2 使用索引和不使用索引的区别 1.3 索引的特点 2. 索引结构 2.1 概述 2.2 二叉树 2.3 B-Tree 2.4 B+Tree 2.5 Hash 3.索引分类 3.1 索引分类 3.2 聚集索引&二级索引 4. 索引语法 5. SQL性能分析 5.1 SQL执行频率 5.2 慢查询日志 5.3 profile详情 5.4 explain 6. 索引使用 6.1 验证索引效率 6.2 最左前缀法则 6.3 索引失效情况 6.3.1

  • 快速学习MySQL索引的入门超级教程

    所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后根据特征值来快速查找.而用的最多,并且是mysql默认的就是二叉树算法 BTREE,通过BTREE算法建立索引的字段,比如扫描20行就能得到未使用BTREE前扫描了2^20行的结果,具体的实现方式后续本博客会出一个算法专题里面会有具体的分析讨论; Explain优化查询检测 EXPLAIN可以帮助开发人员分析SQL问题,explain显示了mysql如何使用索引来处理select语

  • MySQL 索引分析和优化

    一.什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面的记录数量越多,这个操作的代价就越高.如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置.如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍. 假设我们创建了一个名为people的表: CREATE TABLE people ( p

  • MySQL索引的缺点以及MySQL索引在实际操作中有哪些事项

    以下的文章主要介绍的是MySQL索引的缺点以及MySQL索引在实际操作中有哪些事项是值得我们大家注意的,我们大家可能不知道过多的对索引进行使用将会造成滥用.因此MySQL索引也会有它的缺点: 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT.UPDATE和DELETE.因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件. 建立索引会占用磁盘空间的索引文件.一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快. 索引只是提高效

  • MySQL索引操作命令小结

    创建索引 创建索引的语法是: CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON tbl_name (index_col_name,...) index_col_name: col_name [(length)] [ASC | DESC] 对于CHAR和VARCHAR列,只用一列的一部分就可创建索引.创建索引时,使用col_name(length)语法,对前缀编制索引.前缀包括每列值的前length个字符

  • 美团网技术团队分享的MySQL索引及慢查询优化教程

    MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓"好马配好鞍",如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上看到诸如"精通MySQL"."SQL语句优化"."了解数据库原理"等要求.我们知道一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,

  • MySQL索引背后的数据结构及算法原理详解

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论. 文章主要内容分为三个部分. 第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础. 第二部分结合MySQL数据库中My

  • mysql索引基数概念与用法示例

    本文实例讲述了mysql索引基数概念与用法.分享给大家供大家参考,具体如下: Cardinality(索引基数)是mysql索引很重要的一个概念 索引基数是数据列所包含的不同值的数量.例如,某个数据列包含值1.2.3.4.5.1,那么它的基数就是5.索引的基数相对于数据表行数较高(也就是说,列中包含很多不同的值,重复的值很少)的时候,它的工作效果最好.如果某数据列含有很多不同的年龄,索引会很快地分辨数据行.如果某个数据列用于记录性别(只有"M"和"F"两种值),那么

随机推荐