我有一个使用 InnoDB 的简单表:
tag_id int(20), primary
tag varchar(50)
表中只有 106 个标签,有时这个简单的选择查询需要 10 秒、16 秒、30 秒或更多:
# Query_time: 26 Lock_time: 0 Rows_sent: 106 Rows_examined: 106
use database;
SELECT `tag`
FROM (`tags`);
我的问题:有没有什么方法可以优化这个查询(这样它就不会花 26 秒来完成),或者这是 Mysql 服务器过载的明显迹象?如果我从共享主机升级到 VPS,是否可以解决这个问题?
最佳答案
如果你强制它使用主键而不是进行全表扫描,它可能会更快。如果您使用的是 innodb,请尝试执行 SELECT tag FROM tags USE INDEX(PRIMARY)
。或者,您也可以将 WHERE tag_id > 0
添加到您的查询中。根据我的理解,如果查询中没有使用索引,innodb 将进行范围扫描,这与索引扫描相比成本更高。如果强制它使用索引,它会扫描索引而不是查找表的所有行,这可能会更快。不过这里可能还有更多的用处,我不像以前那样精通 mysql/innodb 内部结构。
如果您不是,那么我猜瓶颈在其他地方(可能是 HDD I/O)。在这种情况下,升级到不同的服务器并不是唯一的解决方案(尽管它可能会解决问题)。如果这个表不是经常变化的(即每几秒变化一次),那么使用某种内存缓存机制可能是值得的,比如 memchached(还有其他的)。如果您遇到 I/O 问题,使用内存缓存来存储来自该表和/或其他表的数据可能值得研究。您可能会发现一个具有更快磁盘 I/O 的主机,但无论您如何划分它,磁盘的读写操作都是昂贵的。提出某种缓存程序可能是值得的。
关于mysql慢日志: simple select query takes 26 seconds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28126745/