mysql索引学习笔记

什么是索引?
所谓索引就是对数据库表中的一列或多列的值进行排列的一种数据结构,好比BTREE或哈希排序算法,本质是经过不断的缩小获取数据的范围来筛选出最终想要的结果。
索引也是一张表,该表保存了主键与索引字段,及全部记录的引用指针。
mysql


索引的类型
UNIQUE惟一索引

索引列的值必须惟一,能够有NULL值。用于保证表中每一行数据的惟一性。
INDEX普通索引
容许定义索引列的值出现重复值和空值。用于加快数据的检索速度。
PRIMARY KEY主键索引
不容许出现相同的值,且不能为NULL值。一个表只有一个主键。
fulltext index 全文索引
在MySQL5.6如下,只有MyISAM表支持全文检索。在MySQL5.6以上Innodb引擎表也提供支持全文检索,但只适用于CHAR、VARCHAR和TEXT类型的字段,MySQL不支持中文全文索引
算法

按包含的列数又分为
1,单列索引

只包含单个列,一个表可有多个单列索引。
若where条件只有一个,用单列索引查询速度较快。
如有多个组合列,不要试图分别基于单个列创建多个单列索引,由于尽管每一个列都有索引,mysql只会用其中最有效率的列,即那个得到结果集记录最少的列。
2,复合索引
包含多个字段,只有在查询条件中使用了这些字段最左边的字段时,索引才会被应用。
只要列中包含null值就不会包含在索引中,联合索引中只要有一列含有null值,那么这一列的对于符合索引就是无效,也正是表设计时不要让字段默认值为null的缘由。
对于一张表来讲,若是有一个复合索引,就不必同时创建对应的单列索引。
sql

索引不会被引用的状况数据库

1.若mysql估计使用全表扫描要比使用索引快时,则不使用索引
2.索引列参与数学运算和函数运算不会被引用
3.含null值列的复合索引不会被引用
4.先后都有通配符的查询内容,索引不会被引用
5.Mysql查询只使用一个索引,若where子句已使用索引,那么order by中的列不会使用索引
6.用or分割的条件,若or前的条件中的列有索引,而or后面的列没有索引,那么涉及的全部索引都不会被用到
7.以%开头的like查询不会用到索引
数据结构

索引的弊端
索引并非越多越好。索引可提升查询效率,但会下降写数据的效率,增大IO压力,索引占用磁盘空间是成倍增长的,且很差的索引还会下降查询效率。
函数

1,随着数据量的增长,建立和维护索引要耗费时间也会增长。
2,索引须要占用磁盘空间,如有大量索引,索引文件可能比数据文件还大。
3,当对表中的数据进行增长、删除和修改时,索引也要动态更新,会增大IO压力。
spa

建立索引的技巧
1.不要在低基数的列上创建索引。count(distinct)/count(*)>0.6
2.对where,group by,order by 中出现的列创建索引。
3.为较长的字符串使用前缀索引,即索引字段应尽量的小。
4.不要在频繁更新的表创建过多的索引。
5.数据量小的表最好不要使用索引。
6.当惟一性是某列数据自己的特征时,可创建惟一索引。
7.尽可能使用短索引,即索引列字段值较短、索引字段数少于5个。
8. 在建立复合索引时,where子句中不重复值最多的一列放在最左边。
9.对字符串列创建前缀索引,适用于字符串自己较长,且前几个字符就开始不一样的状况(即前几个字符的选择性接近于全字段索引的选择性)。
设计

ALTER TABLE tablename ADD KEY(column_name(prefix_length))指针

前缀索引能有效减少索引文件的大小,提升索引速度。但mysql没法使用前缀索引作ORDER BY和GROUP BY,也没法使用前缀索引作覆盖索引(covering index)。排序

10.Covering index覆盖索引,即一个索引包含全部须要查询字段的列。
Select a from tablename where b=…
创建一个复合索引“b,a”

explain的extra字段值为using index说明使用的是covering index

建立索引的准备
用explain来解释select语句,查看执行计划是否用到了索引。Update、insert语句可拿出where子句转换为select语句。

explain重要参数介绍

1,id字段数字越大越先执行 2,table是表名 3,type是指本数据表与其余数据表间的关系      1)all即全表扫描数据表      2)eq_ref引用了惟一索引或主键      3)const引用了惟一索引或主键      4)index索引被所有扫描 4,key查询真正使用的索引名 5,rows执行计划中估计的扫描行数 6,extra额外信息,常见值有using where/using filesort/using temporary,见到后面两者赶忙建索引  

相关文章
相关标签/搜索