innodb索引使用

  • 本文针对的是mysql的innodb数据引擎来谈,innodb使用的是b+tree进行存储,数据存放在子节点上
  • 索引分成两类:聚集索引、辅助索引
    • 聚集索引:数据存放在聚集索引的叶子节点上,聚集索引依据主键进行顺序排序。在innodb中数据存储在聚集索引上
    • 辅助索引:除聚集索引外的索引,在innodb中叶子节点上存放的是主键,可以通过主键在聚集索引上找到对应的数据
  • 数据页:页是innodb中数据存储的最小单位,默认16k。每次查询都是以页来进行查询的,所以如果一页中能容乃的数据足够多,则可以减少io

这篇文章写的相当好:https://blog.csdn.net/IFollowRivers/article/details/73614549
聚集索引和辅助索引:https://blog.csdn.net/biexiaofei/article/details/78261273

innodb中必须有一个主键

  • 在innodb中的数据是按照主键的顺序来组织,如果没有主键则是第一个非空索引。如果以上都没有则innodb会自己创建出一个隐藏的键来进行排序,但是性能不是最优的。
  • 频繁更新的列不能作为主键
  • 不要使用uuid、md5作为主键(uuid md5都不能保证顺序增加,可能导致页分解)
  • 建议增加自增列做主键

哪些列增加索引

  • select、update、delete、where中的字段
  • order by、group by、distinct中的字段
  • 多表join关联列

多列索引如何决定顺序

  • 选择性高的放在最左边
  • 长度小的列放在左侧(单页可以容纳的数据更多,减少io)
  • 使用最频繁的放在左侧

多索引生效

  • 对于组合索引可以这样理解:组合索引(a,b,c),abc都是排好序的,在任意一段a的下面b都是排好序的,任何一段b下面c都是排好序的
  • 组合索引的生效原则是最左前缀原则:从前往后依次使用生效,如果中间某个索引没有使用(或者使用了范围查询),那么断点前面的索引部分起作用,断点后面的索引没有起作用
  • 组合索引 (a,b,c)和 (a,c,b)不同
-- 针对a,b,c组合索引
select * from mytable where  c=4 and b=6 and a=3;--where里的都能生效
select * from mytable where a=3 and b>7 and c=3;--where中a,b用到了索引,c没有,范围查询也算一个断点
select * from mytable where a=3 order by c;--a用到索引,c没有
select * from mytable where b=3 order by a;--都没有用到索引
select * from mytable where a=3 order by b;--a用到索引

多索引生效规则:https://www.cnblogs.com/codeAB/p/6387148.html

索引冗余和重复

  • 冗余:primary key(a), index(a), unique index(a) 三种不一样的东西但是效果相同
  • 重复:index(a,b), index(a,b,c)

对于频繁的查询首先考虑覆盖索引

  • 在innodb中可以避免二次查找,只需要在辅助索引上就可以完成查询
  • 二次查找会在聚合索引上查找,将使用随机io。因此索引覆盖可以把随机io变为顺序io。

避免使用外键约束,但是要在外键上建立索引

  • 存在外键,则每一个插入删除都需要检查外键约束,影响效率。数据的完整性可以再程序中保证
  • 但是join的列必须要有索引
  • 有外键不能使用truncate table,只能delete
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章