一、区分几个概念
1、页
1、页号:记录当前是第几页。
2、页目录:记录行数据,标记行开始的最小主键索引数据。
3、行数据:标识每一行的数据。1_111a 标识第一行数据,1_表示主键索引。
行与行数据使用链表有序相连。
4、一页数默认为16k,并且会指向下一页的地址。
2、b+树
多个页相互连接在一起,为了方便查找会再向上生成一个新的类似页的东西,记录页码和每页最小的主键索引,按照这个思路就会生成一颗树,这就是一个b+树。
3、回表,如果是一个聚集索引(abc),在最下面的叶子节点存储的不会是真实数据,而是对应的主键索引,所以如果查询的时候查的数据并非abcd这四个字段,比如查询的是abcde,就需要回表根据主键id继续查询。
select a,b,c,d,e from X where a=1 and b=2 and c=3 and d=e; 是不能利用索引的。
select a,b,c from X where a>1; 是不能利用索引的,因为回表的话会全表扫描。
查询过程会先查询a=1,找到数据后查询后续所有数据。
select a,b,c from X where a>7; 可能会利用索引,因为mysql优化器认为即使回表返回的数据不会很多,效率比全表扫描高一些。
4、如何建立索引
① 索引选择:选择性 = 不重复的记录数 / 总记录数
选择性的取值范围为(0, 1],选择性越高的索引价值越大。如果选择性等于1,就代表这个列的不重复值和表记录 数是一样的,那么对这个列建立索引是非常合适的,如果选择性非常小,那么就代表这个列的重复值是很多的, 不适合建立索引。
② 最左前缀原则
③ 1>索引列的类型尽量小
2>利用索引字符串值的前缀
3>主键自增
4>定位并删除表中的重复和冗余索引
5>尽量使用覆盖索引进行查询,避免回表带来的性能损耗。