mysql 索引优化

一.聚集索引 clustered index(InnoDB默认依据主键列聚集,MyISAM不使用)

特点:B树每个叶子包含实际数据行,数据按照索引顺序地存储在物理页上。

优点:

1.范围查询,获取指定id的全部数据只需从磁盘读取少量数据页;如果不使用聚集索引,每条数据可能引起一次磁盘io。

2.由于索引和数据在同一个b树中,所以访问速度快

3.使用覆盖索引扫描的查询可以直接使用页节点中的主键值

缺点:

1.插入速度严重依赖插入顺序

2.页分裂问题,影响速度和占用更多存储空间

3.全表扫描变慢,因为数据由于页分裂而不连续,需要更多的磁盘io

4.二级索引包含聚集索引的主键列,大小由主键列大小决定,可能会占用更多空间

 

二.覆盖索引covering index

特点:索引中包含某些需要查询的字段的值,查询特定数据只需扫描顺序存储的索引,而无需回表查询。

优点:

1.索引条目远少于数据行,减少数据访问量,数据更容易全部放到内存中

2.索引是顺序存储的,范围查询不需要磁盘随机io

3.MyISAM内存只缓存索引,数据依赖操作系统来缓存,访问数据需要系统调用。减少系统调用次数。

4.InnoDB的二次索引如果进行覆盖,则可避免对主键聚集索引的二次查询

5.对于不在覆盖索引中的字段的查询,可以使用延迟关联(jion),先从索引中查询出符合条件的id,然后用id去数据表里取数据,减少直接在数据表中筛选的时间。

 

缺点:

1.只能使用b树做覆盖索引,hash、空间、全文索引都不适用。

2.不能在索引中执行like操作。

其他:

1.适量的数据冗余来减低联表带来的查询时间,在分布式中比较常用;

2.如果key是复杂的字符串,例如储存大量的URL,可食用自定义hash索引。先把URL hash成一个值,然后放到B树中管理。

3.如果URL太长,可以只hash URL的前面一部分字符,减少hash计算的工作量。

 

posted @ 2016-03-01 11:32  laojiajie  阅读(169)  评论(0编辑  收藏  举报