在索引这一块,其实是MySQL调优的一个比较大的一个过程,我来看的话,就是我们首先可以,就是我在创建索引的时候可能会考虑以下几个因素,首先覆盖索引,因为覆盖索引可以减少回表的次数,MySQL5.6以后对覆盖索引做了进一步的优化,可以就是支持索引下推的一个功能,我把我覆盖索引所覆盖的一个字段,在存储引擎层就进一步的进行了筛选,尽量减少回表的次数,然后我们可以在explain看它的执行计划的时候,那个Extra那个字段里面有Using index,这是我们可以看到的。然后其实我们可以进一步的对它进行优化,如果我们的存储介质使用的是机械硬盘的话,我们都知道机械硬盘它是,那个很怕随机读写的,我们可以把Mrr开开,就是multi range read,就是它可以把在回表之前,把我们的id读到一个那个buffer里面,进行一个排序,把原来的一个随机操作变成一个顺序操作,我觉得这就是覆盖索引可以做的一些优化,或者就是可以利用最左前缀原则和覆盖索引配合,可以减少一些索引的维护,就是这一块是可以做的。还有一块就是如果就是对一些普通索引,如果我们的是一个就是写多读少的服务,额,并且这个服务就是唯一性要求,没有那么高,或者我们的业务代码可以保证唯一性的时候,我们可以用普通索引,因为普通索引是可以用到Change Buffer的,Change Buffer就可以把一些写操作给缓存下来,在我们读的时候进行那个merge的操作,这样的话就可以提高就是写入的速度,这个的话是我认为在创建索引的时候就是可以考虑的一些点。还有一些点就是如果我这个索引走不上,我们应该考虑哪些方面?如果这个索引走不上的话,我们可以考虑第一,是不是我们的SQL写的有问题,比如说我们对索引字段进行了一些函数操作,或者就是在连接查询的时候,两个表的编码不一样,或者说有没有可能就是它两个字段的类型不一样这些。考虑过我们自身的SQL以后,可以考虑是不是索引统计信息有问题,如果索引统计信息有问题的话,我们可以去就是Analyze table重新统计索引信息,因为我们知道这个索引信息并不是一个准确值,它是一个随机采样的一个过程,可能会出现问题。嗯。。大概就这些。 ALTER TABLE table_name ADD INDEX indexName (column);
