MYSQL索引~

本文介绍了数据库索引的概念、分类及创建删除方法,并通过实例详细分析了索引如何提高查询效率。

一、什么是索引

索引是创建在表上,是对数据库表中的一列或者多列的值进行排序的一种结果。

优点在于可以提高查询的速度;

缺点在于并不是索引越多越好,过多的索引会引起CPU的使用高居不下(因为由于数据的改动引起索引文件的改动,过多的磁盘IO造成CPU负载过高)

二、索引的分类

普通索引:没有任何的限制条件,可以给任何类型的字段创建普通索引。

唯一性索引:使用unique修饰的字段,值不会重复,主键索引隶属于唯一性索引。

主键索引:使用primary key修饰的字段会自动创建索引。

单列索引:在一个字段上创建的索引。

多列索引:在表的多个字段上创建索引。

全文索引:使用FULLTEXT参数可以设置全文索引,只支持char、varchar、text类型的字段上。

三、索引的创建与删除

1、索引的创建

在创建表的时候指定索引字段

create table table_name{

id INT,

name varchar(12),

index(id)

};

index(属性名):指定当前的属性名为索引

在已经创建的表上添加索引

create [unique|fulltext|spatial] index 索引名 (idx_id) on 表名(属性名);

alter table 表名 add[unique|fulltext|spatial] index 索引名(属性名);

2、删除索引:drop index 索引名 on 表名;

四、索引的执行过程分析

首先创建一个表------>在表中插入基础的数据----->在某一条件下进行查询通过explain分析SQL执行过程----->将表中的某一个字段设置为索引------>重复查询的过程(在某一条件下进行查询通过explain分析SQL执行过程

创建一个Student表,表里字段分别为:
Student(SID,Sname,Sage,Ssex) 
--SID 学生编号,Sname 学生姓名,Sage 年龄,Ssex 学生性别

插入基础数据:
select * from Student;
+-----+----------+------+------+
| SID | Sname    | Ssex | Sage |
+-----+----------+------+------+
|   1 | zhaolei  | nan  |   20 |
|   2 | qiandian | nan  |   20 |
|   3 | sunfen   | nan  |   21 |
|   4 | wulan    | nv   |   18 |
+-----+----------+------+------+
数据库里插入了四条数据:

查询姓名为"zhaolei"的数据记录,通过explain分析SQL执行过程
mysql> explain select * from Student where Sname = 'zhaolei'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: Student
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 4
        Extra: Using where
1 row in set (0.01 sec)

id 列是在QEP 中展示的表的连续引用。

 ref 列可以被用来标识那些用来进行索引比较的列或者常量。

 type:type 列代表QEP 中指定的表使用的连接方式。

select_type 列提供了各种表示table 列引用的使用方式的类型。最常见的值包括SIMPLE、PRIMARY、DERIVED 和UNION。其他可能的值还有UNION RESULT、DEPENDENT SUBQUERY、DEPENDENT UNION、UNCACHEABLE UNION 以及UNCACHEABLE QUERY。

SIMPLE对于不包含子查询和其他复杂语法的简单查询,这是一个常 见的类型。

PRIMARY这是为更复杂的查询而创建的首要表(也就是最外层的表)。这个类型通常可以在DERIVED 和UNION 类型混合使用时见到。

DERIVED当一个表不是一个物理表时,那么就被叫做DERIVED。

DEPENDENT SUBQUERY这个select-type 值是为使用子查询而定义的。

UNION这是UNION 语句其中的一个SQL 元素。

table 列是EXPLAIN 命令输出结果中的一个单独行的唯一标识符。这个值可能是表名、表的别名或者一个为查询产生临时表
 的标识符,如派生表、子查询或集合。

possible_keys 列指出优化器为查询选定的索引。

key 列指出优化器选择使用的索引。

key_len 列定义了用于SQL 语句的连接条件的键的长度。

 rows 列提供了试图分析所有存在于累计结果集中的行数目的MySQL 优化器估计值。

partitions:partitions 列代表给定表所使用的分区。这一列只会在EXPLAIN PARTITIONS 语句中出现。

Extra:Extra 列提供了有关不同种类的MySQL 优化器路径的一系列额外信息。Extra 列可以包含多个值,可以有很多不同的取值,并且这些值还在随着MySQL 新版本的发布而进一步增加。

可以通过possible_keys、key没有用到索引,并且通过rows: 4可以看出直接全表扫描一遍才找到"zhaolei"的信息,
假设表中4百万数据,那么查找"zhaolei"同学就需要扫描4百万的数据,效率比较低

以名字创建索引:
create index idx_name on Student (Sname);

mysql> explain select * from Student where Sname = 'zhaolei'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: Student
         type: ref
possible_keys: idx_name
          key: idx_name
      key_len: 27
          ref: const
         rows: 1
        Extra: Using index condition
1 row in set (0.01 sec)
注意:这次查询"zhaolei"同学的信息,只在表中查询一行数据就可以得到(rows: 1)

记住:explain命令,可以查看SQL执行计划,分析SQL语句是否正确使用索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值