私はInnoDBを使用しています。
クエリ、説明、インデックス
選択する
ストーリー。*、
count(comments.id) AS コメント、
GROUP_CONCAT(
DISTINCT classifications2.name SEPARATOR ';'
) AS classifications_name,
GROUP_CONCAT(
DISTINCT images.id
ORDER BY images.position,
images.id SEPARATOR ';'
) as images_id,
GROUP_CONCAT(
DISTINCT images.caption
ORDER BY images.position,
images.id SEPARATOR ';'
) as images_caption,
GROUP_CONCAT(
DISTINCT images.thumbnail
ORDER BY images.position,
images.id SEPARATOR ';'
) as images_thumbnail,
GROUP_CONCAT(
DISTINCT images.medium
ORDER BY images.position,
images.id SEPARATOR ';'
) as images_medium,
GROUP_CONCAT(
DISTINCT images.large
ORDER BY images.position,
images.id SEPARATOR ';'
) as images_large,
GROUP_CONCAT(
DISTINCT users.id
ORDER BY users.id SEPARATOR ';'
) as author_id,
GROUP_CONCAT(
DISTINCT users.display_name
ORDER BY users.id SEPARATOR ';'
) as author_display_name,
GROUP_CONCAT(
DISTINCT users.url
ORDER BY users.id SEPARATOR ';'
) AS author_url
から
物語
LEFT JOIN 分類
ON stories.id = classifications.story_id
LEFT JOIN 分類 AS 分類2
ON stories.id = classifications2.story_id
左結合のコメント
オン stories.id = コメント.story_id
LEFT JOIN image_story
オン stories.id = image_story.story_id
左結合画像
ON images.id = image_story.`image_id`
左結合
オン stories.id = author_story.story_id
LEFT JOIN ユーザー
ON users.id = author_story.author_id
WHERE classifications.`name` LIKE 'Home:Top%'
AND ストーリー.ステータス = 1
GROUP BY stories.id
ORDER BY 分類.`名前`, 分類.`位置`
+----+-------------+------------------+--------+-- --------------+----------+---------+------------------ ------+--------------------+---------------------------------------------- ---------------+
| | ID | select_type | テーブル | タイプ | 可能な_キー | キー | key_len | 参照 | 行 | 行 エクストラ |
+----+-------------+------------------+--------+-- --------------+----------+---------+------------------ ------+--------------------+---------------------------------------------- ---------------+
| | 1 | シンプル | ストーリー | 参照 | ステータス | ステータス | 1 | 定数 | 434792 | where を使用します。一時的な使用; ファイルソートの使用 |
| | 1 | シンプル | 分類 | 参照 | ストーリーID | ストーリーID | 4 | ストーリー.id | 1 | where | の使用
| | 1 | シンプル | 分類2 | 参照 | ストーリーID | ストーリーID | 4 | ストーリー.id | 1 | where | の使用
| | 1 | シンプル | コメント | 参照 | ストーリーID | ストーリーID | 8 | ストーリー.id | 6 | where を使用します。インデックスの使用 |
| | 1 | シンプル | イメージストーリー | 参照 | ストーリーID | ストーリーID | 4 | ストーリー.id | 1 | ヌル |
| | 1 | シンプル | 画像 | eq_ref | プライマリ | プライマリ | 4 | image_story.image_id | 1 | ヌル |
| | 1 | シンプル | 著者ストーリー | 参照 | ストーリーID | ストーリーID | 4 | ストーリー.id | 1 | where | の使用
| | 1 | シンプル | ユーザー | eq_ref | プライマリ | プライマリ | 4 | author_story.author_id | 1 | where | の使用
+----+-------------+------------------+--------+-- --------------+----------+---------+------------------ ------+--------------------+---------------------------------------------- ---------------+
+-------------+------------+-------------+---- ----------+-------------+-----------+------------- +------------+--------+------+------------+
| | 表 | 表 一意でない | キー名 | Seq_in_index | 列名 | 照合 | カーディナリティ | サブパート | 梱包済み | ヌル | インデックスの種類 |
+-------------+------------+-------------+---- ----------+-------------+-----------+------------- +------------+--------+------+------------+
| | ストーリー | 0 | プライマリ | 1 | ID | あ | 869584 | ヌル | ヌル | | | Bツリー|
| | ストーリー | 1 | created_at | 1 | created_at | あ | 434792 | ヌル | ヌル | | | Bツリー|
| | ストーリー | 1 | ソース | 1 | ソース | あ | 2 | ヌル | ヌル | はい | Bツリー|
| | ストーリー | 1 | ソース ID | 1 | ソース ID | あ | 869584 | ヌル | ヌル | はい | Bツリー|
| | ストーリー | 1 | タイプ | 1 | タイプ | あ | 2 | ヌル | ヌル | | | Bツリー|
| | ストーリー | 1 | ステータス | 1 | ステータス | あ | 2 | ヌル | ヌル | | | Bツリー|
| | ストーリー | 1 | タイプ_ステータス | 1 | タイプ | あ | 2 | ヌル | ヌル | | | Bツリー|
| | ストーリー | 1 | タイプ_ステータス | 2 | ステータス | あ | 2 | ヌル | ヌル | | | Bツリー|
| | 分類 | 0 | プライマリ | 1 | ID | あ | 207 | ヌル | ヌル | | | Bツリー|
| | 分類 | 1 | ストーリーID | 1 | ストーリーID | あ | 207 | ヌル | ヌル | | | Bツリー|
| | 分類 | 1 | 名前 | 1 | 名前 | あ | 103 | ヌル | ヌル | | | Bツリー|
| | 分類 | 1 | 名前 | 2 | 位置 | あ | 207 | ヌル | ヌル | はい | Bツリー|
| | コメント | 0 | プライマリ | 1 | ID | あ | 239336 | ヌル | ヌル | | | Bツリー|
| | コメント | 1 | ステータス | 1 | ステータス | あ | 2 | ヌル | ヌル | | | Bツリー|
| | コメント | 1 | 日付 | 1 | 日付 | あ | 239336 | ヌル | ヌル | | | Bツリー|
| | コメント | 1 | ストーリーID | 1 | ストーリーID | あ | 39889 | ヌル | ヌル | | | Bツリー|
+-------------+------------+-------------+---- ----------+-------------+-----------+------------- +------------+--------+------+------------+
クエリ時間
平均0.035 secondsして実行に時間がかかります。
のみを削除するGROUP BYと、時間は0.007平均で に低下します。
フィルターのみを削除するstories.status=1と、時間は0.025平均に低下します。これは簡単に最適化できるようです。
そして、LIKEフィルターとORDER BY句のみを削除すると、時間は0.006平均にまで低下します。
更新 1: 2013 年 4 月 13 日
私の理解は、答えを経て多様化を改善しました。
author_storyとにインデックスを追加しました。これにより、images_storyクエリが0.025数秒で改善されたように見えましたが、何らかの奇妙な理由で、EXPLAIN計画ははるかに良く見えます。この時点で、ORDER BYクエリを削除すると0.015数秒に短縮され、両方ORDER BYを削除するとGROUP BY、クエリのパフォーマンスが に向上します0.006。私はこれらが今注目すべき2つのことですか?ORDER BY必要に応じて、アプリ ロジックに移動する場合があります。
ここに改訂版EXPLAINとINDEXES
+----+-------------+------------------+--------+-- -------------------------------+----------------------+------- --+-------------------------+---------------------+------------- -------------------------------------------+
| | ID | select_type | テーブル | タイプ | 可能な_キー | キー | key_len | 参照 | 行 | 行 エクストラ |
+----+-------------+------------------+--------+-- -------------------------------+----------------------+------- --+-------------------------+---------------------+------------- -------------------------------------------+
| | 1 | シンプル | 分類 | 範囲 | ストーリー ID,名前 | 名前 | 102 | ヌル | 14 | インデックス条件の使用; 一時的な使用; ファイルソートの使用 |
| | 1 | シンプル | ストーリー | eq_ref | プライマリ、ステータス | プライマリ | 4 | 分類.物語_id | 1 | where | の使用
| | 1 | シンプル | 分類2 | 参照 | ストーリーID | ストーリーID | 4 | ストーリー.id | 1 | where | の使用
| | 1 | シンプル | 著者ストーリー | 参照 | author_id,story_id,author_story | ストーリーID | 4 | ストーリー.id | 1 | インデックス条件の使用 |
| | 1 | シンプル | ユーザー | eq_ref | プライマリ | プライマリ | 4 | author_story.author_id | 1 | where | の使用
| | 1 | シンプル | コメント | 参照 | ストーリーID | ストーリーID | 8 | ストーリー.id | 8 | where を使用します。インデックスの使用 |
| | 1 | シンプル | イメージストーリー | 参照 | ストーリーID,ストーリーID_2 | ストーリーID | 4 | ストーリー.id | 1 | ヌル |
| | 1 | シンプル | 画像 | eq_ref | PRIMARY,position_id | プライマリ | 4 | image_story.image_id | 1 | ヌル |
+----+-------------+------------------+--------+-- -------------------------------+----------------------+------- --+-------------------------+---------------------+------------- -------------------------------------------+
+-----------------+------------+------------------ --+--------------+-------------+-----------+------ -------+----------+--------+------+------------+-- -------+---------------+
| | 表 | 表 一意でない | キー名 | Seq_in_index | 列名 | 照合 | カーディナリティ | サブパート | 梱包済み | ヌル | インデックスの種類 | コメント | 索引_コメント |
+-----------------+------------+------------------ --+--------------+-------------+-----------+------ -------+----------+--------+------+------------+-- -------+---------------+
| | 著者ストーリー | 0 | プライマリ | 1 | ID | あ | 220116 | ヌル | ヌル | | | Bツリー| | | | |
| | 著者ストーリー | 0 | 物語の作者 | 1 | ストーリーID | あ | 220116 | ヌル | ヌル | | | Bツリー| | | | |
| | 著者ストーリー | 0 | 物語の作者 | 2 | 著者ID | あ | 220116 | ヌル | ヌル | | | Bツリー| | | | |
| | 著者ストーリー | 1 | 著者ID | 1 | 著者ID | あ | 2179 | ヌル | ヌル | | | Bツリー| | | | |
| | 著者ストーリー | 1 | ストーリーID | 1 | ストーリーID | あ | 220116 | ヌル | ヌル | | | Bツリー| | | | |
| | イメージストーリー | 0 | プライマリ | 1 | ID | あ | 148902 | ヌル | ヌル | | | Bツリー| | | | |
| | イメージストーリー | 0 | ストーリー_イメージ | 1 | ストーリーID | あ | 148902 | ヌル | ヌル | | | Bツリー| | | | |
| | イメージストーリー | 0 | ストーリー_イメージ | 2 | image_id | あ | 148902 | ヌル | ヌル | | | Bツリー| | | | |
| | イメージストーリー | 1 | ストーリーID | 1 | ストーリーID | あ | 148902 | ヌル | ヌル | | | Bツリー| | | | |
| | イメージストーリー | 1 | image_id | 1 | image_id | あ | 148902 | ヌル | ヌル | | | Bツリー| | | | |
| | 分類 | 0 | プライマリ | 1 | ID | あ | 257 | ヌル | ヌル | | | Bツリー| | | | |
| | 分類 | 1 | ストーリーID | 1 | ストーリーID | あ | 257 | ヌル | ヌル | | | Bツリー| | | | |
| | 分類 | 1 | 名前 | 1 | 名前 | あ | 128 | ヌル | ヌル | | | Bツリー| | | | |
| | 分類 | 1 | 名前 | 2 | 位置 | あ | 257 | ヌル | ヌル | はい | Bツリー| | | | |
| | ストーリー | 0 | プライマリ | 1 | ID | あ | 962570 | ヌル | ヌル | | | Bツリー| | | | |
| | ストーリー | 1 | created_at | 1 | created_at | あ | 481285 | ヌル | ヌル | | | Bツリー| | | | |
| | ストーリー | 1 | ソース | 1 | ソース | あ | 4 | ヌル | ヌル | はい | Bツリー| | | | |
| | ストーリー | 1 | ソース ID | 1 | ソース ID | あ | 962570 | ヌル | ヌル | はい | Bツリー| | | | |
| | ストーリー | 1 | タイプ | 1 | タイプ | あ | 2 | ヌル | ヌル | | | Bツリー| | | | |
| | ストーリー | 1 | ステータス | 1 | ステータス | あ | 4 | ヌル | ヌル | | | Bツリー| | | | |
| | ストーリー | 1 | タイプ_ステータス | 1 | タイプ | あ | 2 | ヌル | ヌル | | | Bツリー| | | | |
| | ストーリー | 1 | タイプ_ステータス | 2 | ステータス | あ | 6 | ヌル | ヌル | | | Bツリー| | | | |
| | コメント | 0 | プライマリ | 1 | ID | あ | 232559 | ヌル | ヌル | | | Bツリー| | | | |
| | コメント | 1 | ステータス | 1 | ステータス | あ | 6 | ヌル | ヌル | | | Bツリー| | | | |
| | コメント | 1 | 日付 | 1 | 日付 | あ | 232559 | ヌル | ヌル | | | Bツリー| | | | |
| | コメント | 1 | ストーリーID | 1 | ストーリーID | あ | 29069 | ヌル | ヌル | | | Bツリー| | | | |
| | 画像 | 0 | プライマリ | 1 | ID | あ | 147206 | ヌル | ヌル | | | Bツリー| | | | |
| | 画像 | 0 | ソース ID | 1 | ソース ID | あ | 147206 | ヌル | ヌル | はい | Bツリー| | | | |
| | 画像 | 1 | 位置 | 1 | 位置 | あ | 4 | ヌル | ヌル | | | Bツリー| | | | |
| | 画像 | 1 | position_id | 1 | ID | あ | 147206 | ヌル | ヌル | | | Bツリー| | | | |
| | 画像 | 1 | position_id | 2 | 位置 | あ | 147206 | ヌル | ヌル | | | Bツリー| | | | |
| | ユーザー | 0 | プライマリ | 1 | ID | あ | 981 | ヌル | ヌル | | | Bツリー| | | | |
| | ユーザー | 0 | users_email_unique | 1 | 電子メール | あ | 981 | ヌル | ヌル | | | Bツリー| | | | |
+-----------------+------------+------------------ --+--------------+-------------+-----------+------ -------+----------+--------+------+------------+-- -------+---------------+
選択する
ストーリー。*、
count(comments.id) AS コメント、
GROUP_CONCAT(DISTINCT users.id ORDER BY users.id SEPARATOR ';') AS author_id,
GROUP_CONCAT(DISTINCT users.display_name ORDER BY users.id SEPARATOR ';') AS authors_display_name,
GROUP_CONCAT(DISTINCT users.url ORDER BY users.id SEPARATOR ';') AS authors_url,
GROUP_CONCAT(DISTINCT classifications2.name SEPARATOR ';') AS classifications_name,
GROUP_CONCAT(DISTINCT images.id ORDER BY images.position,images.id SEPARATOR ';') AS images_id,
GROUP_CONCAT(DISTINCT images.caption ORDER BY images.position,images.id SEPARATOR ';') AS images_caption,
GROUP_CONCAT(DISTINCT images.thumbnail ORDER BY images.position,images.id SEPARATOR ';') AS images_thumbnail,
GROUP_CONCAT(DISTINCT images.medium ORDER BY images.position,images.id SEPARATOR ';') AS images_medium,
GROUP_CONCAT(DISTINCT images.large ORDER BY images.position,images.id SEPARATOR ';') AS images_large
から
分類
INNER JOIN ストーリー
ON stories.id = classifications.story_id
LEFT JOIN 分類 AS 分類2
ON stories.id = classifications2.story_id
左結合のコメント
オン stories.id = コメント.story_id
LEFT JOIN image_story
オン stories.id = image_story.story_id
左結合画像
ON images.id = image_story.`image_id`
内部結合
オン stories.id = author_story.story_id
INNER JOIN ユーザー
ON users.id = author_story.author_id
WHERE classifications.`name` LIKE 'Home:Top%'
AND ストーリー.ステータス = 1
GROUP BY stories.id
NULL 順
更新 2: 2013 年 4 月 14 日
もう一つ気がついた。stories.content(LONGTEXT) と(LONGTEXT) を選択しないとstories.content_html、クエリは0.015数秒から数秒に短縮され0.006ます。今のところ、私はそれらをなくすか、または何か他のものに置き換えることができるかどうかを検討contentしcontent_htmlています.
上記の 2013 年 4 月 13 日の更新でクエリ、インデックス、および説明を更新しましたが、それらはマイナーで増分的なものだったため、今回の更新では再投稿しませんでした。クエリはまだ使用していfilesortます。私は取り除くことができませんが、取り除くことができGROUP BYましたORDER BY。
更新 3: 2013 年 4 月 16 日
image_story要求に応じて、両方からstories_id INDEXES を削除しましたauthor_story。これらは冗長であるためです。その結果、explain の出力は変更されたことを示すためだけに変更されましたpossible_keys。Using Index残念ながら、それでも最適化は表示されませんでした。
また、クエリの実行時間に非常に大きな違いをもたらしているのではなく、フェッチするように変更LONGTEXTされました。TEXTLEFT(stories.content, 500)stories.content
+----+-------------+------------------+--------+-- ---------------------------+--------------+------- --+-------------------------+---------------------+------------- -------------------------------------------------- ------+ | | ID | select_type | テーブル | タイプ | 可能な_キー | キー | key_len | 参照 | 行 | 行 エクストラ | +----+-------------+------------------+--------+-- ---------------------------+--------------+------- --+-------------------------+---------------------+------------- -------------------------------------------------- ------+ | | 1 | シンプル | 分類 | 参照 | story_id,name,name_position | 名前 | 102 | 定数 | 10 | インデックス条件の使用; where を使用します。一時的な使用; ファイルソートの使用 | | | 1 | シンプル | ストーリー | eq_ref | プライマリ、ステータス | プライマリ | 4 | 分類.物語_id | 1 | where | の使用 | | 1 | シンプル | 分類2 | 参照 | ストーリーID | ストーリーID | 4 | ストーリー.id | 1 | where | の使用 | | 1 | シンプル | 著者ストーリー | 参照 | 物語の作者 | 物語の作者 | 4 | ストーリー.id | 1 | where を使用します。インデックスの使用 | | | 1 | シンプル | ユーザー | eq_ref | プライマリ | プライマリ | 4 | author_story.author_id | 1 | where | の使用 | | 1 | シンプル | コメント | 参照 | ストーリーID | ストーリーID | 8 | ストーリー.id | 8 | where を使用します。インデックスの使用 | | | 1 | シンプル | イメージストーリー | 参照 | ストーリー_イメージ | ストーリー_イメージ | 4 | ストーリー.id | 1 | インデックスの使用 | | | 1 | シンプル | 画像 | eq_ref | PRIMARY,position_id | プライマリ | 4 | image_story.image_id | 1 | ヌル | +----+-------------+------------------+--------+-- ---------------------------+--------------+------- --+-------------------------+---------------------+------------- -------------------------------------------------- ------+ innodb_buffer_pool_size 134217728 TABLE_NAME INDEX_LENGTH image_story 10010624 image_story 4556800 image_story 0 TABLE_NAME INDEX_NAMES サイズ 夜明け/image_story story_image 13921