Mysql索引

1、索引引入
用户对数据库最频繁的操作是进行数据查询。一般情况下,数据库在进行查询操作时需要对整个表进行数据搜索。
当表中的数据很多时,搜索数据就需要很长的时间,这就造成了服务器的资源浪费。为了提高检索数据的能力,数据库引入了索
引机制。

2、什么是索引
类似字典的目录,通过目录查询到内容更快

3、索引作用
索引的优点:
    1)可以提高我们对数据库的查询速度
索引的缺点:
    2)但是在更新、插入、删除时 也会去更新本地的索引文件,会影响性能;
    3)建立索引会占用磁盘空间的索引文件{即:空间换时间 的做法}

4、表的哪些列适合创建索引?
1)经常查询的列适合创建索引,如,主键ID(这个不需要创建索引,因为主键唯一自带索引)
2)经常修改的列不适合创建索引
3)列的值重复较多的适合创建索引


4-1、哪些情况需要创建索引?
1)主键自动建立唯一索引
2)频繁作为查询条件的字段应该创建索引
3)查询中与其他表关联的字段,外键关系建立索引
4)频繁更新的字段不适合建立索引,因为每次更新不单单是更新了记录还会更新索引
5)WHERE条件里用不到的字段不创建索引
6)查询中排序的字段,排序的字段若通过索引去访问将大大提高排序速度
7)查询中统计或者分组字段


4-2、哪些情况不需要创建索引?
1)表记录太少
2)经常增删改的表
3)如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果

4-3、自动创建索引:
1)在表上定义了主键时, 会自动创建一个对应的唯一索引;
2)在表上定义了一个外键时,会自动创建一个普通索引


5、哪些情况会让索引失效
   1)like的是否会让索引失效
     如: like '%XXX' 、 like '%XXX%'
     但:liek 'XXX%' 不会让索引失效
   2)where 1=1 会让索引失效
   
6、索引算法:
1)二叉树算法--只适用与innodb引擎的数据库
B+树是一个平衡的二叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。
2)hash算法--只适用于memery引擎的数据库
哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需
一次哈希算法即可立刻定位到相应的位置,速度非常快。
hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree索引需要从根节点到枝节点,最后才能访问
到页节点这样多次的IO访问,所以Hash索引的查询效率要远高于B-Tree索引

7、索引创建、删除
创建语法:
create index 索引名 on 表名 (列名)

删除语法:
1)方式一:drop index 索引名 on 表名
2)方式二:alter table 表名 drop index 索引名


8、修改表添加索引
alter table 表名 add 索引名 (列名);
一次添加多个索引
alter table 表名 add 索引名1 (列名1), add 索引名2(列名2);


举例:
create index index_product on t_product(category_id)

[SQL]create index index_product on t_product(category_id)

受影响的行: 14  
时间: 0.037s
这里影响了14行即全表的数据,说明了什么?
说明:创建了索引的确是对全表起到了目录的作用

9、查看一张表的索引
show index in 表名;
show index from 表名;
show index from t_emp;


10、explain
用来查看索引是否正在被使用,并且输出其使用的索引的信息。
用法:
explain sql语句;
explain select * from t_emp where age=20\G;  【\G可采用列表的形式显示结果】

字段列解释:
id: 
    SELECT识别符。这是SELECT的查询序列号,也就是一条语句中,该select是第几次出现。在次语句中,select就只有一个,所以是1.
select_type:
    所使用的SELECT查询类型,SIMPLE表示为简单的SELECT,不实用UNION或子查询,就为简单的SELECT。
table:
    数据表的名字。他们按被读取的先后顺序排列
type:
    指定本数据表和其他数据表之间的关联关系,该表中所有符合检索值的记录都会被取出来和从上一个表中取出来的记录作联合。
key:
    实际选用的索引
possible_keys:
    MySQL在搜索数据记录时可以选用的各个索引,该表中就只有一个索引,year_publication
key_len:
    显示了mysql使用索引的长度(也就是使用的索引个数),当 key 字段的值为 null时,索引的长度就是 null。注意,key_len的值可以告诉你在联合索引中mysql会真正使用了哪些索引。这里就使用了1个索引,所以为1,
ref:
    给出关联关系中另一个数据表中数据列的名字。常量(const),这里使用的是1990,就是常量。
rows:
    MySQL在执行这个查询时预计会从这个数据表里读出的数据行的个数。
extra:
    提供了与关联操作有关的信息,没有则什么都不写。 

索引的理解.png

你可能感兴趣的:(Mysql索引)