我有这个问题:
SELECT
FIELD1, FIELD2, FIELD3, FIELD4, FIELD5
FROM
MYTABLE
WHERE
FIELD1 = .... AND
FIELD2 = .... AND
FIELD3 = ....
GROUP BY
FIELD4
;
请注意,我唯一更改的是字段和表的名称。我的查询在SELECT
语句中有5个字段,在FROM
部分中有1个表。 WHERE
和GROUP BY
部分看起来也完全相同:3个等于条件的字段。
字段FIELD1
,FIELD2
和FIELD3
都是PK和索引。
问题:查询花了将近8秒钟完成(并返回约30行)。
问题:有什么方法可以加快查询速度,这与服务器无关(增加缓存,在更强大的服务器上运行数据库等等)? / p>
修改
字段声明:
FIELD1: VARCHAR(2)
FIELD2: VARCHAR(3)
FIELD3: VARCHAR(7)
FIELD4: VARCHAR(4)
FIELD5: VARCHAR(5)
编辑2:
SHOW INDEX
的输出:http://ibin.co/1LSSwvr0CVpX
编辑3:
EXPLAIN
的输出:
select_type: SIMPLE
table: MYTABLE
type: ALL
possible_keys:
key:
key_len:
ref:
rows: 2081601
Extra: Using where; Using temporary; Using filesort
编辑4:
示例数据:
Chicago = 1 (neighborhoods 001, 002, 003) (neighborhood zone 1, 2, 3) (postal code 10, 20, 30)
NY = 2 (neighborhoods 001, 002, 003) (neighborhood zone 1, 2, 3)(postal code 10, 20, 30)
Los Angeles = 3 (neighborhoods 001, 002, 003) (neighborhood zone 1, 2, 3)(postal code 10, 20, 30)
数据
1 001 1 10
1 002 1 10
1 002 1 20
1 002 2 20
1 003 1 30
2 001 1 10
2 002 1 20
3 001 1 10
3 002 1 10
3 002 2 20
我的所作所为:
搜索所有与TOWN == 1(芝加哥)和邻居== 001 AND ZONE == 1匹配的邮政编码 然后GROUP BY邮政编码。我希望这说清楚。
答案 0 :(得分:1)
问题似乎与您的搜索方法仅仅包含了您的值,例如field1 =' value'因为这些是varchar而你正在使用引号。通过此,您的查询将使用索引并获得性能。
注意:没有必要使用索引,因为mysql自己做。
答案 1 :(得分:1)
现在提供的信息
你应该在TOWN + NEIGHBORHOOD + ZONE + PC上有一个索引。这包含您需要的所有信息,并指向所有相关的街道。 dbms应该足够聪明,注意到不需要表访问,因为索引中存在所需的所有数据。这应该可以显着加快您的查询速度。
答案 2 :(得分:0)
它可能只返回30行,但由于
,它必须经历更多行GROUP BY FIELD1
因此您可能希望通过添加“LIMIT XX”,“SELECT DISTINCT FIELD 1”等来“收紧”您的查询
答案 3 :(得分:0)
我建议您看一下实施分区策略。对于大桌子来说,这是显着提高性能的唯一方法。
请在此处阅读:https://dev.mysql.com/doc/refman/5.1/en/partitioning.html