我正在尝试加快我目前拥有的查询:
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的任何想法?
答案 0 :(得分:1)
一切,(field1
,is_current
,event_id
,pub_date
)在一个索引中。 MySQL只能在查询中为每个连接表使用一个索引。
使用EXPLAIN
查看您的操作后会发生什么。
另外,正如KoolKabin所说,*
很少是一个好主意。有时MySQL会复制临时表中的行;然后是沟通成本。你提出的问题越少,事情就会越快。
更新:我其实是错的。抱歉。首先,如果您的分组与您的订购不同,则无法充分利用索引编制。第二,你有一个索引,你的订购密钥(pub_date
)是第一个吗?如果没有,请尝试修复订购事项。
答案 1 :(得分:0)
这是因为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