MySQL索引讲解

索引的好处:

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

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

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

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

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

索引的缺点:

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

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

索引的设计原则

1、选择唯一性索引,也就是说多选择那些设置为主键,唯一性UNIQUE的字段来建立索引

2、为经常排序、分组的字段建立索引

3、常用作查询条件的字段建立索引,也就是常在WHERE等等子句中指定查询的列。

4、建立合适数量的索引,并不是索引越多越好

5、尽量使用数据量少的字段建立索引

6、尽量使用前缀来建立索引,比如TEXT和BLOG类型的字段,对前面的几个字符建立索引即可

7、不用的索引及时删除。

创建索引的两种方式

1、创建新表的同时创建索引。

2、如果对已存在的表创建索引,使用CREATE   INDEX命令或者ALTER   TABLE命令

现在来分析这两种用法

一、创建新表的同时创建索引。

CREATE   TABLE   TABLE_NAME(字段名  数据类型 ,

              ................,

              [UNIQUE  | FULLTEXT  ]  INDEX   |  PRIMARY  KEY,

              [INDEX_NAME](fileld1,field2........  [(length)]  [ ASC|DESC ]);

              );

UNIQUE  |  FULLTEXT   INDEX:这两个选取其中任意一个,比如选择UNIQUE   INDEX表示创建唯一索引,FULLTEXT   INDEX表示创建全文索引。也可以直接就写INDEX表示创建普通索引。

PRIMARY  KEY:表示创建主键索引。

INDEX_NAME:索引的名称。

filed:最后跟上field,表示对哪个字段创建的索引,还可以跟多个列表示使用多列索引。

length:索引的长度,必须是字符串类型的字段才可以使用。

二、已存在的表使用CREATE INDEX命令或者ALTER TABLE命令

创建普通索引

1、CREATE  INDX

CREATE  INDEX   INDEX_NAME   ON   TABLE_NAME(’COLUMN_NAME’);

 注释:COLUMN_NAME是要创建索引的列。

 如果创建不止一个索引,多个COLUMN_NAME之间用逗号隔开即可。

2、ALTER   TABLE 修改表结构(添加索引)

ALTER   TABLE   TABLE_NAME   ADD   INDEX   INDEX_NAME(‘COLUMN_NAME’);

3、删除索引

 DROP   INDEX   INDEXNAME   ON   TABLE_NAME;

 ALTER   TABLE   TABLE_NAME  DROP  INDEX   INDEX_NAME;

创建唯一索引

1、CREATE   INDEX

 CREATE   UNIQUE   INDEX   INDEX_NAME   ON   TABLE_NAME(’COLUMN_NAME’);

 如果创建不止一个索引,多个COLUMN_NAME之间用逗号隔开。

2、ALTER   TABLE修改表结构(添加索引)

 ALTER   TABLE   TABLE_NAME   ADD   UNIQUE   INDEX_NAME(‘COLUMN_NAME’)

3、删除索引

 ALTER   TABLE   TABLE_NAME   DROP   INDEX   INDEX_NAME;

创建主键索引

主键只能作用在一个列上,添加主键索引时,主键默认不为空(NOT   NULL)。

1、ALTER   TABLE修改表结构

 ALTER  TABLE   TABLE_NAME   MODIFY   TABLE_NAME   DEFINATION   NOT   NULL;

 ALTER   TABLE   TABLE_NAME   ADD   PRIMARY   KEY('COLUMN_NAME');

2、删除索引

 ALTER   TABLE   TABLE_NAME   DROP   PRIMARY   KEY;   #因为一个表中只能有一个主键,所以不需要指定索引名

总结:不能用CREATE   INDEX语句创建PRIMARY   KEY索引。

显示索引信息

SHOW   INDEX显示信息,\G格式化输出

SHOW   INDEX   FROM   TABLE_NAME;\G

联合索引

联合索引就是对多个字段同时建立的索引,多列索引使用的时候是有要求的,就是只有查询条件中使用了所关联字段中的第一个字段,多列索引才会被使用。

举个例子:

mysql> desc test1_1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int() | NO | | NULL | |
| name | varchar() | YES | | NULL | |
| grade | tinyint() | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
rows in set (0.00 sec) mysql> alter table test1_1 add index id_g (id,grade); # id为联合索引的第一个字段
Query OK, rows affected (0.01 sec)
Records: Duplicates: Warnings: mysql> explain select * from test1_1 where id = \G            # 使用联合索引的第一个字段进行查询
*************************** . row ***************************
id:
select_type: SIMPLE
table: test1_1
partitions: NULL
type: ref
possible_keys: id_g                               #使用了索引
key: id_g
key_len:
ref: const
rows:
filtered: 100.00
Extra: NULL
row in set, warning (0.00 sec) mysql> explain select * from test1_1 where grade = \G        #使用联合索引的第二个字段查询,
*************************** . row ***************************
id:
select_type: SIMPLE
table: test1_1
partitions: NULL
type: ALL
possible_keys: NULL                               # 发现没有使用索引
key: NULL
key_len: NULL
ref: NULL
rows:
filtered: 16.67
Extra: Using where
row in set, warning (0.00 sec) mysql> explain select * from test1_1 where id = AND grade= \G; # 使用联合索引的两个字段都作为查询条件
*************************** . row ***************************
id:
select_type: SIMPLE
table: test1_1
partitions: NULL
type: ref
possible_keys: id_g                                  # 使用了联合索引
key: id_g
key_len:
ref: const,const
rows:
filtered: 100.00
Extra: NULL
row in set, warning (0.00 sec) ERROR:
No query specified

删除索引

删除索引一般我们要使用建立索引时的索引名,可以使用show  create  table  table_name;\G命令来查看之前建立索引的名称。

删除索引的语法:DROP  INDEX   INDEX_NAME  ON  TABLE_NAME;

删除主键索引的语法:ALTER  TABLE  TABLE_NAME  DROP  PRIMARY  KEY;

MySQL基础之 索引的更多相关文章

  1. MySQL基础、索引、查询优化等考察点

    MySQL基础 MySQL数据类型 整数类型 TINYINT. SMALLINT. MEDIUMINT. INT. BIGINT 属性:UNSIGNED 长度:可以为整数类型指定宽度,例如:INT(1 ...

  2. Mysql基础知识—索引

    公司最近开始尝试进行改革,如何活跃团队气氛.开发就给我们说了一些算是科普类的数据库知识,下面参杂自己的理解,方便自己后续翻看.   1.什么是索引 索引在MySQL中也叫做“键”,是存储引擎用于快速找 ...

  3. MySQL基础_索引

    MySQL 索引(入门): 一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些 ...

  4. MySQL基础之索引

    这段时间看了好多东西却没有总结,今天在这里写一写 关于索引 索引是一种提高查询效率的方法,它是B+树的结构,从根到中间节点在到叶子节点,无需遍历全部就可以查到所需的东西 关于索引的创建 一般有俩种方式 ...

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

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

  6. MySQL基础(四)——索引

    MySQL基础(四)--索引

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

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

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

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

  9. mysql基础之视图、事务、索引、外键

    一.视图 视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并且在引用 ...

随机推荐

  1. 监控prometheus

    一.prometheus-webhook-daingtalak github地址:[Releases · timonwong/prometheus-webhook-dingtalk · GitHub] ...

  2. 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)

    目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...

  3. SQL Server T—SQL 视图 事务

    一 视图 视图是存储在数据库中的查询的SQL 语句, 视图是从一个或多个表或视图中导出的表,是一张虚表,只能对视图进行查询,不能增.删.改. 对视图进行修改要在相应的基本表中进行修改,修改会自动的反应 ...

  4. 乐字节-Java8新特性之Optional

    上一篇小乐带大家了解了Java新特性之Stream,接下来将会继续述说Java新特性之Optional Optional<T>类(java.util.Optional)是一个容器类,代表一 ...

  5. SpringCloud高可用和高并发

    1 高可用 什么是高可用:(High Availability)在一个长时间内服务不受影响.通俗的讲就是,一个机器挂掉的时候,有其他机器可以继续提供同样的服务. 如何实现高可用:冗余+自动故障转移.冗 ...

  6. 随手记:tomcat 与JDK 安装与配置

    写了3年的JAVA 每次遇到配置JDK 与按照tomcat的时候都要去网上找一下,太丢人了,所以还是记一下比较好,虽然都知道要配置哪些,但每次都还是有些不确定的感觉~ JDK : 1.安装官网 htt ...

  7. python乐观锁、悲观锁

    二.乐观锁总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改 三.悲观锁总是假设最坏的情况,每次取数据 ...

  8. LOJ#505. 「LibreOJ β Round」ZQC 的游戏(最大流)

    题意 题目链接 Sol 首先把第一个人能吃掉的食物删掉 然后对每个人预处理出能吃到的食物,直接限流跑最大流就行了 判断一下最后的最大流是否等于重量和 注意一个非常恶心的地方是需要把除1外所有人都吃不到 ...

  9. w3school前端教程合集

    有关前端开发的w3c教程合集. http://caibaojian.com/w3school/ 地图 ajax教程 Canvas教程 CSS教程 CSS3教程 CSS3选择器 CSS参考手册 DHTM ...

  10. phpstudy集成下Apache配置部署https安全证书

    一..先申请到安全证书.(腾讯云或者阿里云申请免费1年的安全证书),怎么申请这里也说下(以腾讯云为例): 1.登录腾讯云QQ或微信登录都行,第一次登录要通过实名认证,点击[产品]---[ss证书l] ...