加快MySQL查询速度

时间:2014-05-06 07:50:50

标签: php mysql sql database-performance

我有这个问题:

SELECT
    FIELD1, FIELD2, FIELD3, FIELD4, FIELD5
FROM
    MYTABLE
WHERE
    FIELD1 = .... AND
    FIELD2 = .... AND
    FIELD3 = ....
GROUP BY
    FIELD4
;

请注意,我唯一更改的是字段和表的名称。我的查询在SELECT语句中有5个字段,在FROM部分中有1个表。 WHEREGROUP BY部分看起来也完全相同:3个等于条件的字段。

字段FIELD1FIELD2FIELD3都是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邮政编码。我希望这说清楚。

4 个答案:

答案 0 :(得分:1)

问题似乎与您的搜索方法仅仅包含了您的值,例如field1 =' value'因为这些是varchar而你正在使用引号。通过此,您的查询将使用索引并获得性能。

注意:没有必要使用索引,因为mysql自己做。

答案 1 :(得分:1)

现在提供的信息

  1. 该表包含街道及其邮政编码,区域,社区和城镇。
  2. 您正在查找邮政编码并且对街道不感兴趣(因此您不会在我的例子中选择FIELD5,因为我现在明白了。)
  3. 您无法更改表格设计,但可以添加索引。
  4. 你应该在TOWN + NEIGHBORHOOD + ZONE + PC上有一个索引。这包含您需要的所有信息,并指向所有相关的街道。 dbms应该足够聪明,注意到不需要表访问,因为索引中存在所需的所有数据。这应该可以显着加快您的查询速度。

答案 2 :(得分:0)

  1. 您提到您使用索引,请确保索引包含您在选择
  2. 中提及的所有字段
  3. 它可能只返回30行,但由于

    ,它必须经历更多行

    GROUP BY     FIELD1

  4. 因此您可能希望通过添加“LIMIT XX”,“SELECT DISTINCT FIELD 1”等来“收紧”您的查询

答案 3 :(得分:0)

我建议您看一下实施分区策略。对于大桌子来说,这是显着提高性能的唯一方法。

请在此处阅读:https://dev.mysql.com/doc/refman/5.1/en/partitioning.html