見つけるための最良の方法はそれを測定することです:
インデックスなし
インデックス付き
結論は次のとおりです。
- インデックスがない場合は、使用するクエリに違いはありません。
- 適切なインデックスがあれば、結合はより高速になります。
- 正しいインデックスを追加する効果は、正しいクエリを選択する効果よりも大きくなります。パフォーマンスが重要な場合は、正しいインデックスがあることを確認してください。
もちろん、結果はMySQLのバージョンと使用しているデータの分布によって異なる場合があります。
これが私がそれをテストした方法です:
- 1,000,000人の学生(ステータス1の25%)。
- 50,000コース。
- 10部門。
テストデータの作成に使用したSQLは次のとおりです。
CREATE TABLE students
(id INT PRIMARY KEY AUTO_INCREMENT,
status int NOT NULL,
classes_id int NOT NULL);
CREATE TABLE classes
(id INT PRIMARY KEY AUTO_INCREMENT,
departments_id INT NOT NULL);
CREATE TABLE numbers(id INT PRIMARY KEY AUTO_INCREMENT);
INSERT INTO numbers VALUES (),(),(),(),(),(),(),(),(),();
INSERT INTO numbers
SELECT NULL
FROM numbers AS n1
CROSS JOIN numbers AS n2
CROSS JOIN numbers AS n3
CROSS JOIN numbers AS n4
CROSS JOIN numbers AS n5
CROSS JOIN numbers AS n6;
INSERT INTO classes (departments_id)
SELECT id % 10 FROM numbers WHERE id <= 50000;
INSERT INTO students (status, classes_id)
SELECT id % 4 = 0, id % 50000 + 1 FROM numbers WHERE id <= 1000000;
SELECT COUNT(*) AS count
FROM students
WHERE status = 1
AND classes_id IN (SELECT id FROM classes WHERE departments_id = 1);
SELECT COUNT(*) AS count
FROM students s
LEFT JOIN classes c
ON c.id = s.classes_id
WHERE status = 1
AND c.departments_id = 1;
CREATE INDEX ix_students ON students(status, classes_id);