如何解决"使用临时" (没有"使用filesort")

时间:2015-07-06 05:50:19

标签: mysql indexing explain

现在,我研究索引到MySQL表并理解解释结果。

我有这个表(因为这是在Rails项目中,下面的代码是schema.rb)。

create_table "users", force: true do |t|
  t.string   "name"
  t.string   "carrier",         limit: 1
  t.datetime "created_at"
end

carrier列是其无线运营商的缩写。这一次,为了简单起见,它可以有三个模式字符值:' a'或者' b'或者' c'。

我想在一定时期内计算每个航空公司的记录。我在crated_at和carrier上设置了综合索引并执行,

SELECT carrier, COUNT(carrier) 
FROM users 
WHERE created_at BETWEEN '2015-06-14' AND '2015-06-30' 
GROUP BY carrier

解释这个sql说"Using where; Using index; Using filesort; Using temporary"。根据MySQL的推荐,MySQL在执行group by时会自动排序。通过添加order by null来查询,我们可以取消行为。所以我改写了,

解释:     SELECT运营商,COUNT(运营商)     来自用户     WHERE created_at BETWEEN' 2015-06-14' AND' 2015-06-30'     GROUP BY运营商     ORDER BY null

解释这个查询是,

Using where; Using index; Using temporary

虽然Using filesort消失了,Using temporary仍然存在。我认为Using temporary也用于排序,并且与Using filesort一起消失,但不是这样。

我能解决这个Using temporary吗?为什么输出这个陈述?

编辑:

num of recode大约是100000,我将max-heap-table-sizetmp-table-size增加到128MB(默认值为16MB)。(我对这些变量的理解不明确......)。解释结果没有改变。

EDIT2:

我将innodb_sort_buffer_size增加到16MB(默认为1MB)。解释结果没有改变。

0 个答案:

没有答案