나는 내 머리를 감쌀 수없는 매우 오래된 쿼리를 최적화하려고합니다. 제가 보관하고자하는 결과는 다른 고객이 관심을 보였던 방문자, 즉 방문자가보고있는 제품과 함께 구입 한 다른 것을 웹 상점에서 추천하고 싶다는 것입니다.고객이 나열된 제품과 함께 구입 한 제품에 대한 질문
서브 쿼리가 있지만, 은 매우입니다. 천천히, ~ 8000 000 행 ~ 15 초 걸립니다.
레이아웃은 사용자 바구니에있는 모든 제품을 wsBasket
테이블에 보관하고 basketid
(다른 테이블은 멤버와 연결됨)으로 구분합니다.
이 예에서는 사용자가 productid 427과 함께 구입했지만 productid 427 자체를 나열하지 않은 가장 인기있는 제품을 모두 나열하려고합니다.
SELECT productid, SUM(quantity) AS qty
FROM wsBasket
WHERE basketid IN
(SELECT basketid
FROM wsBasket
WHERE productid=427) AND productid!=427
GROUP by productid
ORDER BY qty
DESC LIMIT 0,4;
어떤 도움을 많이 받으실 수 있습니다! 그들은 코멘트 필드에 적합하지 않은, 여기에 귀하의 의견들에 대한 덕분에 내 대답입니다 :이 모든 적어도 누군가에게 어떤 의미가 있습니다 :
UPDATE 1 바란다.
위의 쿼리에서 EXPLAIN을 사용하여 나는 플로팅을 얻었습니다. 참고, 나는 테이블에 인덱스가 없다 (기본 키는 id
-field 제외). 나는 인덱스를 활용하고 쿼리를 수정하여 오른쪽 키에 인덱스를 넣고 싶다. 추가
+----+--------------------+----------+------+---------------+------+---------+------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+----------+------+---------------+------+---------+------+------+----------------------------------------------+
| 1 | PRIMARY | wsBasket | ALL | NULL | NULL | NULL | NULL | 2821 | Using where; Using temporary; Using filesort |
| 2 | DEPENDENT SUBQUERY | wsBasket | ALL | NULL | NULL | NULL | NULL | 2821 | Using where |
+----+--------------------+----------+------+---------------+------+---------+------+------+----------------------------------------------+
wsBasket 테이블에 어떤 인덱스가 있습니까? 쿼리에 EXPLAIN을 실행하면 무엇을 얻게됩니까? –
인덱스는 어떻게 생깁니 까? 그 사실을 알면 쿼리 수정을보다 쉽게 할 수 있습니다. 트릭을 수행 한 – MJB