MySQL ------ 索引(三十三)

一、了解索引

数据库中的索引与书籍中的目录类似,通过目录快速查抄所需信息,在数据库中,索引使数据库程序无需对整个表进行查询,就可以在其中找到所需数据,在数据库中由于数据存储在数据表中,因此索引是创建在数据库表对象上的,由表中的一个字段或多个字段生成的键组成,这些键存储在数据结构 B- 树 或哈希表中,通过MySQL可以快速有效的查找与键值相关的字段。

根据索引的存储类型可以分为:B-树索引(BTREE)和哈希索引(HASH)

InnoDB 和MyIsAM 存储引擎支持: B-数索引

好处:可以大大提高数据库的检索速度,改善数据库性能

实现方式:索引提供指针以指向存储在表中指定列的数据值,再根据指定的排序次序排列这些指针。数据库使用索引的方式与使用书本的目录很相似,通过搜索索引找到特定的值,在跟随指针到达包含该值的列。

二、索引分类

主要分为6类:普通索引、唯一索引、主键索引、组合索引、全文索引和空间索引

1、普通索引

普通索引是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值

它的唯一任务是加快对数据的访问速度。常出现在查询条件(where) 或排序条件(order by) 中的数据创建索引

2、唯一索引 :不允许两行具有相同的索引

如果现有数据存在重复的键值,那么一般情况下不允许创建唯一索引,若已经创建了唯一索引,则当插入新数据表中的键值重复时,数据库将拒绝接受此数据。

如:若学生表中的 身份证列创建了唯一索引,则所有实习生身份证不能重复

注意:(1)、创建了唯一索引的列允许空值 (2)、若创建了唯一约束则自动创建唯一索引 (3)、尽管唯一索引有助于找到信息,但为了获得最佳性能,仍建议使用主键约束

3、主键索引:为表定义主键时自动创建主键索引

主键索引是唯一索引的特殊类型,要求主键中的每个值是非空的、唯一的

当在查询中使用主键索引时,允许快速访问数据

4、组合索引:将多个列组合为索引的索引

创建索引时,并不是只能对其中一列创建索引,与创建主键一样,还可以将多个列组合为索引,也就是组合索引。只有在查询中使用了组合索引最左边的字段时,索引才会被使用,即第一个字段作为前缀的集合

5、全文索引:定义索引的列支持值的全文查找,允许插入重复值和空值

全文索引可以在char、varchar 或text 类型的列上创建、主要用于大量文本文字中搜索字符串,此时使用全文索引的效率大大高于使用sql 的like 关键字效率

Mysql 4.5版本中只有 MyISAM存储引擎支持全文索引

6、空间索引:对空间数据类型创建的索引,如GEOMETRY、POINT 等

创建空间索引的列必须将其声明为NOT NULL,空间索引只能存在于 存储引擎为 MyISAM 的表中

 三、创建索引

索引的关键字时 INDEX 

-- 基本语法格式
create [unique|fulltext|spatial] index index_name
on  table_name(column_name[length]····)

其中:
1unique|fulltext|spatial 分别表示唯一索引 、全文索引和空间索引,为可选参数
2、index_name 和 table_name 表示要创建的索引名和指定创建索引的表名
3、column_name : 指定需要创建索引的列
4、length : 指定索引长度,可选参数,只有字符串类型才能指定索引长度

小例子:加快按照姓名查询学生信息的速度。需要在 学生表的姓名列创建索引,由于已经由主键,而姓名可能重复,故创建的为普通索引

-- 在db_myschool 库中,给tb_student 表的 studentName 字段创建一个名为  index_student_studentName 的索引
use db_myschool;
create index 'index_student_studentName'
on 'tb_student'('studentName')

虽然使用索引可以加快数据检索速度,但是没有必要为每个列都建立索引。因为索引自身也需要维护并占用一定的资源,在创建时可以参考以下标准创建

1、频繁搜索的列创建(如:经常用作查询选择条件的列,经常排序、分组的列、经常用作连接列(主键/外键))

2、仅包含几个不同值的列不创建

3、表中仅包含几行的小型表不创建,因为在索引中搜索数据所花的时间比在表中逐行搜索所花的时间更长

四、删除索引

语法格式:

-- 删除表中索引
deop index 表名.索引名

注意:(1)、删除表时,会将表中所有索引同时删除 (2)、删除表中列时,如果要删除的列是索引的组成部分或所有,则该列也会从索引中删除。

五、查看索引

语法:

-- 查看已经创建的索引
show index from 表名

小例子

-- 查看学生表中索引信息代码
show index from tb_studentG


G 表示将结果集按列显示
Table : 表示索引的表
Non_unique : 表示索引是否唯一,1表示不是唯一索引,0表示是唯一索引
Key_name: 表示索引名称
Seq_in_index: 表示该列在索引中的位置,若索引是单列,值为1,组合索引为每列在索引中定义顺序
Column_name: 表示定义索引的列字段
Sub_part: 表示索引长度
NUll : 表示该类是否能为空值
Index_type : 表示索引类型

 存储类型为 InnoDB 的表中,经常使用 唯一索引,普通索引,组合索引提高查询效率

优化SQL 语句的方式

1、查询时减少使用 * 返回全部列,不要返回不需要的列

2、索引应该尽量小、在字节数小的列上建立索引

3、where 子句中由多个条件表达式时,包含索引列的表达式应置于其他条件表达式之前

4、避免在order by 子句中使用表达式

5、根据业务数据发生频率,定期重新生成或重新组织索引,进行碎片整理

原文地址:https://www.cnblogs.com/obge/p/13174814.html