次の手順があります。
CREATE PROCEDURE getProjectTeams(IN p_idProject INTEGER)
BEGIN
SELECT idTeam, name, workersCount, confirmersCount, isConfirm
FROM Teams JOIN team_project USING (idTeam)
WHERE idProject = p_idProject;
END $$
そして、ここCREATE TABLE
にテーブルTeams
とのスクリプトがありますteam_project
:
CREATE TABLE Teams (
idTeam INT PRIMARY KEY auto_increment,
name CHAR(20) NOT NULL UNIQUE,
isConfirm BOOL DEFAULT 0,
workersCount SMALLINT DEFAULT 0,
confirmersCount SMALLINT DEFAULT 0
) engine = innodb DEFAULT CHARACTER SET=utf8 COLLATE=utf8_polish_ci;
CREATE TABLE team_project (
idTeam INT NOT NULL,
idProject INT NOT NULL,
FOREIGN KEY(idTeam) REFERENCES Teams(idTeam)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY (idProject) REFERENCES Projects(idProject)
ON DELETE CASCADE
ON UPDATE CASCADE,
PRIMARY KEY(idTeam, idProject)
) engine = innodb DEFAULT CHARACTER SET=utf8 COLLATE=utf8_polish_ci;
サーバー上に同一のスキーマを持つデータベースはほとんどありませんが、この手順は 1 つのデータベースによって呼び出された場合にのみログに記録されます。これらの他のデータベースによって行われた呼び出しはログに記録されません。クエリが遅いかどうかの問題ではありません (常に約 0.0001 秒かかります)。インデックスを使用していないとログに記録される理由についてです。そんなことがあるものか?
Zagor23 が示唆したように、実行しEXPLAIN
た結果は次のとおりです。a) 手順が記録されているデータベース:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 1 | SIMPLE | team_project | ref | PRIMARY,idProject | idProject | 4 | const | 3 | Using index |
| 1 | SIMPLE | Teams | ALL | PRIMARY | NULL | NULL | NULL | 4 | Using where; Using join buffer |
b) 手順が記録されていないデータベース:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 1 | SIMPLE | team_project | ref | PRIMARY,idProject | idProject | 4 | const | 1 | Using index |
| 1 | SIMPLE | Teams | eq_ref | PRIMARY | PRIMARY | 4 | ecovbase.team_project.idTeam | 1 | |
実際には、データは少し異なりますが、それほどではありません。GoodDB (ログに記録されていないもの) には、Teams に 11 行、team_project に 420 行、BadDB (Teams に 4 行、team_project に約 800 行) があります。入札差額ではないようです。その手順をログに記録しないようにする方法はありますか?