更快地进行简单的SQL查询

时间:2014-07-21 10:57:09

标签: mysql sql

我发现同一个查询一次又一次地记录在我的慢速日志中,但我真的不知道如何让它更快。我相信我做了大部分优化。查询如下:

SELECT merk_id FROM profile_merk WHERE profile_id = '51485e0d9ce6d'

profile_id当然随每个查询而变化。该表有大约40万行和2列。一列是merk_id,另一列是profile_id。我在桌子上有以下索引:

Tbl | Non_unique | Key_name | Seq_in_index | Column_name | Collation| Cardinality | Sub_part    
profile_merk |  0 | PRIMARY |   1 | merk_id |   A | 4125 |  NULL |  NULL |      BTREE       
profile_merk |  0 | PRIMARY |   2 |     profile_id |    A |     39101247 |  NULL |  NULL |      BTREE       
profile_merk |  1 | profile_id |    1 |     profile_id |    A|  131212 |    NULL |  NULL |      BTREE       
profile_merk |  1 | merk_id |   1 |     merk_id |   A |     4125 |  NULL |  NULL |      BTREE 

查询的解释声明给出了以下内容:

id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra    
1 | SIMPLE | profile_merk | ref | profile_id | profile_id | 62 | const | 1688 | Using where

我还可以做些什么来优化性能?我意识到这是一个悬而未决的问题,但任何帮助都会非常感激!

1 个答案:

答案 0 :(得分:3)

对于这个简单的查询:

SELECT merk_id
FROM profile_merk
WHERE profile_id = '51485e0d9ce6d';

最佳表现是使用复合键:

create index idx_profilemark_profileid_merkid on profile_mark(profile_id, merk_id)

主键的问题是这两列不符合此查询所需的顺序。 profile_mark(profile_id, merk_id)profile_mark(merk_id, profile_id)上的索引之间存在很大差异。本质上,索引将从左到右使用where子句获得第一次使用索引列的机会。