索引的基础代码:
查看代码 show index from 表名;
创建索引 create index 索引名 on 表名(列名);
删除索引 drop index 索引名 on 表名;
1.为什么要创建索引
举一个形象的例子,没有索引的MySQL数据库,就像一个就像拿着一个字在字典里面一页一页翻,而有索引的就像字典里面的首字母,一下让你找到在多少页,速度快了不止一倍。所以创建索引的最重要的一点就是可以提升查询速度,但唯一不好的就是要浪费空间,但和速度比起来,这点空间可有可无。
2.索引的内容
索引的核心内容就是它的底层数据结构,而那些数据结构可以提升查询速度呢,
有顺序表(随机访问),链表(中间位置增删),栈/队列(特殊位置的操作),树->主要为二叉树。
其中比较卓越的是二叉树中的红黑树还有哈希表,但哈希表只能计算key值相等的情况,hash映射后不能反应计算出来hash值大小关系,所以并不适合数据结构,
红黑树也不适合,因为数据库其中的数据元素有很多,所以会导致树变高,变高之后查询的效率会很底下,因为每次要走一遍,越高越慢,所以也不适合。
3.因此就代入了B树(N叉搜索树)
特点:每个节点上可以存储多个元素,延伸出多个子树,以同样数量的数据,但树的高度大大降低。
每个方框是一个节点,每个数字代表一个key(或者是一行数据库中的记录)
就好似这种,B树的查找特点:
1.每个节点上的这些key也是有序列的,比较的时候可以直接二分查找
2.B树也会控制,某个节点上保存的key不会太多,如果插入更多的元素,使key变多了,就会再次分裂,弄出更多的子树
3.多个数据,都是放在一块连续的存储空间上,进行比较的时候,一次硬盘io就能读出整个节点,就可以直接完成上述比较
但其实数据库使用的是B+树,B+树中最右边的既为最大数,不能超过,这是和B树的区别,这也是优势,
按照这样排列数据,叶子节点这里就可以包含数据集合的全集,然后B+树会把叶子节点串联起来,以链表的结构,这样就方便遍历表中的所有数据,也方便范围查询
B+树的优势:
1.非常方便遍历和范围查询
2.查询时间稳定,因为每一次的查询都要落到叶子节点,时间io是固定的
3.占用空间小,因为到叶子节点是数据的全集,就是表的每一行都关联在叶子节点,这样就可以把非叶子节点只保存单纯的一个key值就可以了。然后把非叶子节点可以缓存在内存中,这样速度可以上一个档次,比硬盘中快很多。
还有重要的一点就是针对索引列进行查询,就是从树根节点往下一层一层的查询
针对非索引列查询,就拿着最底下一层叶子节点,遍历链表就行了。
代码就如
1.走索引的情况:
select * from student where id = 20;
这种就是拿这二十,树根结点来找区块
select * from student where id > 20 and id<100;
这种直接范围查询,速度非常快
2.不走索引的情况:
select * from student where classld = 102;
这种就要拿着102去叶子节点的链表一个一个遍历,会非常慢