现在,我研究索引到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-size
和tmp-table-size
增加到128MB(默认值为16MB)。(我对这些变量的理解不明确......)。解释结果没有改变。
我将innodb_sort_buffer_size
增加到16MB(默认为1MB)。解释结果没有改变。