2012-01-20 12 views
10

検索結果に使用される数百万のレコードでテーブルにインデックスを作成します。 ASCまたはDESC命令による結果を示しています。私の質問は、列がインデックスを持っているかどうかですか?私はそのテーブルの2つ以上のインデックスです。その列にインデックスを作成するかどうかによってパフォーマンスがどのように影響を受けますか?列単位で索引を付ける必要がありますか?

+0

http://stackoverflow.com/questions/7475332/mysql-index-for-group-の可能性の重複by-order-by –

+0

@Tichodroma:私は以前、それについての質問をグループごとに見ました。私のシナリオは異なります。検索フィルターの条件(where)を持つ列のインデックスが必要です。 –

答えて

9

列単位は、フィルタリングではなく結果セットの順序付けに使用されます。 order by節に記述されている列のインデックスは、特にデータをフィルタリングするために使用されていない場合は、何も変更しない可能性があります。

+0

:その列はwhereの条件でも使用されます。次に、検索クエリの時間の複雑さにどのように影響しますか? –

+0

インデックスを追加すると時間が短縮されます。クエリの実行計画やクエリを見ずに知る方法はありません。 – Sathya

+0

クエリの実行計画を確認します。ありがとう。 –

3

実際には、数百万行にもわたってよく考えられたインデックスを適用すると、スペースパフォーマンスの問題を心配し始めてもそれほど大きなデータセットではありません。

しかし

あなたは一日一回、更新そのテーブルを読み込む場合は/行毎秒100回を削除 - occasinallyパフォーマンスが向上します選択しながら、インデックスからの影響は、主な操作のパフォーマンスが低下することがあります。

だから、いつものように答え - それは、インデックス付きの列にORDER BYを使用して

+0

検索フィルタロジックです。したがって、テーブルは1回の書き込みより10000回読み込まれます。私は何をすべきか? –

+0

間違いなく良いインデックスを持っている - あなたの場合です –

0

を依存しては良いアイデアではありません。実際にインデックスを使用する目的は、インデックスの列がソートされた順序でデータを維持するのに役立つように検索を高速化することです。 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_idORDER 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は非索引付きの列よりも高くなっているインデックス付きの列を見ることができます。クエリの標準とあなたは下のリンクを参照することができ、パフォーマンスに関する詳細な分析については

http://mysql.rjweb.org/doc.php/index_cookbook_mysql

関連する問題