mysql索引机制

索引的定义
索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。

Hash       索引方法
复杂度:O(1) 
优势:迅速的找到内容
劣势:没法做范围的查询。

平衡二叉查找树缺陷
1.搜索时IO次数过多
2.节点数据内容太少

B Tree(多路平衡查找树)
路 = 关键字的个数 + 1
 
MySQL为什么选用B+Tree? 
B+树查找数据规则采用左闭合区间,不存在命中,直接找到最底层叶子节点的数据区。
1.B+树是B树的变种(PLUS版)多路绝对平衡查找树,它拥有B树的优势
2.B+树扫库、表能力更强(数据区集中在最底层叶子节点)
3.B+树磁盘读写能力更强(磁盘省略了数据区开销,关键字可以更多)
4.B+树的排序能力更强(最底层数据区相邻端采用链表结构)
5.B+树的查询效率更加稳定(查找数据区的IO次数固定)

mysql中,存储引擎是mysql的一大亮点,它是一种插件式的方式。
Myisam引擎:
frm->表结构定义文件
MYD->数据文件
MYI->索引文件

innodb引擎:
frm文件
idb文件
以主键为索引来组织数据的存储
聚焦索引:数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同。
主键索引:数据区保存具体数据
辅助索引:数据区保存主键的值,通过主键的值二次查找最终获得数据
没设置主键会有默认主键,是隐藏的int类型Id,6位字节的自增序列。

索引的几大原则:
列的离散性
计算公式:
count(distinct col):count(col)
离散性越高,选择性越好
当你列的离散性很低时,最好不要建索引,建了不仅没什么用,还增加开销。

最左匹配原则
对索引中关键字进行计算(对比),一定是从左到右依次进行,且不可跳过
字符串会转为ASCII码进行对比,再排序。

单列索引   联合索引
单列索引是特殊的联合索引
where条件下经常要使用的列放在最前面

覆盖索引
如果查询的列,通过索引项的信息可直接返回,则该索引称之为查询SQL的覆盖索引
select * 少用,多使用指定列,因为可能减少IO,可能使用到覆盖索引,提高查询效率。

1.索引列的数据长度满足业务的情况下能少则少,因为在磁盘大小相同的情况下,数据长度越小,可建立的关键字越多,选择性越高,大大增加查询效率。
2.表的索引并不是越全越好,建索引,要花费一定的时间,当进行事务操作时,维护索引需要频繁的做结构的维护工作,带来很多性能消耗。
3.Where条件中 like abc%不一定用到索引,当abc的离散性低才会用到,like %99%,like %99 用不到索引,%意味着选择性多,离散性差。
4.Where条件中 NOT IN 无法使用索引,<>在覆盖索引的情况下,会使用索引,
多重范围不会走索引,函数也不会走索引

联合索引
联合索引中如果不是按照索引最左列开始查找,无法使用索引。
联合索引中精确匹配最左前列并范围匹配另外一列可以用到索引。
联合索引中如果查询中有某个列的范围查询,则其右边的所有列都无法使用索引。

 

 

 

 

 

你可能感兴趣的:(MySql)