좋아, 나는 단지 최적화 할 수없는 쿼리가 있습니다. 아마 MySQL에서 너무 많이하고 PHP에 더 많이 위임해야합니다. 쿼리는 약 1 분 정도 소요되지만 실제로는 쿼리가 훨씬 빠릅니다. 아래는 내가 성취하고자하는 것에 대한 아이디어를 줄 수있는 가설적인 구조입니다.쿼리 성능 문제. 이것을 최적화 할 수 있습니까?
현재 사용자가 소유 한 book_id의 목록을 쉼표로 구분 된 형식으로 포함하고있는 PHP 변수 $ bookList가 쿼리에 제공됩니다.
이 예제의 경우 사용자가 자신의 라이브러리 ($ bookList)에 할당 된 70 개의 book_id가 있고 자신의 라이브러리와 가장 많은 도서를 공유하는 상점을 찾고 싶다고 가정합니다. 각 상점에는 70 권의 책이 있지만 20 만 개 이상의 상점이 있습니다. 공통점이 50 % 미만인 상점은 걸러집니다.
표 1 : store_books
store_id: mediumint
book_id: smallint
index: store_id
index: book_id
표 3] :
id: mediumint
book_id: smallint
표 2 my_books 저장
id: mediumint
name: varchar(50)
primary: id
쿼리 : 사전에
SELECT count(s.book_id) AS commonBooks, s.id
FROM store_books AS sb
INNER JOIN stores AS s ON s.id = sb.id
WHERE sb.book_id IN ($bookList)
GROUP BY sb.store_id
HAVING commonBooks > 35
ORDER BY commonBooks
감사합니다!
내부 조인의 sb.id가 sb.store_id가되는 것을 의미합니까? –
테이블'store_books'에 복합 인덱스가 필요하다고 생각합니다. '(store_id, book_id)' –
또한'count (s.book_id)'를'count (*)'로 대체해야합니다. –