0

のカウントは、私がこのような構造を持つテーブルがある:MySQLのテーブル - パフォーマンス、インデックス

CREATE TABLE `supplies` (
`cycle_id` int(11) NOT NULL, 
`subject_id` varchar(45) COLLATE utf8_unicode_ci NOT NULL, 
`market_id` int(11) NOT NULL, 
`price` int(11) NOT NULL, 
`currency_id` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL, 
`offered_order` bigint(20) DEFAULT NULL, 
PRIMARY KEY (`subject_id`,`market_id`,`cycle_id`,`price`), 
KEY `fk_supplies_subjects` (`subject_id`), 
KEY `fk_supplies_markets` (`market_id`), 
KEY `fk_supplies_currencies` (`currency_id`), 
CONSTRAINT `fk_supplies_currencies` FOREIGN KEY (`currency_id`) REFERENCES `currencies` (`currency_id`) ON DELETE CASCADE ON UPDATE CASCADE, 
CONSTRAINT `fk_supplies_subjects` FOREIGN KEY (`subject_id`) REFERENCES `subjects` (`subject_id`) ON DELETE CASCADE ON UPDATE CASCADE, 
CONSTRAINT `fk_supplies_markets` FOREIGN KEY (`market_id`) REFERENCES `markets` (`market_id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

表は、約20,000行があります。パフォーマンスに問題があります。テーブルに

    INSERTのスロー
  1. :私は長い時間を取って、私が見ることができるログからされているSQLクエリをログに記録しています。テーブルから

    INSERT INTO supplies VALUES (11, 'userName', 18, 30, 'pound', 20) ; 
    
  2. スローDELETE

    DELETE FROM supplies WHERE cycle_id = 6 AND market_id = 18 AND subject_id = 'userName' ; 
    

私は何を向上させることができますか?

PRIMARYのキーは4列で構成されており(一部はvarcharsであるため)、インデックスを変更すると役立ちます。しかし、どのようにインデックスを変更する必要がありますか?

ありがとうございました。

+0

なぜ整数以外のIDを使用することにしましたか? – Strawberry

+0

@Strawberry - 私はこのテーブルを設計しなかった、私の目標はそれを最適化することです。 idsを整数に変更します。 –

+0

'PRIMARY KEY'に' price'を含めるのは正しいとは思われません。説明してください。 –

答えて

1

フィールドが1つのみのプライマリキーを作成する必要があります。これは基本的なパフォーマンスの最適化です。

CREATE TABLE `supplies` (
`supplies_id` int(11) NOT NULL AUTO_INCREMENT, 
`cycle_id` int(11) NOT NULL, 
`subject_id` varchar(45) COLLATE utf8_unicode_ci NOT NULL, 
`market_id` int(11) NOT NULL, 
`price` int(11) NOT NULL, 
`currency_id` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL, 
`offered_order` bigint(20) DEFAULT NULL, 
PRIMARY KEY (`supplies_id`), 
INDEX `index` (`subject_id` ASC,`market_id` ASC,`cycle_id` ASC,`price` ASC)) 
KEY `fk_supplies_subjects` (`subject_id`), 
KEY `fk_supplies_markets` (`market_id`), 
KEY `fk_supplies_currencies` (`currency_id`), 
CONSTRAINT `fk_supplies_currencies` FOREIGN KEY (`currency_id`) REFERENCES `currencies` (`currency_id`) ON DELETE CASCADE ON UPDATE CASCADE, 
CONSTRAINT `fk_supplies_subjects` FOREIGN KEY (`subject_id`) REFERENCES `subjects` (`subject_id`) ON DELETE CASCADE ON UPDATE CASCADE, 
CONSTRAINT `fk_supplies_markets` FOREIGN KEY (`market_id`) REFERENCES `markets` (`market_id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

カスケード制約を削除することも可能です。それらが本当に必要かどうか確認してください。

+0

これはINSERTをスピードアップすると思いますが、DELETESはどうですか? –

+0

1つのフィールドのみを持つ主キーは、挿入と削除の両方を高速化します。カスケード制約を削除すると、削除と更新が高速化されます。 –

+0

「1つのフィールドPKが良い」の背後にある根拠について説明してください。 –

関連する問題