left join时可能会导致mysql不走索引的一些原因:
1.关联两张表字符集不一样会导致mysql不走索引;
2.select查询字段太多会导致不走索引;
聚族索引
索引的主要目的是为了加快查询的速度,索引一般使用b-tree结构实现,其索引列信息位于叶子节点上
且索引列只包含整列数据的位置,但并不包含此索引列相关的数据。聚族索引与其他索引不同,在他的
索引列上包含了此列的完整数据信息
,因此可以通过聚族索引直接找到对应的数据,而不需要再去通过
索引
信息去
磁盘寻找数据信息(这样会减少磁盘访问量)。
覆盖索引
覆盖索引就是根据聚族索引的优势,对查询的列建立一个覆盖的索引列信息,这样索引中就包含了要
查询的数据信息,这样也可以避免再去通过索引查找对应的完整数据列。
因此
可以通过覆盖所以优化查询速度
,但是又不宜对太多字段建立覆盖索引,此时有个折中方法,先查询
可以使用覆盖索引访问的列,然后对查询的数据join关联,从而查找出需要的完整信息。
— 如果通过覆盖索引从大量的数据中只返回少量的数据,这时通过join获取完整信息比直接查询完整信息效率高;
— 如果通过覆盖索引从大量的数据中返回大量的数据,这时与不使用覆盖索引没什么区别;
— 如果只有少量的数据,则直接查询会比较省时。
聚族索引和二级索引
mysql中每个表都有一个聚簇索引(clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引(secondary indexes)。
以InnoDB来说,每个InnoDB表具有一个特殊的索引称为聚集索引。如果表存在主键,该主键索引是聚集索引。如果未定义主键,MySQL取第一个唯一索引(unique)而且只含非空列(NOT NULL)作为主键,InnoDB使用它作为聚集索引。如果没有这样的列,InnoDB就自己产生一个这样的ID值,它有六个字节,而且是隐藏的,使其作为聚簇索引。