应该将哪些字段编入索引?通过...分组?订购?

时间:2010-10-05 18:42:09

标签: mysql database query-optimization

我正在尝试加快我目前拥有的查询:

SELECT * 
FROM `events` 
WHERE (field1 = 'some string' or field1 = 'some string') 
    and is_current = true 
GROUP BY event_id 
ORDER BY pub_date

大约需要30秒。

field1是varchar(150)

我正在编制索引 field1,is_current,event_id,pub_data 慈善机构,pub_date,is_current 和所有领域分别......

我真的不确定哪些字段应该被索引在一起,当我删除订单时,查询速度最多大约8秒,如果我删除了顺序和分组,它不到1秒。 ..

在这种情况下应该准确索引哪些内容以加快查询速度?

编辑: 我已经对修改后的查询(不再包括组)进行了解释:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
    1   SIMPLE  events  range   is_current,field1_2,field1_3,field1_4,field1    field1_3    153     NULL    204336  Using where; Using filesort

这表明它正在使用关键字field1_3,即:field1& is_current
虽然它没有使用包含那两个字段和pub_date的键(用于排序..?)

它也使用FILESORT,这似乎是主要问题..

即使pub_date字段也被索引(与其他字段一起),为什么它使用filesort的任何想法?

2 个答案:

答案 0 :(得分:1)

一切,(field1is_currentevent_idpub_date)在一个索引中。 MySQL只能在查询中为每个连接表使用一个索引。

使用EXPLAIN查看您的操作后会发生什么。

另外,正如KoolKabin所说,*很少是一个好主意。有时MySQL会复制临时表中的行;然后是沟通成本。你提出的问题越少,事情就会越快。

更新:我其实是错的。抱歉。首先,如果您的分组与您的订购不同,则无法充分利用索引编制。第二,你有一个索引,你的订购密钥(pub_date)是第一个吗?如果没有,请尝试修复订购事项。

答案 1 :(得分:0)

即使pub_date字段也被索引(与其他字段一起),为什么它使用filesort的任何想法?

这是因为mysql优化器正在尝试使用索引“field1”,并且您希望使用pub_date排序的数据。如果您使用的是mysql 5.1(以下查询将在早期版本中给出错误),您可以强制mysql使用pub_date索引进行排序,如下所示

SELECT * 
FROM `events` 
force index for order by (pub_date)
WHERE (field1 = 'some string' or field1 = 'some string') 
    and is_current = true 
GROUP BY event_id 
ORDER BY pub_date