01-索引

1、索引是对数据库表中一列或多列的值进行排序的一种数据结构,使用索引可提高数据库中特定数据的查询速度。

2、索引是一个单独的、存储在磁盘上的数据库结构,包含对数据表里所有记录的引用指针。

3、使用索引用于快速找出某个或多个列中有一特定值的行,所有的MySQL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。

4、索引是在存储引擎中实现的。因此,每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型。
根据存储引擎定义每个表的最大索引数和最大索引长度。所有的存储引擎支持每个表至少16个索引,总索引长度至少为256字节。 5、MySQL中索引的存储类型有两种:BTREE 和 HASH,具体和表的存储引擎相关; 6、MyISAM和InnoDB存储引擎只支持BTREE索引;MEMORY/HEAY存储引擎可以支持HASH和BTREE索引。 7、索引的优点:
(1)通过创建唯一索引,可以保证数据库表中每一行数据的唯一性。
(2)可以大大加快数据的查询速度,这也是创建索引的最主要的原因。
(3)在实现数据的参考完整性方面,可以加速表和表之间的连接。
(4)在使用分组和排序子句进行数据查询时,也可以显著减少查询中分组和排序的时间。 8、增加索引有如下不利方面:
(1)创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
(2)索引需要占磁盘空间,除了数据表站数据文件空间之外,每一个索引还要占一定的物理空间,如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。
(3)当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低数据的维护速度。

02-索引的分类

MySQL的索引可以分为一下几类:
1、普通索引和唯一索引
普通索引是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值。
唯一索引,索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
主键索引是一种特殊的唯一索引,不允许有空值。 2、单列索引和组合索引
单列索引即一个索引只包含单个列,一个表可以有多个单列索引。
组合索引指在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。使用组合索引时,遵循最左前缀集合。 3、全文索引
全文索引类型为 FULLTEXT,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。全文索引可以在 CHAR、VARCHAR、TEXT类型的列上创建。MySQL中只有MyISAM存储引擎支持全文索引。 4、空间索引
空间索引是对空间数据类型的字段建立索引,MySQL中的空间数据类型有4种,分别是:GEOMETRY、POINT、LINESTRING 和 POLYGON。
MySQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类似的语法创建空间索引。
创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MyISAM的表中创建。

03-索引的设计原则

设计索引时,应该考虑一下准则:
(1)索引并非越多越好,一个表中如有大量的索引,步进占用次哦按空间,而且会影响INSERT、DELETE、UPDATE等语句的性能,因为当表中的数据更改的同时,索引也会进行调整和更新。
(2)避免对经常更新的表进行过多的索引,并且索引中的列尽可能减少。而对经常用于查询的字段应该创建索引,但要避免添加不必要的字段。
(3)数据量小的表最好不要使用索引,由于数据较少,查询话费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果。
(4)在条件表达式中经常用到的不同值较多的列上创建索引,在不同值很少的列上不要建立索引。
(5)当唯一性是某种数据本身的特征时,指定唯一索引。使用唯一索引需能确保定义的列数据完整性,以提高查询速度。
(6)在频繁进行排序或分组的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。

04-创建索引

创建表的时候创建索引

# 1、创建表的时候创建索引
使用 CREATE TABLE 创建表时,除了可以定义列的数据类型,还可以定义主键约束,外键约束 或者 唯一性约束,而不论创建哪种约束,在定义约束的同时相当于在指定列上创建了一个索引。
创建表时创建索引的基本语法格式如下:
CREATE TABLE table_name [col_name data_type] [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (col_name [length]) [ASC|DESC] 参数含义:
UNIQUE、FULLTEXT、SPATIAL 分别表示 唯一索引、全文索引、空间索引;
INDEX 与 KEY 两者作用相同,用来指定创建索引;
col_name 为需要创建索引的字段列,该列必须从数据表中定义的多个列中选择;
index_name 指定索引的名称,可选参数;默认col_name 为索引值。
length 为可选参数,表示索引的长度,只有字符串类型才能指定索引长度。 # 2、创建普通索引
最基本的索引类型,没有唯一性之类的限制,其作用只是加快对数据的访问速度。
例:
CREATE TABLE book (
bookid INT NOT NULL,
bookname VARCHAR(255) NOT NULL,
info VARCHAR(255) NULL,
year_publication YEAR NOT NULL,
INDEX(year_publication)
); # 3、创建唯一索引
创建唯一索引的主要原因是减少查询索引列操作的执行时间,尤其是对比较庞大的数据表。索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
例:
CREATE TABLE t1 (
id INT NOT NULL,
name VARCHAR(255) NOT NULL,
UNIQUE INDEX UniqIdx(id)
); # 4、创建单列索引
单列索引是在数据表中的某一个字段上创建的索引,一个表中可以创建多个单列索引。上面两个例子都是单列索引。 # 5、创建组合索引
组合索引是在多个字段上创建一个索引。
例:
CREATE TABLE t2 (
id INT NOT NULL,
name CHAR(20) NOT NULL,
age INT NOT NULL,
INDEX MulaiIdx(id, name)
); # 6、创建全文索引
FULLTEXT 可以用于全文搜索,只有MyISAM存储引擎支持,并且只为CHAR、VARCHAR、TEXT列创建索引。
索引总是对整个列进行,不支持局部(前缀)索引。
例:
CREATE TABLE t3 (
id INT NOT NULL,
name CHAR(20) NOT NULL,
age INT NOT NULL,
info VARCHAR(255),
FULLTEXT INDEX FullTextIdx(info)
) ENGINE=MyISAM; # 7、创建空间索引
空间索引必须在MyISAM类型的表中创建,且空间类型的字段必须为非空。
例:
CREATE TABLE t4 (
id INT NOT NULL,
g GEOMETRY NOT NULL,
SPATIAL INDEX spatIdx(g)
) ENGINE=MyISAM;
注意:创建时指定空间类型字段值的非空约束,并且表的存储引擎为MyISAM。

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

# 1、使用ALTER TABLE 语句创建索引
基本语法如下:
ALTER TABLE table_name ADD [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (col_name[length], ...) [ASC|DESC]
查看表的索引:
show index from book\G; 例:
ALTER TABLE book ADD INDEX BkNameIdx(bookname(30)); # 2、使用CREATE INDEX 创建索引
可以在已经存在的表上添加索引。
基本的语法结构:
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name ON table_name (col_name[length], ...) [ASC|DESC]

05-删除索引

# 1、使用 ALETR TABLE 删除索引的基本语法格式如下:
ALTER TABLE table_name DROP INDEX index_name;
注意:AUTO_INCREMENT 约束字段的唯一索引不能删除。 # 2、使用 DROP INDEX 语句删除索引
DROP INDEX index_name ON table_name; 注意:删除表中的列时,如果要删除的列为索引的组成部分,则该列也会从索引中删除。如果组成索引的所有列都被删除,则整个索引将被删除。

06 MySQL之索引的更多相关文章

  1. 【夯实Mysql基础】MySQL性能优化的21个最佳实践 和 mysql使用索引

    本文地址 分享提纲: 1.为查询缓存优化你的查询 2. EXPLAIN 你的 SELECT 查询 3. 当只要一行数据时使用 LIMIT 1 4. 为搜索字段建索引 5. 在Join表的时候使用相当类 ...

  2. ySQL性能优化的21个最佳实践 和 mysql使用索引

    MySQL性能优化的21个最佳实践 和 mysql使用索引 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 ...

  3. MySQL单列索引和组合索引(联合索引)的区别详解

    发现index merge局限性,优化器会自动判断是否使用 index merge 优化技术,查询还是需要组合索引[推荐阅读:对mysql使用索引的误解] MySQL单列索引和组合索引(联合索引)的区 ...

  4. 【转】【备忘录】MySQL性能优化的21个最佳实践 和 mysql使用索引

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数 ...

  5. MySQL性能优化的21个最佳实践 和 mysql使用索引【转载】

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数 ...

  6. MYSQL:基础——索引原理及慢查询优化

    MYSQL:基础——索引原理及慢查询优化 索引的数据结构 索引的数据结构是B+树.如下图所示,B+树的节点通常被表示为一组有序的数据项和子指针.图中第一个节点包含数据项3和5,包含三个指针,第一个指针 ...

  7. mysql 添加索引,ALTER TABLE和CREATE INDEX的区别

    nvicat-->mysql表设计-->创建索引. (1)使用ALTER TABLE语句创建索引,其中包括普通索引.UNIQUE索引和PRIMARY KEY索引3种创建索引的格式: PRI ...

  8. 2020重新出发,MySql基础,MySql视图&索引&存储过程&触发器

    @ 目录 视图是什么 视图的优点 1) 定制用户数据,聚焦特定的数据 2) 简化数据操作 3) 提高数据的安全性 4) 共享所需数据 5) 更改数据格式 6) 重用 SQL 语句 MySQL创建视图 ...

  9. MySQL中索引和优化的用法总结

    1.什么是数据库中的索引?索引有什么作用? 引入索引的目的是为了加快查询速度.如果数据量很大,大的查询要从硬盘加载数据到内存当中. 2.InnoDB中的索引原理是怎么样的? InnoDB是Mysql的 ...

随机推荐

  1. Hadoop_24_MapReduce实现QQ共同好友

    1.社交粉丝数据分析: 以下是qq的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的) A:B,C,D,F,E,O B:A,C,E,K C:F,A,D,I D:A,E ...

  2. 接口自动化平台——httprunnermanager

    Windows 环境搭建 1. 下载安装pip install httprunner==1.4.2hrun -V #1.4.2har2case -V #0.1.8 2. httprunnermanag ...

  3. iview 表单验证不通过问题?

    项目需要,需要怂iview..使用一段时间感觉跟elementUI用起来差不多很方便.使用过程中遇到表单验证问题,如何避免在验证过程中偶尔出现验证不通过的异常情况? <1>:给 <F ...

  4. 选择排序Selection_Sort

    基本思想:和冒泡排序.直接插入排序并称为三大简单排序算法.显然,说明它们都很简单

  5. Java8-Stream-No.06

    import java.io.IOException; import java.math.BigDecimal; import java.util.Arrays; import java.util.s ...

  6. Git始终忽略特定文件的某一行内容

    笔者在编写Z Shell文件的时候经常会使用到set -x来开启调试,但不希望提交到仓库 解决方案 Git提供了一种文件过滤器,此方法可以帮助在提交时移除set -x 我们先来编写脚本,如何移除这一行 ...

  7. 头条编程题 万万没想到之抓捕孔连顺 JavaScript

    [编程题] 万万没想到之抓捕孔连顺 时间限制:1秒 空间限制:131072K 我叫王大锤,是一名特工.我刚刚接到任务:在字节跳动大街进行埋伏,抓捕恐怖分子孔连顺.和我一起行动的还有另外两名特工,我提议 ...

  8. SpringBoot 测试类 @RunWith & @SpringBootTest

    @RunWith(SpringRunner.class) @SpringBootTest public class RabbitMqTest { @Autowired RabbitMqSender r ...

  9. dcokee 安装 nginx

    1,docker pull openresty/openresty 2, mkdir  /opt/local/openresty  等等文件夹 3, docker run  --name=" ...

  10. dubbo中的group与version的存在意义

    公司每周五都要给线上系统发布一个版本,我将本周新开发的业务模块直接提交到svn的主干上(当然本机已经测试通过),在公司的测试环境部署运行正常,测试人员业务测试通过.但是在部署到准生产环境上后出现了意想 ...