games_releases
は、ゲーム情報を組み合わせたテーブルです。ゲームのタイトルのようなInfos、ゲームの出版社や開発者は、さまざまなゲームで同じであるため、後で一緒に結合される異なるテーブルに保存されます。JOINEDテーブルとORDER BYとOFFSETを使用してMySQLクエリを改善する方法
以下の例では、理解を容易にするためにテーブルを結合しています(実際には、同じ原則に従って結合されたテーブルがいくつかあります)。
games_releases
テーブル:games_releases
の
id int(11) <- unique
title_id int(11) <- index
developer_id int(11)
... more game relevant data
いくつかの典型的な行は次のようになります。
id title_id developer_id ... ...
--------------------------------------------
1 17 265
2 23 41
3 31 3
4 42 15
5 17 123
games_titles
テーブル:games_titles
の
id int(11) <- unique
title varchar(128)
created int(11)
いくつかの典型的な行は次のようになります:
id title created
----------------------------------------
17 Pac-Man [some unix timestamp]
23 Defender [some unix timestamp]
31 Scramble [some unix timestamp]
42 Q*bert [some unix timestamp]
99 Phoenix [some unix timestamp]
NOW:
SELECT
id AS release_id, t.`title` AS title
FROM
games_releases
LEFT JOIN games_titles t ON t.`id`=`games_releases`.`title_id`
ORDER BY title
LIMIT 24
...その後、このクエリが実行されるだろう、のは(当時24)は、ユーザがアルファベット順にすべてのゲームを見たいと仮定しましょうこれは
を返されますrelease_id title
-----------------------------
2 Defender
1 Pac-Man
5 Pac-Man
4 Q*Bert
3 Scramble
基本的に結果の表には、IDではなく文字列が表示されます。
チャレンジ:このクエリは実行に時間がかかります(games_releases
は約80.000個のアイテムが表示されますが、データベースは1.000.000個に増えたとします)。ここで
は私に語ったかを説明ある(games_releasesは、インデックスのtitle_idを持つ):
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE games_releases NULL index NULL title_id 4 NULL 76669 Using index; Using temporary; Using filesort
1 SIMPLE t NULL eq_ref PRIMARY PRIMARY 4 phoenix.games_releases.title_id 1
これを最適化するために、任意のチャンスを?
EDIT:質問に回答しました。 「JOIN」の代わりに間違った「LEFT JOIN」が問題でした。
But:オフセットが大きくなるにつれて実行時間を長くするにはどうすればよいですか?
複数のJOINを実行しているときにインデックスを効率的に設定する方法を理解するのは難しいですが、
games_titlesの「タイトル」インデックスを持つことは効果がないようです。
することができますそのgames_releases adn game_titlesは一致しません??? – scaisEdge
こちらをお読みください。 http://meta.stackoverflow.com/a/271056/クエリの最適化に関するセクションに特に注意してください。それから、あなたの質問を編集して、より多くの情報を提供してください。ちなみに、MySQLクエリプランナーは、ビューをサブクエリとして扱うため、ビューを最適化しても外部クエリが最適化されるとは限りません。 –
@ O.Jones私はこれをすでにやったと思う。問題のクエリとEXPLAINがあります。私はDBの構造を広告します。 –