次のクエリの実行には時間がかかりすぎ、SPCの100万行をスキャンしてインデックスを使用していません。その量のデータを検索するのを避けるために、インデックスを使用する方法とクエリを変更する方法があるかどうかを理解したいと思います。結合された列の型が同じでも、クエリでインデックスが使用されていません
mysql> explain extended select *
-> from (((((((`raw`.`HUB_PA` `HP`
-> left
-> join `raw`.`SAT_TABLE1` `SPD` on(((`HP`.`P_HA` = `SPD`.`P_HA`) and (`SPD`.`ENDS_ON` = str_to_date('31/12/9999','%d/%m/%Y')))))
-> join `raw`.`LINK_TABLE1` `LPR` on((`LPR`.`P_HA` = `HP`.`P_HA`))) join `raw`.`PA_ROLE` `HR` on(((`LPR`.`PA_ROLE_HA` = `HR`.`P_ROLE_HASH`) and (`HR`.`PARTY_ROLE` = 'CUSTOMER'))))
-> join `raw`.`LINK_TABLE2` `LPC` on((`LPC`.`P_HA` = `HP`.`P_HA`))) join `raw`.`H_LOC` `HL` on((`HL`.`LOC_HA` = `LPC`.`LOC_HA`)))
-> join `raw`.`SAT_TABLE2` `SPC` on(((`SPC`.`PCH` = `LPC`.`PCH`) and (`SPC`.`ENDS_ON` = str_to_date('31/12/9999','%d/%m/%Y')))))
-> join `raw`.`SAT_TABLE3` `SPA` on((`SPA`.`LOC_HA` = `LPC`.`LOC_HA`)));
+----+-------------+-------+------------+--------+-------------------------------------+-------------------+---------+-----------------+---------+----------+----------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+--------+-------------------------------------+-------------------+---------+-----------------+---------+----------+----------------------------------------------------+
| 1 | SIMPLE | HR | NULL | ALL | PRIMARY | NULL | NULL | NULL | 7 | 14.29 | Using where |
| 1 | SIMPLE | SPC | NULL | ALL | PRIMARY,SAT_CONTACT_INDEX | NULL | NULL | NULL | 1318796 | 10.00 | Using where; Using join buffer (Block Nested Loop) |
| 1 | SIMPLE | LPC | NULL | eq_ref | PRIMARY,LINK_CP_INDEX,LINK_PC_INDEX | PRIMARY | 32 | raw.SPC.PCH | 1 | 100.00 | Using where |
| 1 | SIMPLE | HL | NULL | eq_ref | PRIMARY | PRIMARY | 32 | raw.LPC.LOC_HA | 1 | 100.00 | NULL |
| 1 | SIMPLE | SPA | NULL | ref | PRIMARY,SAT_ADDRESS_INDEX | SAT_ADDRESS_INDEX | 32 | raw.LPC.LOC_HA | 1 | 100.00 | NULL |
| 1 | SIMPLE | HP | NULL | eq_ref | PRIMARY | PRIMARY | 32 | raw.LPC.P_HA | 1 | 100.00 | NULL |
| 1 | SIMPLE | SPD | NULL | ref | PRIMARY,SAT_DETAILS_INDEX | PRIMARY | 32 | raw.LPC.P_HA | 1 | 100.00 | Using where |
| 1 | SIMPLE | LPR | NULL | ref | LINK_ROLE_INDEX | LINK_ROLE_INDEX | 33 | raw.LPC.P_HA | 1 | 10.00 | Using where |
+----+-------------+-------+------------+--------+-------------------------------------+-------------------+---------+-----------------+---------+----------+----------------------------------------------------+
8 rows in set, 2 warnings (0.02 sec)
| SAT_TABLE2 | CREATE TABLE `SAT_TABLE2` (
`CANCEL_FROM_MAILING` int(11) DEFAULT NULL,
`CDC_HPC` char(32) DEFAULT NULL,
`STARTS_FROM` datetime DEFAULT NULL,
`ENDS_ON` datetime DEFAULT NULL,
`LOAD_DATETIME` datetime NOT NULL,
`PCH` char(32) NOT NULL,
`SOURCE_SYSTEM` int(11) DEFAULT NULL,
PRIMARY KEY (`PCH`,`LOAD_DATETIME`),
KEY `SAT_CONTACT_INDEX` (`PCH`),
KEY `SAT_CONTACT_CDC_INDEX` (`CDC_HASH_PARTY_CONTACT`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
| PA_ROLE| CREATE TABLE `HUB_PARTY_ROLE` (
`LOAD_DATETIME` datetime DEFAULT NULL,
`PA_ROLE_HA` char(32) NOT NULL,
`PARTY_ROLE` varchar(50) DEFAULT NULL,
`SOURCE_SYSTEM` int(11) DEFAULT NULL,
PRIMARY KEY (`PARTY_ROLE_HASH`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
'SPC'は何のために複合インデックスを作成する必要がありますか?他のテーブルの定義はどこですか?これらのテーブルにはすべてインデックスがありますか? 2つのテーブルを結合してインデックスを使用しているかどうかを確認し、問題がどこにあるかを見つけるたびに1つのテーブルを追加してください。 –
@JuanCarlosOropeza SPCはSAT_TABLE2テーブルを表すエイリアスです。他のテーブルのmax HR(PA_ROLE)は、インデックスが使用されていないもう1つのテーブルなので興味があります。他のすべての表では、索引は結合に使用されるため、その構造は関連性がありません。 – Shadow
SPCテーブルのインデックスヒントを試しましたか? – Shadow