나는 MySQL은 5.7.22 데이터베이스에 두 개의 테이블을 가지고 posts
와 reasons
. 각 게시물 행에는 여러 이유 행이 있고 그에 속합니다. 각 이유에는 관련 가중치가 있으므로 각 게시물에는 전체 집계 가중치가 있습니다.
10 점씩 증가 할 때마다 (즉, 0, 10, 20, 30 등) 총 가중치가 해당 증분 이하인 게시물 수를 얻고 싶습니다. 그 결과가 다음과 같이 보일 것으로 기대합니다.
weight | post_count
--------+------------
0 | 0
10 | 5
20 | 12
30 | 18
... | ...
280 | 20918
290 | 21102
... | ...
1250 | 118005
1260 | 118039
1270 | 118040
총 가중치는 거의 정규적으로 분포되어 있으며 매우 낮은 값과 매우 높은 값 (현재 최대 1277)이지만 대부분 중간에 있습니다. 에 120,000 개 미만의 행이 posts
있고 약 120 개의 행 이 reasons
있습니다. 각 게시물에는 평균 5-6 개의 이유가 있습니다.
표의 관련 부분은 다음과 같습니다.
CREATE TABLE `posts` (
id BIGINT PRIMARY KEY
);
CREATE TABLE `reasons` (
id BIGINT PRIMARY KEY,
weight INT(11) NOT NULL
);
CREATE TABLE `posts_reasons` (
post_id BIGINT NOT NULL,
reason_id BIGINT NOT NULL,
CONSTRAINT fk_posts_reasons_posts (post_id) REFERENCES posts(id),
CONSTRAINT fk_posts_reasons_reasons (reason_id) REFERENCES reasons(id)
);
지금까지 게시물 ID와 총 가중치를 뷰에 드롭 한 다음 해당 뷰를 자체에 결합하여 집계 수를 얻었습니다.
CREATE VIEW `post_weights` AS (
SELECT
posts.id,
SUM(reasons.weight) AS reason_weight
FROM posts
INNER JOIN posts_reasons ON posts.id = posts_reasons.post_id
INNER JOIN reasons ON posts_reasons.reason_id = reasons.id
GROUP BY posts.id
);
SELECT
FLOOR(p1.reason_weight / 10) AS weight,
COUNT(DISTINCT p2.id) AS cumulative
FROM post_weights AS p1
INNER JOIN post_weights AS p2 ON FLOOR(p2.reason_weight / 10) <= FLOOR(p1.reason_weight / 10)
GROUP BY FLOOR(p1.reason_weight / 10)
ORDER BY FLOOR(p1.reason_weight / 10) ASC;
그러나 그것은 사용할 수 없을 정도로 느리다. 나는 종료하지 않고 15 분 동안 작동시켰다. 나는 생산에서 할 수 없었다.
더 효율적인 방법이 있습니까?
전체 데이터 세트 테스트에 관심이있는 경우 여기 에서 다운로드 할 수 있습니다 . 파일 크기는 약 60MB이며 약 250MB로 확장됩니다. 또는 GitHub 요지에 12,000 개의 행이 있습니다 .
w.weight
-맞습니까? lte 의 총 가중치 (관련 이유 행의 가중치 합계)로 게시물을 계산하려고합니다w.weight
.