1、什么是索引

索引是对数据库表中一列或者多列的值进行排序的一种结构。索引是在存储引擎中实现的,每种存储引擎中的索引不一定完全相同。

MySQL中索引的存储类型有两种:btree和hash。MyISAM和InnoDB存储引擎只支持btree索引;MEMORY / HEAP存储引擎可以支持hash和btree索引。

2、索引的分类

1》普通索引和唯一索引:

2》单列索引和组合索引:

3》全文索引:fulltext,可以在char、varchar、text类型的列上创建全文索引。MySQL只有MyISAM存储引擎支持全文索引。

4》空间索引:spatial,MySQL中的空间数据类型有4种,分别是geometry、point、linesstring、polygon。创建空间索引的列必须将其声明为not null。并且只有MyISAM存储引擎支持这种索引的创建。

3、索引的设计原则

1》索引并非越多越好,动态索引维护需要花销

2》避免对经常更新的表建立过多的索引

3》数据量小的表最好不要建立索引

4》在不同值较多的字段上建索引

5》对唯一性字段建索引

6》在频繁进行排序或分组的列上建立索引

4、MySQL建立索引

查询数据库所有的索引:

查看某一表的索引:

show index from tb_name \G;

1》在创建表的时候创建索引

primary key、foreign key、unique创建的时候相当于同时给指定列创建了一个索引。

//创建表时创建索引的基本语法格式。
//unique为唯一索引、fulltext为全文索引、spatial为空间索引
//index和key为同一词
//length表示索引长度,只有字符串类型的字段可以指定索引长度
//asc或者desc指定索引按照升序或者降序的索引值存储
create table tb_name [col_name data_type] [unique|fulltext|spatial]
[index|key] (col_name [length]) [asc|desc]

1>创建普通索引

create table book(

  bookid int not null,
...
index(bookid)
);

使用explain语句查看索引是否正在使用:

mysql> explain select * from test where id=1 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test
partitions: NULL
type: const
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec) mysql>

select_type:指定所使用的select查询类型,simple表示简单的select,不使用union或子查询。其他可能的取值有:primary、union、subquery。

table:指定数据库读取的数据表的名字。

type:指定了本数据表与其他数据表之间的关联关系,可能的取值有system、const、eq_ref、ref、range、index、all。

possible_keys:给出了MySQL在搜索数据记录时可选用的各个索引。

key:MySQL实际选用的索引。

key_len:给出索引按字节计算的长度,key_len数值越小,表示越快。

ref:给出了关联关系中另一个数据表里的数据列的名字。

rows:MySQL执行这个查询时预计会从这个数据表读出的数据行的个数。

extra:提供了与关联操作有关的信息。

2>创建唯一索引

//创建一个名为uniqueIdx的唯一索引
create table book( id int not null,
...
unique index uniqueIdx(id)
);

3>创建单列索引

//创建索引长度为20的索引
create table book( id int not null,
...
name char(50) null,
index singleIdx(name(20))
);

4>创建组合索引

//创建组合索引:组合索引遵循最左前缀原则,即(id,name)或者(id),不遵循最左前缀原则,将不能使用局部索引。
create table book( id int not null,
...
name char(50) null,
index multiIdx(id,name(20))
);

 5>创建全文索引

//只有MyISAM存储引擎支持全文索引(全文搜索)
//并且只为char、varchar、text列创建全文索引,索引总是对整个列进行,
//不支持局部(前缀)索引
create table book( id int not null,
...
info varchar(255),
fulltext index fulltextIdx(info)
) engine=MyISAM;

6>创建空间索引

//创建空间索引。
//相应字段要非空,engine=MyISAM
create table book( id int not null,
...
intime geometry not null,
spatial index spatialIdx(intime)
)engine=MyISAM;

2》在已经存在的表上创建索引

可以使用alter table 或者 create index语句。

1>使用alter table的基本语法

alter table tb_name add [unique|fulltext|spatial] [index|key]
[index_name] (col_name[length],...) [asc|desc]

2>使用create index的基本语法

create [unique|fulltext|spatial] index [index_name]
on tb_name (col_name[length],...) [asc|desc]

5、删除索引:alter table 或者 drop index

1》使用alter table删除索引

alter table tb_name drop index index_name;

添加auto_increment约束字段的唯一索引不能被删除。

 2》使用drop index删除索引

drop index index_name on tb_name;

MySQL-快速入门(7)索引的更多相关文章

  1. MySql基础笔记(一)Mysql快速入门

    Mysql快速入门 一)基本概念 1)表 行被称为记录,是组织数据的单位.列被称为字段,每一列表示记录的一个属性. 2)主键 主键用于唯一的标识表中的每一条记录.可以定义表中的一列或者多列为主键, 但 ...

  2. MySQL 快速入门教程

    转:MySQL快速 入门教程 目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数据 ...

  3. MySQL 快速入门(一)

    目录 MySQL快速入门 简介 存储数据的演变过程 数据库分类 概念介绍 MySQL安装 MySQL命令初始 环境变量配置 MySQL环境变量配置 修改配置文件 设置新密码 忘记密码的情况 基本sql ...

  4. MySQL快速入门(二)

    目录 MySQL快速入门(二) 约束条件 自增 自增的特性 主键 外键 级联更新/删除 表与表之间的关系 外键约束 操作表方法 查询关键字 练习数据 select··from where 筛选 gro ...

  5. elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)

    一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...

  6. SQL快速入门 ( MySQL快速入门, MySQL参考, MySQL快速回顾 )

    SQL 先说点废话,很久没发文了,整理了下自己当时入门 SQL 的笔记,无论用于入门,回顾,参考查询,应该都是有一定价值的,可以按照目录各取所需.SQL数据库有很多,MySQL是一种,本文基本都是SQ ...

  7. Mysql快速入门(看完这篇能够满足80%的日常开发)

    这是一篇mysql的学习笔记,整理结合了网上搜索的教程以及自己看的视频教程,看完这篇能够满足80%的日常开发了. 菜鸟教程:https://www.runoob.com/mysql/mysql-tut ...

  8. Mysql快速入门(三)

    MySQL性能优化之查看执行计划explain 介绍: (1).MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发 ...

  9. 几百万的数据,mysql快速高效创建索引

    有一个问题,一张表有3百万条记录,随着时间的增加,记录量会更多,此时查询速度很慢.在创建此表前没有未相应字段添加索引,所以此时需要为表添加索引.但是因为数据量大的原因,索引添加不成功,想了很多办法,终 ...

  10. MySQL快速入门 基本技能篇

    写在之前的话: 之前一直在用MSSERVER,刚用MySQL时有很多的不适应.就此小结一下工作中遇到的问题和场景,文中出现的局限性欢迎指出 MySQL有客户端式(SQLyog),可托拉拽和写代码:或者 ...

随机推荐

  1. 详解WebService开发中四个常见问题(1)

    详解WebService开发中四个常见问题(1)   WebService开发中经常会碰到诸如WebService与方法重载.循环引用.数据被穿该等等问题.本文会给大家一些很好的解决方法. AD:WO ...

  2. web开发常见的几大安全问题

    一.SQL注入 SQL注入是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击.SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求 ...

  3. 【leetcode】LCP 3. Programmable Robot

    题目如下: 力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0).小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动.指令有两种: U: 向y轴正方向移动 ...

  4. linux常用的命令一:系统工作命令

    系统工作命令: 帮助命令:man -h \ man --help(tips:‘--’长格式后用完整的选项名称,‘-’短格式后用单个字母缩写) echo命令:格式:echo [字符串|$变量] date ...

  5. postman导入接口

    给大家说一个poatman导入接口的好办法,平常要是想在postman上模拟接口,如果复杂的很难配,其实有一个很简单的方法: 现在我模拟一下百度搜索时历史记录的接口: 点击Copy as cUrl 然 ...

  6. vertica,greenplumr容器安装

    一,vertica 来源: https://github.com/sumitchawla/docker-vertica 使用方法: # To run without a persistent data ...

  7. vscode 代码缩进2格

    "editor.detectIndentation":false,

  8. Introduction-to-Psychology Slides

    最近在网易公开课学习耶鲁大学Paul Bloom教授的<心理学导论>,英文水平有限,视频中一直没有出现PPT,无意中找到一份课件,现分享于此,大家自取! 链接:https://pan.ba ...

  9. Java虚拟机之JVM系统和内存模型

    1.类加载子系统 负责从文件系统或者网络中加载Class信息,加载的信息存放在一块称之为方法区的内存空间里. 2.方法区 存放类信息.常量信息.常量池信息.包括字符串字面量和数字常量等,方法区的大小决 ...

  10. ModelSerializer 使用知识点_serializers.SerializerMethodField()使用场景总结

    serializers.SerializerMethodField和钩子方法结合,可以实现对ModelSerializer类的一些字段进行二次加工,返回,如下:1.对以ModelSerializer的 ...