저는 파이썬과 MySQL로 비디오 추천 사이트 (뮤직 비디오 용 판도라)를 만들고 있습니다. 내 데이터베이스에 세 개의 테이블이 있습니다.이 MySQL 쿼리의 속도를 높이려면 어떻게해야합니까?
비디오 - 비디오 테이블. 데이터가 변경되지 않습니다. 열은 다음과 같습니다
CREATE TABLE `video` (
id int(11) NOT NULL AUTO_INCREMENT,
website_id smallint(3) unsigned DEFAULT '0',
rating_global varchar(128) DEFAULT '0',
title varchar(256) DEFAULT NULL,
thumb_url text,
PRIMARY KEY (`id`),
KEY `websites` (`website_id`),
KEY `id` (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=49362 DEFAULT CHARSET=utf8
video_tag - 태그 각 비디오와 관련된 (속성)의 테이블. 변경되지 않습니다.을 user_rating
CREATE TABLE `video_tag` (
id int(7) NOT NULL AUTO_INCREMENT,
video_id mediumint(7) unsigned DEFAULT '0',
tag_id mediumint(7) unsigned DEFAULT '0',
PRIMARY KEY (`id`),
KEY `video_id` (`video_id`),
KEY `tag_id` (`tag_id`)
) ENGINE=InnoDB AUTO_INCREMENT=562456 DEFAULT CHARSET=utf8
- 사용자가 각각의 태그를 주신 좋은 또는 나쁜 평가의 테이블. 데이터가 항상 변경됩니다.
CREATE TABLE `user_rating` (
id int(11) NOT NULL AUTO_INCREMENT,
user_id smallint(3) unsigned DEFAULT '0',
tag_id int(5) unsigned DEFAULT '0',
tag_rating float(10,5) DEFAULT '0',
PRIMARY KEY (`id`),
KEY `video` (`tag_id`),
KEY `user_id` (`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=447 DEFAULT CHARSET=utf8
는 사용자의 기본 설정에 따라, 나는 각 보지 않은 비디오를 득점하고, 시도하고 그들이 가장 좋아하는 것을 예측하고자합니다. 이 동영상이 50,000에 대한 완료하는 데 약 2 초 정도 걸립니다 다음과 같은 대규모 쿼리 결과는 :
SELECT video_tag.video_id,
(sum(user_rating.tag_rating) * video.rating_global) as score
FROM video_tag
JOIN user_rating ON user_rating.tag_id = video_tag.tag_id
JOIN video ON video.id = video_tag.video_id
WHERE user_rating.user_id = 1 AND video.website_id = 2
AND rating_global > 0 AND video_id NOT IN (1,2,3) GROUP BY video_id
ORDER BY score DESC LIMIT 20
나는 필사적으로이보다 효율적으로 만들 필요, 그래서 난 그냥 어떤 최선의 방향에 대한 조언을 찾고 있어요 입니다. 일부 아이디어는 내가 생각했습니다 (세 개의 테이블을 조인 할 수있는 방법을 생각하지 않은 방법)
b)는 파이썬으로 그룹화 및 집계의 더 많은 오프로드
A) 재 작업 내 DB 테이블 구조 (확실하지 그
이C)이보다 효율적으로 만드는 당신이 추천 방법)
을 시도하고 속도 계산 시간 (이전 땜질은 .. 어떤 이익을 산출 아직하지 않은 메모리에 비 변경 테이블을 저장) 실제로 빠른 ?
감사합니다.
- 주석의 요청에 따라
, EXPLAIN SELECT ... 쇼 :id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE user_rating ref video,user_id user_id 3 const 88 Using where; Using temporary; Using filesort
1 SIMPLE video_tag ref video_id,tag_id tag_id 4 db.user_rating.tag_id 92 Using where
1 SIMPLE video eq_ref PRIMARY,websites,id PRIMARY 4 db.video_tag.video_id 1 Using where
테이블 구조를 둘러싸 지 않을 수도 있습니다. 커뮤니티에서 어떤 것을 기대 하시겠습니까? – ajreal
제안 해 주셔서 감사합니다. 나는 정보에 압도하고 싶지 않았지만 귀하의 의견에 따라 테이블 구조를 추가했습니다. – thegreatt
스키마에도 데이터 형식 + 인덱스 유형/열이 포함되므로 적절한 스키마를 포함해야합니다. – ajreal