この質問は、クエリで Explain I を実行したときにここに投稿された問題の続きです
SELECT u_id, SUM(counts.s_count * tablename.weighted) AS total FROM tablename LEFT JOIN (SELECT a_id, s_count FROM テーブル名 WHERE u_id = 1) カウント ON tablename.a_id = counts.a_id GROUP BY u_id ORDER BY total DESC LIMIT 0,100;
私は応答を得る
+----+-------------+--------------------+-------+- --------------+-----------+---------+------+------ --+----------------------------------------------+ | | ID | select_type | テーブル | タイプ | 可能な_キー | キー | key_len | 参照 | 行 | 行 エクストラ | +----+-------------+--------------------+-------+- --------------+-----------+---------+------+------ --+----------------------------------------------+ | | 1 | プライマリ | テーブル名 | インデックス | ヌル | a_id | 3 | ヌル | 7222350| インデックスの使用; 一時的な使用; ファイルソートの使用 | | | 1 | プライマリ | [派生2] | すべて | ヌル | ヌル | ヌル | ヌル | 37 | | | | | 2 | 派生 | テーブル名 | 参照 | プライマリ | プライマリ | 4 | | | 37 | インデックスの使用 | +----+-------------+--------------------+-------+- --------------+-----------+---------+------+------ -------------------------------------------------+
テーブルはで作成されます
CREATE TABLE IF NOT EXISTS テーブル名 ( u_id INT NOT NULL, a_id MEDIUMINT NOT NULL, s_count MEDIUMINT NOT NULL, 重み付き FLOAT NOT NULL、 インデックス (a_id)、 主キー (u_id,a_id) )エンジン=INNODB;
インデックスまたはクエリを変更して、キーをより効果的に利用するにはどうすればよいですか? データベースが 700 万行に達すると、クエリに約 30 秒かかります
を使用してダミーデータで作成できる編集
CREATE TABLE IF NOT EXISTS tablename ( u_id INT NOT NULL, a_id MEDIUMINT NOT NULL,s_count MEDIUMINT NOT NULL, weighted FLOAT NOT NULL,INDEX (a_id), PRIMARY KEY (u_id,a_id))ENGINE=INNODB; INSERT INTO tablename (u_id,a_id,s_count,weighted ) VALUES (1,1,17,0.0521472392638),(1,2,80,0.245398773006),(1,3,2,0.00613496932515),(1,4,1, 0.00306748466258),(1,5,1,0.00306748466258),(1,6,20,0.0613496932515),(1,7,3,0.00920245398773),(1,8,100,0.306748466258),(1,8,100),(25,8,606) 1,10,2,0.00613496932515),(2,1,1,0.00327868852459),(2,2,1,0.00327868852459),(2,3,100,0.327868852459),(2,4,200,0.6557377042,5,(), 1,0.00327868852459),(2,6,1,0.00327868852459),(2,7,0,0.0),(2,8,0,0.0),(2,9,0,0.0),(2,10, 1,0.00327868852459),(3,1,15,0.172413793103),(3,2,40,0.459770114943),(3,3,0,0.0),(3,4,0,0.0),(3,5, 0,0.0),(3,6,10,0.114942528736),(3,7,1,0.0114942528736),(3,8,20,0.229885057471),(3,9,0,0.0),(3,10, 1,0.0114942528736);