我在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;
为什么查询没有使用密钥有什么具体原因吗?
答案 0 :(得分:1)
您正在从表格中选择所有行。这就是需要扫描整个表(所有行)的原因。
仅在缩小搜索范围(使用where)时才使用密钥(或索引)。在这种情况下,使用索引来预先选择您想要拥有的行,而不必为给定的条件实际扫描整个表。
如果您不需要一次访问所有行,请尝试使用LIMIT限制返回的行。
SELECT * FROM tablename LIMIT 100;
如果您想要接下来的100行,请使用
SELECT * FROM tablename LIMIT 100,100;
等等。
除了这种方法(称为“分页”)之外,你没有太多办法加速这个查询(除了获得更快的机器,更多的RAM,更快的磁盘,更好的网络,如果访问DMBS远程)。
如果您需要进行一些处理,请考虑将逻辑(例如过滤)移动到DBMS。这可以使用查询的WHERE
部分来实现。
答案 1 :(得分:0)
为什么在没有过滤器时才使用密钥,也没有订单? - 在这个单表查询中,没有方法,表扫描的速度至少不会那么快。
为了解决您的性能问题,也许您有客户端处理可以通过服务器传递(毕竟,您不是真的一次向最终用户显示85,151行,是吗?) - 或者更快磁盘...