2

我有一个相当大的 SQL 查询(连接 3 个巨大的表)并且运行速度太慢。我正在尝试对其进行优化并进行奇怪的观察:

SELECT board FROM ((foo JOIN bar ON id_bar=bar.id) JOIN baz ON id_baz=baz.id) ORDER BY foo.id DESC LIMIT 1;

+-------+
| board |
+-------+
|     3 |
+-------+
1 row in set (3,99 sec)

board是一个int字段,上面有一个索引。好的。但是,现在,如果我选择一个索引varchar(6)字段,我得到的结果很慢:

SELECT type FROM ((foo JOIN bar ON id_bar=bar.id) JOIN baz ON id_baz=baz.id) ORDER BY foo.id DESC LIMIT 1;

+--------+
|  type  |
+--------+
| normal |
+--------+
1 row in set (17,76 sec)

这怎么可能?我认为查询中的慢部分在JOIN// ORDER/部分中GROUPWHERE而不是在结果的实际显示中。如何增强该查询?

4

1 回答 1

1

INT 长度为 4 个字节,VARCHAR(6) 可以长达 12 个字节(在多字节编码中)。这增加了索引的大小,从而增加了时间。

您可以考虑的一件事是将type列更改为另一种数据类型,即ENUM. ENUM字段使您可以有效地存储一组有限的可能值中的值(并且type列通常具有有限数量的可能值)。因为它使用更少的空间来存储数据,所以这些列上的索引也很小,因此速度更快。

于 2013-04-04T09:23:32.840 回答