简单谈一下Mysql索引

为什么选择B+树

我们都知道哈希索引,但是并没有采用它,因为哈希索引在存储的时候是通过了hash值来进行存储,hash值是无序的,不能进行范围查找。还有就是进行排序的话也不能使用哈希索引。因为想UUID一样是无序的东西。

平衡二叉树
简单谈一下Mysql索引
只能存储两个结点,数据量很大的情况下,树的高度会非常的高,查询数据时就会很慢。
另外当我们查找id>的数时,首先要定位到5,然后回旋查找,效率很慢

B树
简单谈一下Mysql索引
树的高度相对于二叉树 高度降低,树更加粗壮,查找效率得到提升,但是对于id>5的问题,仍然需要先定位到5,然后进行回旋查找。

B+树
简单谈一下Mysql索引
叶子结点通过单项链表进行连接,用于解决回旋查找的问题。
非叶子结点只存储key,叶子结点存储了 key和value。

索引为什么会失效

简单谈一下Mysql索引
在联合索引中有以下特点
1、a是有序的
2、当a固定时,b也是有序的
所以联合索引就是先通过a字段进行排序,然后再通过b字段进行排序。
从而,在使用联合索引时要注意最左匹配原则。

select * from table where a = ‘1‘ and b = ‘3‘
这是使用到索引的
因为先对a进行排序,然后对b进行排序。
先查找到a后b也就是有序的了,所以就用到了索引
select * from table where b > ‘3‘
这没有使用到索引
因为b只有在a固定的情况下才是有序的,这个把a干掉了,b就是无序的,只能进行全表扫描
select * from table where a > ‘1‘ and b = ‘3‘
这没有使用到索引
查找到a>1后,b是无序的,所以不能通过二分查找查找b的数据,只能进行全表扫描。
a = 1的话就可以
select * from table where a like ‘%1‘ and b = ‘3‘
like 百分号放在左边的话就用不到索引
字符串排序是根据从前到后的字母顺序进行排序的,这样的话就不是有序的,就用不到索引

如何通过索引定位到一条数据

InnoDB与MyISAM的区别

MyISAM InnoDB
事物 不支持 支持
外键 不支持 支持
索引 非聚集索引 支持FullText类型的全文索引 聚集索引 不支持FullText类型的全文索引,但是可以通过sphinx插件进行实现,并且效果很好
锁粒度 最小是表级锁 最小支持行级锁
硬盘存储结构 .frm存储表的定义 .MYD存储数据文件 .MYI存储索引文件 Frm存储表的定义 Idb存储数据和索引文件,数据以主键进行聚簇存储,真正的数据存储在叶子结点中

聚簇索引和非聚簇索引

聚簇索引(InnoDB)
就是将数据与索引存放在一起,索引结构的叶子结点保留了行数据
表中的数据按照索引的顺序来进行存储,也就是索引项的顺序与表中记录的物理顺序一致。
其他索引成为辅助索引,根据建立索引的字段存储相应的id值 如根据name建立索引,那么久存储name以及对应的id值。
聚簇索引默认是主键
如果没有主键,就选择一列唯一的非空列作为聚簇索引
如果没有这样的列,就会生成一个GEN_CLUST_INDEX的隐式聚簇索引
非聚簇索引(MyISAM)
数据与索引分开进行存储
简单谈一下Mysql索引
MyISAM都是先通过数据找地址,然后根据地址找数据。

简单谈一下Mysql索引
通过辅助索引首先查找到对应的id,然后再根据主索引通过id进行数据查找。所以要经过两次查找,也就是所谓的回表。对于查询频率很高的数据字段,建议进行覆盖索引,如通过name查找手机号以及地址这样的请求频率很高,我们可以建立一个 name phoneNum address 这样的一个联合索引,避免了回表。

简单谈一下Mysql索引

上一篇:记录 Linux CentOS安装配置MySQL数据库


下一篇:mysql 查询某表的所有列,获取毫秒时间戳