聚簇索引和非聚簇索引
主要区别在于组织索引的结构是否和数据存储的结构一样。一般再Innodb中主键索引就是聚簇索引,没有主键会默认生成隐藏主键字段。理论上也可以指定其他字段为聚簇索引,聚簇索引也不必唯一。
主键索引和普通索引
我们都知道,InnoDB引擎下的存储结构为b+树,也就是说首先根据key值一层一层的组织整个存储结构,然后在最后一层叶子节点存放真正的value值。那么我们用什么作为这个key值呢?主键索引就是将主键作为这个key值,非主键索引就是在建立索引时将其他值作为key。然后将主键作为value存储。非主键索引也被称为二级索引,而主键索引也被称为聚簇索引。
那么使用主键索引有什么好处呢?最大的好处就是只需要一次就能定位到真实的数据值,而普通索引都需要进行回表查询。也就是先查询主键ID。然后通过主键ID查询真实的value值。
最左前缀匹配原则
mysql建立索引的时候都是按照定义字段从左到右排序的。也就是说,如果存在索引(name,age)。最后建立的b+树的叶子节点肯定是从左到右先按照name属性分成n组。然后每组中再按照age属性排列的。所以当我们查询where name = XXX时,mysql就会使用上面的索引结构进行查询。而不是走全表扫描。但是如果是 where age = XXX 则不满足全局扫面。只能走全表扫描。
索引下推
索引下推是MySQL 5.6之后引入的。假如说我们存在索引(name,age)然后查询 where name like xxx and age = xxx and sex = xxx 在以前的话是先进行name索引查询,然后回表查询出name like xxx的结果。然后再筛选出age = xxx and sex = xxx的结果。也就是说符合name = xxx有多少条数据。我们就需要回表查询多少次。如果是5.6之后的版本。会将age = xxx这个条件在第一次匹配name like xxx 的时候就进行一次过滤。
联合索引、索引覆盖
上面我们就说过普通索引存在回表查询的操作,这里会大大影响效率。那么怎么避免这种情况呢。 我们可以在建立索引的时候就将要查询的数据列建立成索引,这样在查询的时候因为普通索引直接包含了所以要查询的数据,也就不需要回表查询了。也就是我们要查询的数据是索引key的子集。而这个索引key就是联合索引。也就是多个列共同建立的索引。