为什么要引入索引
使用索引的全部意义就是:通过缩小一张表中需要查询的记录/行的数目来加快搜索的速度。 (类比于书的目录结构)。
一个索引是存储的表中一个特定列的值的数据结构。索引包含一个列中的所有的值,并且这些值存储在一个数据结构中。
在关系型数据库中,索引是一种单独的、物理的对数据表中一列或多列的值进行排序的一种存储结构, 它是某个表中一列或若干列值的集合和对应的指向表中物理标
识这些值的数据页的逻辑清单。
索引的数据结构
1.HASH 与 BTREE
常见的数据结构有两种:
hash哈希结构,增/删/改/查平均时间复杂度都为O(1);
Tree树结构, 增/删/改/查平均时间复杂度都为O(log(n));
这样看,hash结构似乎更加快速,但是实际场景中可能 orderby 需要排个序,groupby 还要分个组,还要比较大小 大于或小于等等。如果继续用HASH类型做索引结构,其时间复杂度会从O(1)直接退化为O(n)。Tree的特性保证了不管是哪种操作,依然能够保持O(log(n))的高效率。
2.BTREE
BTREE,又叫多路平衡查找树,B树的查找基本包含两个操作:1) 在B树中找结点 2)在结点内找关键字。由于B树通常存储在磁盘中,则前一个操作通常在磁盘上进行的,而后一个查找操作是在内存中进行的。
3.B+树
应数据库所需而出现的B树的变形。
索引衡量标准——Cardinality 索引基数
索引基数简单的说就是:你索引列的唯一值的个数,如果是复合索引就是唯一组合的个数。
这个值将会作为MySQL优化器对语句执行计划进行判定时依据,如果唯一性太小,那么优化器会认为这个索引对语句没有太大帮助,而不使用索引。索引基数值越
大,就意味着索引能排除更多重复合的数,也就更为高效。
索引类型
普通索引
唯一索引:唯一性约束,但是可以有NULL值
主键索引:一张表只能有一个主键索引,不允许重复的值,也不允许NULL值,
组合索引
外键索引:只有InnoDB类型的表才能使用外键索引。
全文索引:没啥卵用
索引创建的原则
- 数据列中不重复的个数越多,越适合创建索引。
- 对于 where ,on, group by ,order by 中出现的列使用索引,
- 索引列的基数越大越好,索引的效果越好。
- 对字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间。比如:
firstname,varchar(50);用 alter table employee add key(firstname(5))来对前5个字符设置索引
- 使用组合索引,要优于多个单列索引
- 查询多的更适合创建索引,DML多的不适合索引,因为每次增删改都得重新建立索引。
索引注意事项
1.复合索引遵循前缀原则。
2.like查询,%不能在前,索引会失效,可采用全文索引。
3.or前面的有索引,后面的没有,都不会用到。
4.如果列是字符串类型,一定要加引号,不然索引失效。