mysql慢日志: simple select query takes 26 seconds

标签 mysql database mysql-slow-query-log

我有一个使用 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/

相关文章:

mysql - 长时间运行的查询问题

java - 如何在Spring MVC mysql DAO连接中使用try catch?

java - 多个表的 JPA 外键

Mysql IN 运算符需要很长时间才能执行

database - 从汇总的Weblogs数据中检索信息,该怎么做?

sql - 如何修改此 SQL 连接以包含所有列?

mysql - 如何测试查询的实际执行时间?

php - 临时表和foreach

mysql - MariaDB、Django 和 127.0.0.1

mysql - 通过 VPN 连接到新的 Google Cloud SQL (MySQL) 第二代