2013-11-28 20 views
0

我在Windows 2008服务器中使用MySQL 5.1版本。当我执行以下查询时:选择*从<tablename>不使用任何密钥

SELECT * FROM tablename;

获取该表中的所有结果花费的时间太多。此查询也在慢速查询日志中列出,而此表具有主键以及更少的索引。 我执行下面的查询来检查执行计划:

explain extended select * from tablename;

我发现下面的信息:

id=1 
select_type=SIMPLE 
table=tablename 
possible_keys=null 
key=null 
key_len=null 
ref=null 
rows=85151 
Extra=blank 

我认为它应该查询默认情况下,至少使用主键。同样,我在下面执行查询,发现过滤列有值= 100.0

explain extended select * from tablenmae;

是否有关于为什么查询不使用任何键具体的原因?

+1

为什么要使用“钥匙”?你想从表格中得到所有*,所以没有办法使用索引(我认为你的意思是“键”)会加速任何事情。 –

回答

0

为什么在没有过滤器的情况下使用密钥? - 在这种单表查询中,表扫描的速度至少不会那么快。

为了解决您的性能问题,可能您的客户端处理可能会传递给服务器(毕竟,您并不真正向最终用户显示85,151行,是吗?) - 或者获取更快的磁盘...

+0

不知道为什么这会吸引匿名downvote? –

1

您正在选择表中的所有行。这就是为什么需要扫描整个表格(所有行)的原因。

仅当缩小搜索范围(使用where)时才会使用密钥(或索引)。在这种情况下,使用索引来预先选择您想要的行,而不必实际扫描整个表中的给定条件。

如果您不需要一次访问所有行,请尝试使用LIMIT限制返回的行。

SELECT * FROM tablename LIMIT 100; 

如果你想在未来100行,请使用

SELECT * FROM tablename LIMIT 100,100; 

等。

除了这种方法(称为“分页”),你可以做很多事情来加快这个查询(除了获得更快的机器,更多的RAM,更快的磁盘,更好的网络,如果DMBS是远程访问)。

如果您需要进行一些处理,请考虑将逻辑(例如过滤)移动到DBMS。这可以使用查询的WHERE部分来实现。

+0

如果我添加列名代替*,它有多大帮助? – ursitesion

+0

没有,如果你把所有的列名,我害怕。 如果你把一些(不是全部)列名在技术上,你会得到最小的改进,但只是因为DBMS必须通过连接移动更少的数据。但是这种效应更多的是理论性质。 它遍历所有的表格,这里是最贵的。 –