手记

撩课-Mysql第20部分索引

什么是索引

索引用于快速找出
在某个列中有一特定值的行,
不使用索引,
MySQL必须从第一条记录开始
读完整个表,
直到找出相关的行,
表越大,
查询数据所花费的时间就越多,
如果表中查询的列有一个索引,
MySQL能够快速到达一个位置
去搜索数据文件,
而不必查看所有数据,
那么将会节省很大一部分时间

索引的优势与劣势
优势

类似大学图书馆建书目索引,
提高数据检索效率,
降低数据库的IO成本。
通过索引对数据进行排序,
降低数据排序的成本,降低了CPU的消耗。

劣势

实际上索引也是一张表,
该表保存了主键与索引字段,
并指向实体表的记录,
所以索引列也是要占空间的。
虽然索引大大提高了查询速度,
同时确会降低更新表的速度,
如对表进行INSERT、UPDATE、DELETE。

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

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

复合索引
一个索引包含多个列。
INDEX MultiIdx(id,name,age)

全文索引
只有在MyISAM引擎上才能使用,
只能在CHAR,VARCHAR,
TEXT类型字段上使用全文索引


索引操作
创建索引
CREATE INDEX 索引名称 ON table (column[, column]...);
create INDEX salary_index ON emp(salary)
删除索引
DROP INDEX 索引名称 ON 表名

查看索引

show index from 表名;
Table
表名
Non_unique
如果索引不能包括重复词,则为0。如果可以,则为1。
Key_name
索引的名称
Seq_in_index
索引中的列序列号,从1开始。
Column_name
列名称。
Collation
列以什么方式存储在索引中。
在MySQL中,有值‘A'(升序)或NULL(无分类)。
Cardinality
索引中唯一值的数目的估计值。
过运行ANALYZE TABLE或myisamchk -a可以更新。
基数根据被存储为整数的统计数据来计数,
所以即使对于小型表,
该值也没有必要是精确的。
基数越大,当进行联合时,
MySQL使用该索引的机会就越大。
Sub_part
如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。
 Packed
指示关键字如何被压缩。
如果没有被压缩,则为NULL。
Null
如果列含有NULL,则含有YES。如果没有,则该列含有NO。
Index_type
用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
Comment
索引备注信息

自动创建索引

在表上定义了主键时,
 会自动创建一个对应的唯一索引
在表上定义了一个外键时,
会自动创建一个普通索引

**EXPLAIN **

用来查看索引是否正在被使用,并且输出其使用的索引的信息。
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:
提供了与关联操作有关的信息,
没有则什么都不写。 

索引结构
先会对数据进行排序
btree索引

B+树索引
B+树是一个平衡的多叉树,
从根节点到每个叶子节点的高度差值不超过1
而且同层级的节点间有指针相互链接。hash索引
哈希索引就是采用一定的哈希算法,
把键值换算成新的哈希值,
检索时不需要类似B+树那样从根节点到叶子节点逐级查找,
只需一次哈希算法即可立刻定位到相应的位置,速度非常快。hash 索引结构的特殊性,
其检索效率非常高,
索引的检索可以一次定位,
不像B-Tree 索引需要从根节点到枝节点,
最后才能访问到页节点这样多次的IO访问,
所以 Hash 索引的查询效率要远高于 B-Tree 索引。

哪些情况需要创建索引

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

哪些情况不需要创建索引

表记录太少
经常增删改的表
如果某个数据列包含许多重复的内容
为它建立索引就没有太大的实际效果



作者:撩课_高新强
链接:https://www.jianshu.com/p/58826ebd47f8


0人推荐
随时随地看视频
慕课网APP