0

提前感谢您花时间阅读我的问题。我一起使用 MySQL 和 Python,我首先执行这个 SQL 命令

  SELECT T1.col1 AS t, T1.col4 AS d, T2.col3 AS e, T2.col4 AS d, T2.col7 AS p,
  T2.col13 AS de, 
  T2.col5 AS carrier, T2.col12 AS f, T2.col10 AS c
  FROM table AS T1
  JOIN table_c AS T2 ON T1.col1 = T2.col1
  ORDER BY RAND( )
  LIMIT 100000 ;

我正在处理的数据库非常大(T1 有 300 000 000 行,T2 有 300 000 行),感谢phpMyAdmin我创建了它们。我也在col1 of T1和上创建了索引col1 of T2。但是当我运行 SQL 命令时,它卡在复制到tmp表阶段消息上(我把它留了整个周末,它仍然在同一点)

我尝试修改参数 tmp_table_size 但它没有改变任何东西

我不知道在合理的时间内执行此命令的解决方案是什么

欢迎所有建议

非常感谢你的帮助

4

2 回答 2

1

ORDER BY RAND()绝不能将这个技巧用于如此大的表大小。ORDER BY RAND()通过为您的 JOINed 结果集中的每一行(在您的情况下可能是数亿行)中分配一个随机值来工作,实际创建所有这些行,在磁盘上对它们进行排序,如果它准备好了,只有这样它才能选择并返回为您提供前 100000 行。

解决方案并不明显,但您可以找到一些技术来解决您的问题,例如 如何优化 MySQL 的 ORDER BY RAND() 函数?

于 2012-06-25T12:05:55.623 回答
0
  1. 用于EXPLAIN EXTENDED SELECT ...查看查询涉及的内容(估计要处理多少行,正在使用哪些索引等)。

  2. EXPLAIN查询还将显示“1 个警告”,请参阅SHOW WARNINGS- 这将向您显示查询优化器后查询的外观。

  3. 发布您的表结构 ( SHOW CREATE TABLE ...)、两个表的表状态和相关配置(所有配置条目匹配max*, *buffer*, *size*)。

  4. 发布您的硬件配置(cpu - 速度?,核心?,ram - 总?免费?)

于 2012-06-25T12:02:47.620 回答