検索結果に使用される数百万のレコードでテーブルにインデックスを作成します。 ASCまたはDESC命令による結果を示しています。私の質問は、列がインデックスを持っているかどうかですか?私はそのテーブルの2つ以上のインデックスです。その列にインデックスを作成するかどうかによってパフォーマンスがどのように影響を受けますか?列単位で索引を付ける必要がありますか?
答えて
列単位は、フィルタリングではなく結果セットの順序付けに使用されます。 order by節に記述されている列のインデックスは、特にデータをフィルタリングするために使用されていない場合は、何も変更しない可能性があります。
:その列はwhereの条件でも使用されます。次に、検索クエリの時間の複雑さにどのように影響しますか? –
インデックスを追加すると時間が短縮されます。クエリの実行計画やクエリを見ずに知る方法はありません。 – Sathya
クエリの実行計画を確認します。ありがとう。 –
実際には、数百万行にもわたってよく考えられたインデックスを適用すると、スペースパフォーマンスの問題を心配し始めてもそれほど大きなデータセットではありません。
しかし
あなたは一日一回、更新そのテーブルを読み込む場合は/行毎秒100回を削除 - occasinallyパフォーマンスが向上します選択しながら、インデックスからの影響は、主な操作のパフォーマンスが低下することがあります。
だから、いつものように答え - それは、インデックス付きの列にORDER BYを使用して
検索フィルタロジックです。したがって、テーブルは1回の書き込みより10000回読み込まれます。私は何をすべきか? –
間違いなく良いインデックスを持っている - あなたの場合です –
を依存しては良いアイデアではありません。実際にインデックスを使用する目的は、インデックスの列がソートされた順序でデータを維持するのに役立つように検索を高速化することです。 ORDER BYを索引付けされていない列で使用することをお勧めします。私はMySqlでサンプルクエリを実行し、以下に述べるように結果を得ました。
SELECT
ci.id AS item_id, ci.brand_id, ci.category_id,
ci.item_size_type, ci.is_express_processing, ci.packing,
ci.parent_service_id, ci.product_id, ci.size,
ci.create_date AS item_create_date, cis.service_id, cis.quantity
FROM
cart AS c
INNER JOIN
cart_items AS ci ON ci.cart_id = c.id
LEFT JOIN
cart_item_services AS cis ON cis.item_id = ci.id
WHERE
c.id = 144
ORDER BY
c.create_date;
次のようにここで私は非索引列create_date
と結果にORDER BY
を使用していますが次のとおりです。
# Time: 2017-11-03T10:30:33.237056Z
# [email protected]: root[root] @ localhost [] Id: 3
# Query_time: 0.000340
# Lock_time: 0.000154 Rows_sent: 2 Rows_examined: 4
そして今、私は、インデックス付きの列item_id
にORDER BY
を使用するつもりです:
SELECT
ci.id AS item_id, ci.brand_id, ci.category_id,
ci.item_size_type, ci.is_express_processing, ci.packing,
ci.parent_service_id, ci.product_id, ci.size,
ci.create_date AS item_create_date, cis.service_id, cis.quantity
FROM
cart AS c
INNER JOIN
cart_items AS ci ON ci.cart_id = c.id
LEFT JOIN
cart_item_services AS cis ON cis.item_id = ci.id
WHERE
c.id = 144
ORDER BY
item_id;
私は次のような結果を得ました。
# Time: 2017-11-03T10:30:47.802392Z
# [email protected]: root[root] @ localhost [] Id: 3
# Query_time: 0.000383
# Lock_time: 0.000176 Rows_sent: 2 Rows_examined: 4
は、したがって、上記の結果では、我々はQuery_timeとLock_timeは非索引付きの列よりも高くなっているインデックス付きの列を見ることができます。クエリの標準とあなたは下のリンクを参照することができ、パフォーマンスに関する詳細な分析については
:
- 1. Firebirdは手動で再索引付けする必要がありますか?
- 2. 数値を持つデータベース列を索引付けする必要がありますか?
- 3. 測定単位をローカライズする必要がありますか?
- 4. 主キーにインデックスを付ける必要がありますか?
- 5. 基礎テーブルがすでに索引付けされている場合は、フルテキスト索引が必要です
- 6. がありません1 tempに必要な位置引数
- 7. tensorflow.contrib.learn.DNNclassifierがありません1必要な位置引数: 'feature_columns'
- 8. テスト可能でない単位テストコードをアドバイスする必要があります
- 9. ActiveMerchant/Spree - クリエイターには取引単位/アカウント単位のコミッションがありますか?
- 10. void 'の前に'; 'を付ける必要があります。エラー?
- 11. Oracleの主キー列にインデックスを付ける必要があります
- 12. レールでhas_one関連付けをインデックスする必要がありますか
- 13. 文字列内のすべての単語の索引付け
- 14. 行単位の操作を高速化する必要があります
- 15. sparse_to_denseは、索引を辞書順にソートする必要があります。
- 16. rpy2での配列の索引付け
- 17. .Call引数を保護する必要がありますか?
- 18. ORDER BY列に索引が必要ですか?
- 19. どのRails関連付けを使用する必要がありますか?
- 20. Solr:ストップワードの再索引付けは必須ですか?
- 21. Elastic検索を開始する必要がありますか?
- 22. 角度指示に名前を付ける必要がありますか?
- 23. PHPのグローバル関数に名前を付ける必要がありますか?
- 24. 私のURLの最後に.htmを付ける必要がありますか?
- 25. 春にもサブメソッドの@Transactional注釈を付ける必要がありますか?
- 26. 引用符は一致する必要がありますか?
- 27. は、NA列を取り除くために列にラベルを付ける必要があります。番号は
- 28. マップデザインとマウスホバーで名前を付ける必要があります
- 29. springbootフレームワークでログファイルにタイムスタンプを付ける必要があります
- 30. MySQL - 単一の文字列で複数のワイルドカードを検索する必要があります
http://stackoverflow.com/questions/7475332/mysql-index-for-group-の可能性の重複by-order-by –
@Tichodroma:私は以前、それについての質問をグループごとに見ました。私のシナリオは異なります。検索フィルターの条件(where)を持つ列のインデックスが必要です。 –