select * from <tablename>不使用任何键</tablename>

时间:2013-11-28 13:32:30

标签: mysql

我在Windows 2008服务器中使用MySQL 5.1版本。当我执行以下查询时:

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;

为什么查询没有使用密钥有什么具体原因吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

SELECT * FROM tablename LIMIT 100;

如果您想要接下来的100行,请使用

SELECT * FROM tablename LIMIT 100,100;

等等。

除了这种方法(称为“分页”)之外,你没有太多办法加速这个查询(除了获得更快的机器,更多的RAM,更快的磁盘,更好的网络,如果访问DMBS远程)。

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

答案 1 :(得分:0)

为什么在没有过滤器时才使用密钥,也没有订单? - 在这个单表查询中,没有方法,表扫描的速度至少不会那么快。

为了解决您的性能问题,也许您有客户端处理可以通过服务器传递(毕竟,您不是真的一次向最终用户显示85,151行,是吗?) - 或者更快磁盘...