查询在tmp表中长时间粘贴复制

时间:2012-06-25 11:45:06

标签: mysql phpmyadmin

提前感谢您抽出宝贵时间阅读我的问题。我正在使用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 T1col1 of T2上创建了索引。但是当我运行SQL命令时,它会停留在复制到tmp表阶段的消息上(我在整个周末离开它并且它仍然在同一点)

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

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

欢迎所有建议

非常感谢你的帮助

2 个答案:

答案 0 :(得分:1)

ORDER BY RAND()技巧永远不应该用于如此大的表格大小。 ORDER BY RAND()的工作原理是为JOINed结果集中的每一行(在您的情况下可能是数亿行)分配一个随机值,实际创建所有这些行,在磁盘上对它们进行排序,如果它已准备就绪,那么只能它为您选择并返回前100000行。

解决方案并不明显,但你可以找到一些技巧来解决你的问题,比如 How can i optimize MySQL's ORDER BY RAND() function?

答案 1 :(得分:0)

  1. 使用EXPLAIN EXTENDED SELECT ...查看查询涉及的内容(要处理的估计行数,正在使用的索引等)。

  2. EXPLAIN查询还会显示“1个警告”,请参阅SHOW WARNINGS - 这将显示查询优化器之后查询的确切结果

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

  4. 发布你的硬件配置(cpu - speed?,cores?,ram - total?free?)