mysql中的覆盖索引,二级索引和索引排序

索引起码用到range类型,不然查询效率会很差。

MySQL覆盖索引,也叫包含索引,通过查看explain中extra列是否有using index判断是否使用覆盖索引。因为覆盖索引要存储索引列的值,所以哈希索引,空间索引,全文索引都不存储索引列的值,MySQL只能使用B-Tree索引做覆盖索引。如果select查询只使用少部分列,可以把这些列放在索引后面,搞成联合索引,这样查询时,把这些列带上,成为覆盖索引,提高查询性能。


innodb的二级索引也就非主键索引,有唯一索引(值可以为空)、普通索引、前缀索引等。二级索引只存储了主键值,相比于聚簇索引,占用的空间要少,意味着innodb的二级索引可以利用这些额外的主键列来做覆盖索引,select actor_id,last_name from table where last_name='ss'(其中actor_id是主键列,last_name是二级索引列)。
MySQL中innodb在二级索引上使用共享锁,但访问主键索引需要排他锁。


延迟关联就是使用覆盖索引查询返回需要的主键,再根据这些主键关联原表获得需要的行,这个过程就是回表,这样减少MySQL扫描那些需要丢弃的行,select … from … where id>(select id from … where …)或者select … from a inner join (select id from a where … order by … limit 100000, 10) as x using id;

只有当索引的列顺序和order by子句的顺序完全一致,MySQL才能够使用索引做排序,还有满足最左前缀匹配原则,如果不满足可以指定索引列的值为常量,也可以使用联合索引,第一个列是常量t,第二列m进行排序,select … from … where t='' order by m desc;

为什么不要二叉树索引,因为自增主键的索引(1,2,3,4,5,6。。。)会退化成链表结构:

索引里面的节点都是按照顺序排放,树的每一层的容量是16kb(通过查询innodb_page_size获取),每个节点是8字节+6字节下一下节点的存储地址=14字节,每一行数据是1k,16k/1k=16,最终是1170*1170*16

 

posted @ 2020-07-26 17:06  ppjj  阅读(1328)  评论(0编辑  收藏  举报