我有一个简单的表,它正在使用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,我会解决这个问题吗?
答案 0 :(得分:0)
如果强制它使用主键而不是进行全表扫描,可能会更快。如果您使用的是innodb,请尝试SELECT tag FROM tags USE INDEX(PRIMARY)
。或者,您也可以只在查询中添加WHERE tag_id > 0
。根据我的理解,如果查询中没有使用索引,innodb将执行范围扫描,这比索引扫描更昂贵。如果强制它使用索引,它将扫描索引而不是查找表的所有行,这可能会更快。可能还有更多在这里发挥作用,我不像以前那样精通mysql / innodb内部。
如果你不是,那么我猜测瓶颈在其他地方(可能是硬盘I / O)。在这种情况下,升级到不同的服务器并不是唯一的解决方案(尽管它可以解决问题)。如果这个表没有不断变化(即每隔几秒更改一次),那么使用某种内存缓存机制可能是值得的,例如memchached(还有其他内存缓存机制)。如果遇到I / O问题,使用内存缓存来处理此表和/或其他数据可能值得研究。您可能会发现主机具有更快的磁盘I / O,但无论您如何对其进行分片,对磁盘的读取和写入都很昂贵。提出某种缓存程序可能是值得的。