2000 万レコードの mysql テーブル Stop_Times があります。
このテーブルには MyISAM ストレージ エンジンを使用しています。
私のテーブル構造は
| agency_id | varchar(50) | NO | | NULL | |
| trip_id | varchar(50) | NO | PRI | NULL | |
| arrival_time | time | NO | | NULL | |
| departure_time | time | NO | | NULL | |
| stop_id | varchar(50) | NO | PRI | NULL | |
| stop_sequence | int(11) | NO | PRI | NULL | |
| route_id | varchar(50) | NO | | NULL | |
| route_type | int(5) | NO | | NULL | |
+---------------------+-------------+------+-----+--------
show create table Stop_Timesの出力は -
CREATE TABLE `Stop_Times` (
`agency_id` varchar(50) NOT NULL,
`trip_id` varchar(50) NOT NULL,
`arrival_time` time NOT NULL,
`departure_time` time NOT NULL,
`stop_id` varchar(50) NOT NULL,
`stop_sequence` int(11) NOT NULL,
`route_id` varchar(50) NOT NULL,
`route_type` int(5) NOT NULL,
UNIQUE KEY `idx_Stop_Times` (`agency_id`,`trip_id`,`stop_sequence`,`stop_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
/*!50100 PARTITION BY KEY (stop_id)
PARTITIONS 250 */
1つのクエリがあります
select distinct trip_id, stop_sequence from Stop_Times where agency_id = ? and stop_id = ?
テーブルを分割する前に、このクエリには 4 ~ 5 分以上かかりました。
しかし今、私はキーによるパーティション(stop_id)のよう にstop_idでテーブルをパーティション分割しました
現在、このクエリの実行には 2 ~ 3 秒かかります。
上記のクエリが続く別のクエリがあります-
select distinct(stop_id) from Stop_Times where agency_id = ? and trip_id = ? and stop_sequence > ?
上記のクエリでの説明の出力は次のとおりです-
1 SIMPLE Stop_Times range idx_Stop_Times idx_Stop_Times 308 NULL 250 Using where; Using index; Using temporary
このクエリにはさらに 90 ~ 150 秒かかります。
私の質問は、 trip_id と stop_sequence に Index を作成する必要がありますか? これにより、クエリのパフォーマンスが向上しますか?
一度に複数のユーザーからこのテーブルに対して多くの読み取り (選択クエリ) があるため、ストレージ エンジンを InnoDB の MyISAM から変更する必要がありますか?
データベースの達人が私を助けてください。
ありがとうございました