有没有办法加速没有WHERE子句的查询?

时间:2010-07-14 22:40:39

标签: php mysql

我有大约100万行所以它的速度很慢。这是查询:

$sql = "SELECT `plays`,`year`,`month` FROM `game`";

我查了索引,但只有在'where'条款时才对我有意义。

有什么想法吗?

5 个答案:

答案 0 :(得分:3)

即使没有WHERE子句,索引也会有所不同,具体取决于您在表中的其他列。如果您选择的3列仅占表格内容的一小部分,则它们的覆盖索引可以减少需要扫描的页面数量。

通过添加WHERE子句或在数据库中进行处理,如果可能的话,不会移动尽可能多的数据。

答案 1 :(得分:2)

如果您不需要所有100万条记录,则可以提取n条记录:

$sql = "SELECT `plays`,`year`,`month` FROM `game` LIMIT 0, 1000";

第一个数字是偏移量(从哪里开始),第二个数字是行数。如果只提取选定数量的记录,您可能也想使用ORDER BY

答案 2 :(得分:1)

如果没有从内存缓存而不是db中获取数据,您将无法更快地进行查询。获取一百万行需要时间。如果您需要更快的速度,请确定您是否可以让DB执行某些工作,例如sum / group togehter things。

如果您没有使用所有行,则应该使用SQL中的LIMIT子句来仅获取这些百万行中的某个范围。

答案 3 :(得分:1)

如果您确实需要所有100万行来构建输出,那么您可以从数据库端做很多事情。

但是,您可能希望在应用程序端缓存结果,以便下次要提供相同的输出时,可以从缓存中返回已处理的输出。

答案 4 :(得分:1)

现实的答案是否定的。您的查询没有任何限制(即WHERE子句或LIMIT),因此您几乎可以保证每次都进行全表扫描。

减少扫描时间的唯一方法是减少数据(或者更快的磁盘)。您可以重新处理数据以使您的行更有效(在某些情况下,CHARS而不是VARCHARS,TINYINTS而不是INTS等),但是你真的不会看到很多速度差异一种微观优化。索引就在它的位置。

一般情况下,如果你遇到这样的情况,你不能使用索引,但是你有大型表,那么它就是需要重新工作的业务逻辑。你总是需要选择每条记录吗?你能做一些应用程序端缓存吗?您是否可以将数据分段为较小的集合或表格,可能按日或月组织?等