Mysql性能优化之索引

来源:互联网 发布:电影php用什么打开 编辑:程序博客网 时间:2024/05/18 00:04

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值,它有六个字节,而且是隐藏的,使其作为聚簇索引。