索引的其中一个缺点就是需要占用磁盘空间。
这个缺点是其他 优点的基础,因为任何一种机制,不可能只有优点,而没有缺点,正因为创建索引,就是把排序后组织成B树的数据,放到磁盘上,才有了索引,才有可能运用索引的各种优势。
既然是索引,就一定会占用空间,那么这里的主要问题就成了如何减少占用的空间?
(1)减少字段个数
如果索引中包含了很多字段,比如:A表,一共有20个字段,而创建的索引中包含了10个字段,那么会导致索引占用的空间,接近于表的空间,整个索引的层数会增加,同样找一条数据,需要更多IO,速度更慢。
是否索引中真的需要包含那么多的字段?
可以从需求角度分析,本来想让索引覆盖整个查询,但实际上真正起到过滤作用的字段,也就是放到where条件中的只有2个,那么,这个索引最好就是这2个字段,其他字段,可以通过回表来获取。
(2)占用字节数少的字段
对于where 条件中的字段,不受这个限制,就算占用字节数较多,也得放到索引中。
但是对于 select count(*) from tb 这种查询,可以在占用字节数最少的字段上创建索引。
比如:A表里有很多字段,其中 ID是numeric(10),flag是 tinyint,biz_date是datetime,name是varchar(30),memo是varchar(500)。
那么可以在flag字段上创建索引,可以显著加快select count(*) from tb查询的速度,因为flag字段的类型是tinyint,只占用1个字节,所以用这个字段创建的索引,体积会很小。