什么是索引:
索引用于快速找出某个列中有一特定值的行
不使用索引,MYSQL必须从第一条记录开始读完整个表,直到找出相关的行,
表越大,查询数据所花费的时间就越多
如果表中查询的列有一个索引,MYSQL能够快速到达一个位置去搜索数据文件
而不必查看所有数据,那么将会节省大部分时间
索引的优势和劣势:
优势:
类似于大学图书建书目索引,提高数据检索效率,降低数据库的IO成本
通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗
劣势:
实际上索引也是一张表。这张表保持了主键与索引字段,并指向实体表的记录,
所以索引列也要占空间的
虽然索引大大提高了查询速度,同时会降低更新表的速度
单值索引 一个索引只包含单个列,一个表可以有多个单列索引
唯一索引 索引列的值必须唯一,单允许有空值
复合索引 一个索引包含多个列
全文索引 只有在MYLSAM引擎上才能使用,只能在 CHAR,VARCHAR,TEXT
字段上使用
空间索引 空间索引是对空间数据类型的字段建立的索引,只有在MYLSAM引擎上才能使用
explain
explain
分析语句
\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 | 提供了与关联操作有关的信息,没有则什么都不写。 |
添加主键
ALTER TABLE emp_large ADD CONSTRAINT PRIMARY KEY(id);
使用主键之后,性能的对比
创建索引
CREATE INDEX 索引名称 ON table(col1,col2,...);
CREATE INDEX salary_index ON emp(salary);
那些情况需要创建索引
主键自动建立唯一索引
频繁作为查询条件的字段应该创建索引
查询中与其他表关联的字段,外键关系建立索引
频繁更新的字段不适合建立索引,因为每次更新不单单是更新了记录还会更新索引
WHERE 条件里用不到的字段不建议创建索引
查询中排序的字段,排序的字段若通过索引去访问将大大提高排序速度
查询中统计或分组字段
那些情况下不要创建索引
表记录很少
经常性删改的表
如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果
删除索引
DROP INDEX 索引名称 ON 表名;
查看索引
show index from 表名;
自动创建索引
在表上定义了主键时,会自动创建一个对应的唯一索引
在表上定义了一个外键时,会自动创建一个普通索引
CREATE INDEX age_index ON emp_large(age);
添加索引
CREATE INDEX age_index ON emp_large(age);
索引机制
Btree索引
B+树索引 是一个平衡的多叉树,从根节点到每个叶节点的高度差值不超过1,而且同层级的节点间有指针相互链接
hash索引
哈希索引就是采用一定的哈希算法,把链值换算成新的哈希值,检索时不需要类似 B+树那样从根节点到叶节点逐级查找,只需要一次哈希算法即可立刻定位到相应的位置,速度非常快