优化MySql表中的索引

时间:2017-11-24 16:17:58

标签: mysql database database-administration database-optimization

我在mysql数据库中有一个表,很快就会有大量的记录,所以我想添加一些索引以便在我的查询中获得更好的性能。我的查询有4个字段的变体,(template_id(int),data(text),state(int),hub_id(int))。这四个字段中的非字段不是我表的主键字段。我在这个表的查询中有以下3种类型的where子句:

where state = XXX
where template_id = XXX AND state = YYYY
where hub_id = XXX AND data = 'YYYY' AND template_id = ZZZZ

为此表制作索引的最佳方法是什么,该表有4列,其中where子句的组合不同?我应该为int字段创建3个单独的索引,为数据(文本)字段创建一个FullText吗?我假设最佳实践是为每个where子句组合创建一个索引,但在这种情况下,我应该如何处理作为文本字段的数据字段,将索引放在文本字段上是否合适?

感谢您的建议

2 个答案:

答案 0 :(得分:2)

查看你的典型条件,你应该使用3个索引,最后2个作为复合

 idx1(state)

 idx2(template_id, state)

 idx3(hub_id,data,  template_id)  or  idx3(hub_id,  template_id, data) 

取决于数据的基数和template_id

以这种方式,3个索引不会干扰其他索引,并且应该由sql optiminizer正确使用。

请记住,当sql优化器不选择您认为更好的索引时,可以使用FORCE或USE强制选择

答案 1 :(得分:1)

INDEX(state, template_id)  -- (in this order) handles the first two
INDEX(hub_id, data, template_id)  -- in any order handles 3rd

有关进一步的讨论,请参阅my cookbook