mysql可以靠索引,而我只能靠打工....

  介绍

这篇文章给大家分享的是有关mysql可以靠索引,而我只能靠打工....的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

面试的时候肯定会问这一个问题,mysql为什么会选择b +树作为索引呢?而不选择其他索引,例如b树?哈希?

<引用类=" multiquote-1 ">

下面说的磁盘IO是指数据从硬盘加载到内存中的操作

    <李> <节>

    <强>哈希索引的话强,不支持范围查询,因为哈希就是一个键对应一个值的,没办法范围查询

    <李> <节>

    <强>二叉树的话强劲,它的特点就是左子树小于根节点小于右子树,如果根节点取值有问题的话,有可能会退化成链表,就是树不分叉了,树一直往左或者一直往右,这样就不能折半查找从而减少IO次数了,不支持范围查询,要是范围查询的话,每次都要从根部遍历,树也太高了,树越高,IO操作越频繁,浪费资源

    <李> <节>

    <>强平衡二叉树的话强,它就没有了二叉树的这种退化成链表的缺点,因为他左右子节点最多相差1层,可是他也不支持范围查找这一点和二叉树的问题一样

    <李> <节>

    <强> b树的话强,和二叉树比起来树是很矮的胖,IO操作减少了,是个多叉树,它每个节点都存了对应的行数据,可是如果这一行的数据的列不断的增加,那么这一页存储的节点就会变少,因为所占的空间不断的变大,树也会越来越高,增加IO操作次数,同时是也不支持范围查找。要是相同大小的空间可以存很多的节点数据的话就更好了,所以就有了下面的b +树

    <李> <节>

    <强> b +树它非叶子节点只存索引的数据,不存整行数据,但是叶子节点是冗余的,冗余了非叶子节点,叶子节点还都用双向链表链接起来,这样有助于顺序查找,b +树和b树比起来,更加矮胖,磁盘IO次数更少

    <李> <节>聚簇索引与非聚簇索引
<引用类=" multiquote-1 ">

我们可以简单的理解为   聚簇索引就是主键索引,非聚簇索引就是普通索引

<强>本质的区别是

<引用类=" multiquote-1 ">

<强>聚簇索引强劲的叶子节点存储的是整行数据

<引用类=" multiquote-1 ">

innodb是通过主键来实现聚簇索引的,如果没有主键的话,那么他就会选择一个唯一非空的索引来实现,如果再没有的话,他就会隐式生成一个主键来实现聚簇索引

<引用类=" multiquote-1 ">

<强>非聚簇索引强存储的是索引值和主键值

    <李> <节>

    <>强普通索引一张表中可以有多个普通索引,随便一个字段都可以建立的索引,我们平常建立的索引大部分都是普通索引

    <李> <节>

    <>强联合索引好几个字段联合起来建立的索引

    <李> <节>

    <强>唯一索引强业务中唯一的字段适合建立唯一索引,一个表中可以有多个唯一索引

    <李> <节>

    <强>主键索引强和唯一索引一样,主键索引也是唯一的,不同的就是,一个表只能有一个主键索引

创建主键索引

 ALTER TABLE测试添加主键(id)复制代码

创建唯一索引

ALTER TABLE测试添加独特idx_id_card (id_card)复制代码

创建普通索引

 ALTER TABLE测试添加索引idx_name(名字)复制代码

创建联合索引

改变表测试添加索引idx_age_name(年龄、名称)复制代码

修改索引名称:先删除再添加

删除索引(两种方式)

 

我们先给名字字段添加一个索引,索引名字叫做idx_name

 ALTER TABLE测试添加索引idx_name(名字)复制代码

查看测试表中的索引

显示指数从测试复制代码

其中的属性

    <李> <节>

    <强>表:表名

    <李> <节>

    <强> Non_unique 强:能重复的话为1,不能重复的话为0,我们主键的那里是0,而那名字里是1,因为名称可以重复,而主键不能重复

    <李> <节>

    <强> Key_name :索引名称

    <李> <节>

    <强> Seq_in_index

    mysql可以靠索引,而我只能靠打工....