私は迷っています。私は約100K行のテーブルを持っています。このテーブルの結果を照会すると、通常約2ms程度の結果が得られます。しかし、ORDER BYのパフォーマンスを使うたびに、約120msの岩のように落ちます。私はMySQL ORDER BY Optimizationのページを読んだが、私はすべてを理解するとは言えない。特にインデックスは私には不透明です。ORDER BYクエリを最適化する
SELECT *
FROM `affiliate_new_contracts`
WHERE phone_brand IN ('Apple','Blackberry','HTC','LG','Motorola','Nokia',
'Samsung','Sony Ericsson')
AND contract_length IN ('12','24')
AND (addon IS NULL OR addon IN('Telfort Sms 300','Surf & Mail'))
AND (plan_name = 'Telfort 100'
AND
credible_shop = 1
)
ORDER BY average_price_per_month ASC, phone_price_guestimate DESC,
contract_length ASC;
をしかし、私は基本的な原理を理解している場合、私は幸せになる:
最終的に私は次のクエリを実行したいと思います。前のクエリにORDER BY句を削除
は、それが120msのの代わりに20msの中で実行します。私はaverage_price_per_month
フィールドにインデックスを持っていますが、ORDER BY average_price_per_month
にORDER BY句を簡素化しても性能の向上は得られませんでした。私は理解していない。私はまた、究極のクエリで私を助けることができるはずですいわゆるマルチカラムのインデックスについては暗闇の中にいる。
ご協力いただければ幸いです。この悪い男の子をどのように演じさせるのですか?それとも、クエストユートピアンですか?次のように
CREATE TABLE
構文は次のとおりです。
$ show create table affiliate_new_contracts;
CREATE TABLE `affiliate_new_contracts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`plan_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`contract_length` int(11) DEFAULT NULL,
`phone_brand` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`price` float DEFAULT NULL,
`average_price_per_month` float DEFAULT NULL,
`phone_price_guestimate` float DEFAULT NULL,
`credible_shop` tinyint(1) DEFAULT '0',
`addon` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`addon_price` float DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_affiliate_new_contracts_on_plan_name` (`plan_name`),
KEY `index_affiliate_new_contracts_on_average_price_per_month` (`average_price_per_month`),
KEY `index_affiliate_new_contracts_on_price` (`price`)
) ENGINE=InnoDB AUTO_INCREMENT=2472311 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
ところでこの表は毎週再作成され、その間に更新されません。
水平スクロールバーを避けるために、クエリを再フォーマットしました。クエリ名の最後の数(プラン名と信頼できる店舗)は残りのクエリと一貫して書かれていません(他の用語はテーブル名を使用しません)。私はコメントせずに修正するかどうか議論し、そうしないことにしました。これらの用語を一貫性のあるものにすることに決めた場合は、このコメントを削除します。 –
優秀なコメント。クエリの一部が生成されました(私がクエリに適していないという証拠が増えています)。余分なテーブル名を削除しました。 – harm