MySQL枚举类型的小范围字段应不应该加索引?
回答这个问题前,要根据实际情况来,如果表数据不大,只有几百几千,那完全没有必要加索引;反之,则建议加。
案例:表引擎是InnoDB,有三千多万的数据,id为主键自增,sex性别是enum(‘0’,‘1’,‘2’),数据大小是1.8G,索引大小是1.2G,合计3G
sex字段分布的数据情况是:0有几个,2有几千个,1最多,有两千多万个;当要根据sex条件去查询时,比如:select * from bankcard.gd_visit where sex = '2';
如果sex没有加索引,那么这条SQL就会全表扫描,三千多万的数据量进行全表扫描,内存基本会溢出,不被打死才怪。然后再看sex加了索引之后的情况,执行
select * from bankcard.gd_visit where sex = '0';
select * from bankcard.gd_visit where sex = '2';
表现还行,返回的时间是毫秒级的
但是执行
select * from bankcard.gd_visit where sex = '1';
因为sex='1’有两千多万数据,占了总表数据记录数的绝大部分,所以即使sex加了索引,在这条SQL中的意义不大,也差不多要全表扫描,内存也基本会溢出。想要优化的话,可以一次查少一点,比如
select * from bankcard.gd_visit where sex = '1' limit 50;
表现还是不错的,基本毫秒级返回。如果sex条件就要包含在分页搜索中,当页码很多时,也就是偏移量很大时,可以对limit性能进行优化,上篇文章中讲到MSQL大表分页查询时limit优化