Closed. This question is off-topic。它目前不接受答案。
想改进这个问题吗?Update the question所以堆栈溢出的值小于aa>。
四年前关闭。
我们有一些这种类型的表,每个表大约有3000万到8000万行。
我们对在表上运行分析感兴趣,但是查询需要很长的时间(查询需要10分钟以上)才能执行。SQL专家能否发现任何可以应用于加快查询执行速度的明显优化?
URL包含有关sql架构的信息,
示例行
我们想在最底层执行的查询。
我们还在userid上添加了索引,但查询仍然需要很长时间。
on-topic
在mariadb上用innodb创建的表。服务器已将12G分配给缓冲池

最佳答案

为了一个简单的例子,我将从this SQLFiddle开始工作。
简化架构:

CREATE TABLE visits(
  user_id INTEGER NOT NULL,
  minute_id INTEGER NOT NULL,
  visit_id INTEGER NOT NULL
);

CREATE INDEX visits_user_id_idx ON visits(user_id);
CREATE INDEX visits_minute_id_idx ON visits(minute_id);
CREATE INDEX visits_visit_id_idx ON visits(visit_id);

您当前正在使用子查询,如下所示:
SELECT COUNT(v1.visit_id)
FROM visits v1
INNER JOIN (SELECT * FROM visits WHERE minute_id BETWEEN 100 AND 200) v2 ON v2.user_id = v1.user_id
WHERE v1.minute_id BETWEEN 600 AND 700;

您不需要带有临时表的内联子查询——这会导致数据库产生大量超出需要的数据,这会减慢速度。
在平面查询中可以实现相同的逻辑:
SELECT COUNT(v1.visit_id)
FROM visits v1
INNER JOIN visits v2 ON v2.user_id = v1.user_id
WHERE v2.minute_id BETWEEN 100 AND 200
AND v1.minute_id BETWEEN 600 AND 700;

FIDLE链接包括EXPLAIN结果,这表明DB引擎将有一个更容易处理的时间,这既因为保存了较少的临时数据,又因为所需的索引更简单。

关于mysql - 在具有3列的3600万行表上优化SQL内部联接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30538465/

10-09 22:35