2017-12-29 33 views
0

私はテーブルを持って、次の列を持つproductsproductCodeproductNameproductDescriptionquantityInStockbuyPriceimageインデックスはこのコンテキストで効率的でしょうか?

次のクエリが実行されたとき、たとえばproductName上のインデックスは有用であろうか? SELECT * FROM products WHERE productName=:productName?このようなクエリのために

答えて

2

products(productName)

SELECT * 
FROM products 
WHERE productName = :productName; 

インデックスを強くお勧めします。

+0

クエリーの 'buyPrice'を' SELECT * FROM products ORDER BY buyPrice'と 'SELECT * FROM products ORDER BY buyPrice DESC'と呼びますか?インデックスはデフォルトでASC順に並べ替えられているので、私はそれを効率的に行うと考えています。 – codeDragon

+0

何が起こるか試してみると、インデックスを追加、修正、削除することで決してデータを変更できません。 –

+0

@codeDragon 。 。新しい質問は質問ではなく、コメントでお願いします。 –

0

このクエリでできることは、productNameのインデックスを作成することです。 また、(*)を選択せず​​、実際に必要な列のみを選択することをお勧めします。

また、選択する必要のある列がわずかである場合、または1つだけの場合は、カバーインデックスを考慮することもできます。例えば

:上記のクエリのために

SELECT productName, buyPrice 
FROM products 
WHERE productName = 'test'; 

、私は製品(商品名、buyPrice)のインデックスを追加します。これにより、データベースはインデックスを使用してデータのフィルタリングと取得の両方を行うことができます。これはすばやく行う必要があります。あなたは上記のコメントで述べた他のクエリについて

SELECT * FROM products ORDER BY buyPrice 

Iだろうインデックス商品この場合、(buyPrice) - あなたがいる限り、それはだとして、ASCまたはDESCで注文する場合は、それは問題ではありません。 ORDER BY内のすべての列は、DESCまたはASCのいずれかです。

また、select(*)を避け、これらのクエリにLIMITを追加することも検討します(実際にはすべての行が必要ですか?)。

+0

すべての列が必要な場合でも、 'SELECT(*)'を避けて、代わりにすべての列をリストする必要がありますか? – codeDragon

+1

すべての列が必要な場合は、SELECT(*)文を明示的なリストに置き換えてもパフォーマンスは向上しませんが、間違いなくバグの回避に役立ちます。たとえば、コード内でクエリの結果として5列を受け取った場合、1年後に2列以上をテーブルに追加するとどうなりますか?列名を明示的に指定すると、何も変わりません。 SELECT(*)を使用すると、突然2つのカラム(コードで使用されない)が得られ、悪いことが起こる可能性があります。上記の答えがあなたを助けたら、それを質問の答えとして受け入れることを検討してください:) –

関連する問題