【发布时间】:2017-10-02 21:47:28
【问题描述】:
我正忙于优化和理解 MySQL 中的按功能分组。从我从戈登那里学到的关于 SO 的答案:
选择中的所有列都应该是 group by 中的列或 使用聚合函数(sum()、avg() 等)。
我要查表和查询
表格
+-----------------+-----------+------------+-------------+
|Id (primary key) | ip(index) | lastattack | create_date |
+-----------------+-----------+------------+-------------+
查询
SELECT ip,
lastattack
FROM blacklist
WHERE ip = 'xxx.xxx.xxx.xxx'
GROUP BY ip
当我执行上述查询时,我从 EXPLAIN
收到以下信息+----+-------------+-------+------+---------------+-----+---------+-----+------+----------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------+---------------+-----+---------+-----+------+----------+-------+
| 1 | SIMPLE | ipall | ref | idx | idx | 257 |const| 2 | 100.00 | Using index condition |
+----+-------------+-------+------+---------------+-----+---------+-----+------+----------+-------+
当我像 Gordon 告诉我的那样执行查询时,我会额外收到以下内容
SELECT ip,
lastattack
FROM blacklist
WHERE ip = 'xxx.xxx.xxx.xxx'
GROUP BY ip, lastattack
使用索引条件;使用哪里;使用临时的;使用文件排序
人们告诉我要避免临时或文件排序。
【问题讨论】:
-
您遇到问题的重写查询是什么?
-
@EdmCoff 在帖子中添加了查询忘记了
-
有什么问题?
-
如果我必须将选定的列放在组中,为什么 mysql 解释给我使用临时和文件排序。从答案中我读到了它的说法,以避免在您的查询中临时解释
标签: mysql database indexing database-design