MySQL 索引

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。

创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

建立索引会占用磁盘空间的索引文件。

普通索引

创建索引

这是最基本的索引,它没有任何限制。它有以下几种创建方式:

CREATE INDEX indexName ON mytable(username(length));

如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

修改表结构(添加索引)

ALTER table tableName ADD INDEX indexName(columnName)

创建表的时候直接指定

CREATE TABLE mytable(

ID INT NOT NULL,

username VARCHAR(16) NOT NULL,

INDEX [indexName] (username(length))

);

删除索引的语法

DROP INDEX [indexName] ON mytable;

唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

创建索引

CREATE UNIQUE INDEX indexName ON mytable(username(length))

修改表结构

ALTER table mytable ADD UNIQUE [indexName] (username(length))

创建表的时候直接指定

CREATE TABLE mytable(

ID INT NOT NULL,

username VARCHAR(16) NOT NULL,

UNIQUE [indexName] (username(length))

);

使用ALTER 命令添加和删除索引

有四种方式来添加数据表的索引:

ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。

ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。

ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。

ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。

以下实例为在表中添加索引。

mysql> ALTER TABLE testalter_tbl ADD INDEX (c);

你还可以在 ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引:

mysql> ALTER TABLE testalter_tbl DROP INDEX c;

使用 ALTER 命令添加和删除主键

主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:

mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);

你也可以使用 ALTER 命令删除主键:

mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;

删除主键时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。

显示索引信息

你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。

尝试以下实例:

mysql> SHOW INDEX FROM table_name; \G........


1、索引是什么

  索引(Index)是帮助MySQL高效获取数据的数据结构。可以得到索引的本质:索引是数据结构。

  可以理解为“排好序的快速查找数据结构”

  在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,

  这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

2、优势

  类似大学图书馆建书目索引,提高数据检索效率,降低数据库的IO成本。

  通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。

3、劣势

  实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占空间的。

  虽然索引大大提高了查询速度,同时确会降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。

  因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段。

  都会调整因为更新所带来的键值变化后的索引信息。

4、索引的分类

  单值索引

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

  唯一索引

    索引列的值必须唯一,但允许有空值。

  复合索引

    即一个索引包含多个列。

5、基本语法

6、MySQL索引结构

    BTree索引

    Hash索引

    full-text全文索引

    R-Tree索引

7、哪些情况需要创建索引

    ①主键自动建立唯一索引

    ②频繁作为查询条件的字段应该创建索引

    ③查询中与其他表关联的字段,外键关系建立索引

    ④频繁更新的字段不适合建立索引,因为每次更新不单单是更新了记录还会更新索引

    ⑤WHERE条件里用不到的字段不创建索引

    ⑥单键/组合索引的选择问题,who?(在高并发下倾向创建组合索引)

    ⑦查询中排序的字段,排序的字段若通过索引去访问将大大提高排序速度

    ⑧查询中统计或者分组字段

8、哪些情况不要创建索引

  ①表记录太少

  ②经常增删改的表

    提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE、和DELETE。

    因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

    数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据建立索引。

  ③注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。

普通索引,唯一索引,主键索引,全文索引,组合索引

MySQL各种索引(由于是浅析大多都不刻意区分搜索引擎)

INDEX(普通索引):最主要的索引。没有不论什么限制

ALTER TABLE `table_name` ADD INDEX index_name ( `column` )

UNIQUE(唯一索引):与"普通索引"类似,不同的就是:索引列的值必须唯一,但同意有空值。

ALTER TABLE `table_name` ADD UNIQUE (`column`)

注:创建唯一索引的目的不是为了提高訪问速度,而仅仅是为了避免数据出现反复。

唯一索引能够有多个但索引列的值必须唯一,索引列的值同意有空值。

假设能确定某个数据列将仅仅包括彼此各不同样的值,在为这个数据列创建索引的时候就应该使用keywordUNIQUE。把它定义为一个唯一索引。

PRIMARY KEY(主键索引):它 是一种特殊的唯一索引,不同意有空值。

ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )

FULLTEXT(全文索引):仅可用于 MyISAM 表,针对较大的数据。生成全文索引非常耗时好空间。

ALTER TABLE `table_name` ADD FULLTEXT ( `column` )

COMBINED(组合索引):为了很多其它的提高mysql效率可建立组合索引。遵循”最左前缀“原则。

ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

使用索引应该知道的事:

1、尽管索引大大提高了查询速度。同一时候却会减少更新表的速度,如对表进行INSERT、UPDATE和DELETE。由于更新表时,MySQL不仅要保存数据。还要保存一下索引文件。

2、建立索引会占用磁盘空间的索引文件。普通情况这个问题不太严重,但假设你在一个大表上创建了多种组合索引,索引文件的会膨胀非常快。

3、索引仅仅是提高效率的一个因素。假设你的MySQL有大数据量的表,就须要花时间研究建立最棒的索引,或优化查询语句。

Mysql 索引(学习笔记十二)相关推荐

  1. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  2. MySQL 索引学习笔记

    MySQL 索引学习笔记 索引基本概念 索引优点 B-Tree 索引 基本原理 使用场景 使用限制 哈希索引 基本原理 使用限制 自适应哈希索引 处理哈希冲突 相关面试题 高性能索引策略 独立的列 前 ...

  3. 吴恩达《机器学习》学习笔记十二——机器学习系统

    吴恩达<机器学习>学习笔记十二--机器学习系统 一.设计机器学习系统的思想 1.快速实现+绘制学习曲线--寻找重点优化的方向 2.误差分析 3.数值估计 二.偏斜类问题(类别不均衡) 三. ...

  4. ROS学习笔记十二:使用roswtf

    ROS学习笔记十二:使用roswtf 在使用ROS过程中,roswtf工具可以为我们提供ROS系统是否正常工作的检查作用. 注意:在进行下列操作之前,请确保roscore没有运行. 检查ROS是否安装 ...

  5. Polyworks脚本开发学习笔记(十二)-输出和读取文本文件

    Polyworks脚本开发学习笔记(十二)-输出和读取文本文件 Polyworks作为一个测量工具,将测量的数据方便的导出到文本文件则是一项必须的功能.在DATA_FILE这个命令下提供了很多子命令用 ...

  6. OpenCV学习笔记(十二)——图像分割与提取

    在图像处理的过程中,经常需要从图像中将前景对象作为目标图像分割或者提取出来.例如,在视频监控中,观测到的是固定背景下的视频内容,而我们对背景本身并无兴趣,感兴趣的是背景中出现的车辆.行人或者其他对象. ...

  7. 【现代机器人学】学习笔记十二:轮式移动机器人

    目录 轮式机器人类型 全向轮式机器人 建模 单个全向轮是怎么运动的 多个全向轮是如何带动底盘运动的 运动规划和反馈控制 非完整约束轮式移动机器人 建模 独轮车 差速驱动机器人 车型机器人 非完整移动机 ...

  8. 【theano-windows】学习笔记十二——卷积神经网络

    前言 按照进度, 学习theano中的卷积操作 国际惯例, 来一波参考网址 Convolutional Neural Networks (LeNet) 卷积神经网络如何应用在彩色图像上? 卷积小知识 ...

  9. (C/C++学习笔记) 十二. 指针

    十二. 指针 ● 基本概念 变量的地址就是指针,存放指针的变量就是指针变量(因而又叫作地址变量 address variable); 这个地址编号本身就是一个无符号的整数,在32位系统下为4字节(8位 ...

最新文章

  1. 「数据分析」之零基础入门数据挖掘
  2. 自定义logback触发器策略进行日志滚动
  3. P5591 小猪佩奇学数学(单位根反演)
  4. 使用Spring Security 3.1保护RESTful Web服务,第3部分
  5. 保存到数据库乱码mysql_Linux下MySQL保存进去数据为乱码的解决办法
  6. ajax成功之后在执行,ajax传入成功后执行后台方法
  7. 边做边学:《 Inter Planetary File System》简介
  8. 随想录(SEO笔记)
  9. 计算机网络机械特性是指,《计算机网络与通信》第1——3章 习题及思考题
  10. java线程cpu 1000_CPU突然飙升到300%,Dubbo活动线程数直接飙到1000
  11. 【ACM-ICPC 2018 南京赛区网络预赛】Magical Girl Haze【分层图】
  12. html中父子元素的解释,CSS 子绝父相 理解
  13. 小夜曲dsd使用foobar2000测试dsd输出
  14. Max Core Frequency 异常显示为-1.80GHz -- Intel-Extreme-Tuning-Utility-Intel-XTU (英特尔 XTU)
  15. ubuntu18.04安装dash-to-dock出错的问题
  16. 计算机上的360云盘派啥用,如何使用360云盘
  17. 渗透测试试题-----web方面知识点
  18. 2g内存用linux的哪个版本,Linux 下安装sql server 时 2G内存限制的最新(2019-08-15) 解决方案...
  19. Java开发 微软OAuth身份验证在EWS中的应用
  20. 29-折半查找法的使用

热门文章

  1. android 评分条 RatingBar 使用及自定义
  2. oracle 清除数据库缓存
  3. Windows Mobile中的WebService应用
  4. Testing - Codereview Checklist
  5. 小白设计模式:组合模式
  6. 最最基本的框架宏使用RUNTIME_CLASS DECLARE_DYNAMIC IMPLEMENT_RUNTIMECLASS
  7. 大数据之-Hadoop3.x_Yarn_常用命令---大数据之hadoop3.x工作笔记0147
  8. C++_数据类型_布尔类型_以及数据的输入_以及算术运算符_加减乘除运算---C++语言工作笔记013
  9. 系统安全工作笔记001---springcloud系统安全隐患与改善_工作经验_随时更新
  10. EJB3.0学习笔记---多接口的时,实现类处理方法: