0

この質問は、クエリで 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);
4

1 に答える 1

1

サブクエリの結果との結合にインデックスを使用することを MySQL に強制することはほとんどできませんが、カバレッジ インデックス (参照する行をフェッチしないように十分なデータを持つインデックス) を使用して、グループ化を高速化することができます。

複合インデックス (u_id、a_id、加重) を追加してみてください

また、おそらく MySQL にインデックスを使用するためのヒントを与える必要があります。

SELECT u_id, SUM(counts.s_count * tablename.weighted) AS total
FROM tablename USE INDEX(Index_3)
LEFT JOIN (SELECT a_id, s_count FROM tablename WHERE u_id = 1) counts
  ON tablename.a_id = counts.a_id
GROUP BY u_id ORDER BY total DESC LIMIT 0,100;
于 2011-12-18T11:36:16.047 に答える