私は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
されました。TEXT
LEFT(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