我发现同一个查询一次又一次地记录在我的慢速日志中,但我真的不知道如何让它更快。我相信我做了大部分优化。查询如下:
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
我还可以做些什么来优化性能?我意识到这是一个悬而未决的问题,但任何帮助都会非常感激!
答案 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
子句获得第一次使用索引列的机会。