rating
30 万行弱のテーブルと SQL クエリがあります。
SELECT rt1.product_id as id1, rt2.product_id as id2, sum(1), sum(rt1.rate-rt2.rate) as sum
FROM rating as rt1
JOIN rating as rt2 ON rt1.user_id = rt2.user_id AND rt1.product_id != rt2.product_id
group by rt1.product_id, rt2.product_id
LIMIT 1
問題は..本当に遅いです。で実行するのに 36 秒かかりますがlimit 1
、無制限に実行する必要があります。私が理解したように、一部が原因で速度が低下しましたGROUP BY
。テーブルrt1またはrt2に関係なく、1列でグループ化している間は正常に機能します。インデックスも試してみました.user_id、product_id、rate、および(user_id、product_id)のインデックスをすでに作成しています。
EXPLAIN
私にもあまり教えてくれません。
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE rt1 ALL PRIMARY,user_id,user_product NULL NULL NULL 289700 Using temporary; Using filesort
1 SIMPLE rt2 ref PRIMARY,user_id,user_product user_id 4 mgrshop.rt1.user_id 30 Using where
これを一度だけ実行してデータを生成する必要があるため、最適な時間を達成することは重要ではありませんが、合理的です。
何か案は?
編集。
完全なテーブル スキーマ
CREATE TABLE IF NOT EXISTS `rating` (
`user_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
`rate` int(11) NOT NULL,
PRIMARY KEY (`user_id`,`product_id`),
KEY `user_id` (`user_id`),
KEY `product_id` (`product_id`),
KEY `user_product` (`user_id`,`product_id`),
KEY `rate` (`rate`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;