1

我有一个使用 InnoDB 的简单表:

tag_id int(20), primary
tag varchar(50)

表中只有 106 个标签,有时这个简单的选择查询需要 10s、16s、30s 或更多:

# Query_time: 26  Lock_time: 0  Rows_sent: 106  Rows_examined: 106
use database;
SELECT `tag`
FROM (`tags`);

我的问题:有没有办法优化这个查询(所以它不会需要 26 秒才能完成)或者这是 MySQL 服务器过载的明显迹象?如果我从共享主机升级到 VPS,我会解决这个问题吗?

4

1 回答 1

0

如果您强制它使用主键而不是进行全表扫描,它可能会更快。SELECT tag FROM tags USE INDEX(PRIMARY)如果您使用的是 innodb,请尝试这样做。或者,您也可以只添加WHERE tag_id > 0到您的查询中。据我了解,如果查询中没有使用索引,innodb 会进行范围扫描,与索引扫描相比,它的成本更高。如果你强制它使用索引,它会扫描索引来查找表的所有行,这可能会更快。不过,这里可能还有更多内容,我不像以前那样精通 mysql/innodb 内部结构。

如果不是,那么我猜瓶颈在其他地方(可能是 HDD I/O)。在这种情况下,升级到不同的服务器并不是唯一的解决方案(尽管它可能会解决问题)。如果该表不是不断变化的(即每隔几秒更改一次),则可能值得使用某种内存缓存机制,例如 memchached(还有其他一些机制)。如果您遇到 I/O 问题,使用内存缓存来存储该表和/或其他表中的数据可能值得研究。您可能会发现一个具有更快磁盘 I/O 的主机,但无论您如何对其进行切片,对磁盘的读取和写入都是昂贵的。提出某种缓存过程可能是值得的。

于 2015-01-25T03:09:59.347 回答