撩课-Mysql第20部分索引
2018-10-14 本文已影响34人
码蚁Q
学习地址:
撩课-JavaWeb系列1之基础语法-前端基础
撩课-JavaWeb系列2之XML
撩课-JavaWeb系列3之MySQL
撩课-JavaWeb系列4之JDBC
撩课-JavaWeb系列5之web服务器-idea
什么是索引
索引用于快速找出
在某个列中有一特定值的行,
不使用索引,
MySQL必须从第一条记录开始
读完整个表,
直到找出相关的行,
表越大,
查询数据所花费的时间就越多,
如果表中查询的列有一个索引,
MySQL能够快速到达一个位置
去搜索数据文件,
而不必查看所有数据,
那么将会节省很大一部分时间
![](https://img.haomeiwen.com/i577844/6f518aebfdfb483c.png)
索引的优势与劣势
优势
类似大学图书馆建书目索引,
提高数据检索效率,
降低数据库的IO成本。
通过索引对数据进行排序,
降低数据排序的成本,降低了CPU的消耗。
劣势
实际上索引也是一张表,
该表保存了主键与索引字段,
并指向实体表的记录,
所以索引列也是要占空间的。
虽然索引大大提高了查询速度,
同时确会降低更新表的速度,
如对表进行INSERT、UPDATE、DELETE。
![](https://img.haomeiwen.com/i577844/9309d758bc49aea8.png)
索引的分类
单值索引
即一个索引只包含单个列,
一个表可以有多个单列索引。
唯一索引
索引列的值必须唯一,
但允许有空值。
复合索引
一个索引包含多个列。
INDEX MultiIdx(id,name,age)
全文索引
只有在MyISAM引擎上才能使用,
只能在CHAR,VARCHAR,
TEXT类型字段上使用全文索引
![](https://img.haomeiwen.com/i577844/87fa9d315dd318d5.png)
索引操作
创建索引
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
索引备注信息
![](https://img.haomeiwen.com/i577844/910cbdac98f47d9e.png)
自动创建索引
在表上定义了主键时,
会自动创建一个对应的唯一索引
在表上定义了一个外键时,
会自动创建一个普通索引
**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条件里用不到的字段不创建索引
查询中排序的字段,
排序的字段若通过索引
去访问将大大提高排序速度
查询中统计或者分组字段
哪些情况不需要创建索引
表记录太少
经常增删改的表
如果某个数据列包含许多重复的内容
为它建立索引就没有太大的实际效果
如果你想要获取Xmind思维导图源件加群:869866610,进群可以获取以上技术的学习视频。