Mysql 慢日志:简单的 select 查询需要 26 秒
Mysql slow log: simple select query takes 26 seconds
我有一个简单的 table,它使用的是 InnoDB:
tag_id int(20), primary
tag varchar(50)
table 中只有 106 个标签,有时这个简单的 select 查询需要 10 秒、16 秒、30 秒或更多:
# Query_time: 26 Lock_time: 0 Rows_sent: 106 Rows_examined: 106
use database;
SELECT `tag`
FROM (`tags`);
我的问题:有没有什么方法可以优化此查询(这样就不会花费 26 秒来完成),或者这是 Mysql 服务器过载的明显迹象?如果我从共享主机升级到 VPS,我会解决这个问题吗?
如果您强制它使用主键而不是进行完整 table 扫描,它可能会更快。如果您使用的是 innodb,请尝试执行 SELECT tag FROM tags USE INDEX(PRIMARY)
。或者,您也可以将 WHERE tag_id > 0
添加到您的查询中。根据我的理解,如果查询中没有使用索引,innodb 将进行范围扫描,这与索引扫描相比成本更高。如果强制它使用索引,它将扫描索引而不是查找 table 的所有行,这可能会更快。不过这里可能还有更多的东西在起作用,我不像以前那样精通 mysql/innodb 内部结构。
如果不是,那么我猜瓶颈在其他地方(可能是 HDD I/O)。在这种情况下,升级到不同的服务器并不是唯一的解决方案(尽管它可能会解决问题)。如果这个 table 不是经常变化的(即每两秒变化一次),那么使用某种内存缓存机制可能是值得的,比如 memchached(还有其他的)。如果您 运行 陷入 I/O 问题,使用内存缓存来存储来自此 table and/or 的数据,其他人可能值得研究。你可能会找到一个磁盘速度更快的主机 I/O,但无论你如何切片,磁盘的读写都是昂贵的。想出某种缓存程序可能是值得的。
我有一个简单的 table,它使用的是 InnoDB:
tag_id int(20), primary
tag varchar(50)
table 中只有 106 个标签,有时这个简单的 select 查询需要 10 秒、16 秒、30 秒或更多:
# Query_time: 26 Lock_time: 0 Rows_sent: 106 Rows_examined: 106
use database;
SELECT `tag`
FROM (`tags`);
我的问题:有没有什么方法可以优化此查询(这样就不会花费 26 秒来完成),或者这是 Mysql 服务器过载的明显迹象?如果我从共享主机升级到 VPS,我会解决这个问题吗?
如果您强制它使用主键而不是进行完整 table 扫描,它可能会更快。如果您使用的是 innodb,请尝试执行 SELECT tag FROM tags USE INDEX(PRIMARY)
。或者,您也可以将 WHERE tag_id > 0
添加到您的查询中。根据我的理解,如果查询中没有使用索引,innodb 将进行范围扫描,这与索引扫描相比成本更高。如果强制它使用索引,它将扫描索引而不是查找 table 的所有行,这可能会更快。不过这里可能还有更多的东西在起作用,我不像以前那样精通 mysql/innodb 内部结构。
如果不是,那么我猜瓶颈在其他地方(可能是 HDD I/O)。在这种情况下,升级到不同的服务器并不是唯一的解决方案(尽管它可能会解决问题)。如果这个 table 不是经常变化的(即每两秒变化一次),那么使用某种内存缓存机制可能是值得的,比如 memchached(还有其他的)。如果您 运行 陷入 I/O 问题,使用内存缓存来存储来自此 table and/or 的数据,其他人可能值得研究。你可能会找到一个磁盘速度更快的主机 I/O,但无论你如何切片,磁盘的读写都是昂贵的。想出某种缓存程序可能是值得的。