mysql -2 索引

1、索引是什么,作用是什么?

        索引是数据库中一个排序的数据结构。

        数据是以文件的形式存放在磁盘上面的,每一行数据都有他的磁盘地址,如果没有索引,比如100万条数据,在查询其中一条数据的时候就要遍历整张表,直到找到这条数据。(遍历表是循环调用存储引擎读取下一行数据的接口)。效率非常低。

        有了索引之后,索引是用来快速检索的数据结构,我们根据索引的数据找到磁盘地址,就可以直接拿到数据。

2、索引类型

        普通索引(Normal):非唯一,没有其他约束

        唯一索引(Unique):唯一索引要求值不能重复

        主键索引(Primary Key):键值不能重复,不能为空。

        全文索引(Fulltext):值存储的数据比较大,有几KB 的数据,要解决like 查询效率低,就用全文索引。只有文本类型的字段才能创建:char 、 varchar、 text。

        联合索引 :

3、索引

4、二叉树的特点,如果用二叉树做索引会发生什么

5、平衡二叉树的特点,如果用二叉树做索引会发生什么

6、多路平衡查找树 (B Tree)

7、B+Tree (加强版多路平衡查找树)

        特点

        1、关键字的数量和路数是相等的。

        2、B+ Tree 的根节点和枝节点中都不会存储数据,只有叶子节点才存储数据。

        3、B+ Tree 的每个叶子节点增加了一个指向相邻叶子节点的指针,他的最后一个数据会指向下一个叶子节点的第一个数据,形成一个有序链表的结构。

        4、B Tree 解决了两大问题。每个节点存储更多的关键字;路数更多。(B+ Tree 一样)

        5、B + Tree 扫描库、扫描表的能力更强,(全表扫描,只需要遍历叶子节点就可以了,不需要遍历整棵 B + Tree )

        6、B + Tree 的磁盘读写能力比B Tree  来说更强(根节点和枝节点不保存数据区,所以一个节点可以保存更多的关键字,一次磁盘加载的关键字更多)

        7、排序能力更强 (因为叶子节点上有下一个数据区的指针,数据形成了链表)

        8、效率更加稳定 (B+ Tree 永远是在叶子节点上拿到数据,所以IO次数是稳定的)

8、Hash 索引

        1、创建索引有两种选择,其中一种Hash 索引。

        2、Hash 索引: 以key value 形式检索数据,他会根据索引字段生成哈希码和指针,指针指向数据。

        3、特点:

                1、时间复杂度是O(1) (这里表示欧1时间效率算法),查询速度比较快,但是hash 索引里面的数据不是按顺序存储的,所以不能用于排序。

                2、在查询数据的时候要根据键值计算哈希码,所以只能支持等值查询 ( =  ,IN ),不支持范围查询 ( >  <   >=  <=  between and )

                3、如果字段重复值很多的时候,会出现大量的哈希冲突(采用了拉链法解决),效率会降低

                注意: InnoDB 不能显示地创建一个哈希索引

9、B + Tree 

        1、

10、InnoDB  的索引:

        1、在InnoDB 里面,是以主键为索引来组织数据的存储的

        2、InnoDB 的主键索引的叶子节点上,它直接存储了数据。

        3、聚集索引 (聚簇索引):

                索引键值的逻辑顺序和表数据行的物理存储顺序是一致的。(比如字典的目录是按照拼音排序的,内容也是按照拼音排序的,按拼音排序的这种目录就叫聚集索引)

        4、InnoDB里面,它组织数据的方式叫做聚集索引组织表,主键索引叫聚集索引,非主键都是非聚集索引。

        5、非主键索引是怎么存储的?

                非主键索引存储的是非主键索引和主键值,如果使用非主键索引查询,会根据主键值在主键索引中查询,然后在叶子节点取得最终数据。

                也就是其他的索引也存储了主键的值。

        6、一张表没有主键怎么办?

                1、如果定义了主键 primary key , 那么InnoDB会选择主键作为聚集索引。

                2、如果没有显示定义主键,InnoDB会选择第一个不能为空的唯一索引作为主键索引。

                3、如果也没有这样的唯一索引,InnoDB 会选择内置6字节长的RowId作为隐藏的聚集索引,他会随着记录的写入而逐渐递增。

11、索引使用原则:

        1、列的离散度

                就是重复数据越少,列的离散度越高。

        2、联合索引最左匹配:

                两个字段联合索引,

                比如: Alter Table user add Index name_phone_index (name , phone);

                如果查询时候,where 后面有 name = 'xx',

                where  name = 'xx' and phone = 'yyy' 

                where phone = 'yyy'  and name = 'xx'

                where  name = 'xx'

                上面这三种查询 会用到 联合索引。

                where phone = 'yyy'  

                这种查询不会用到联合索引。

                这个联合索引相当于创建了两个索引:(name)、(name, phone)

        3、覆盖索引

                回表:

                        

 

12、索引的创建与使用

        1、在用于where 判断、 order 排序 和 join 的 on 字段上创建索引

        2、索引的个数不要太多

                浪费空间、更新变慢

        3、过长的字段,简历前缀索引

        4、离散度低的字段,不要建索引。

        5、频繁更新的值,不要作为主键或者索引。

                容易导致页分裂。

        6、随机无序的值,不建议作为主键索引,例如身份证、UUID

                因为无序,分裂。

        7、组合索引把离散度高的字段放在前面。

        8、复合索引比单列索引有优势。

13、什么时候用不到索引?

        1、索引列上使用函数 、表达式计算时。

        2、like 条件前面有 % ,就用不到索引。

        3、负向查询:

                NOT LIKE  不能用到索引

                !=    <>   和 NOT IN 有些时候会用到索引,有些时候用不到索引。看优化器               

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值