質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

791閲覧

[SQLite] 最適なインデックスのつけ方は?

Cheedaf

総合スコア8

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2018/04/20 12:13

編集2018/04/20 13:03

SQLiteの最適なインデックスのつけ方が知りたいです。環境は、android上での実行を想定しています。

  
いま、下のようなテーブルがあったとします(id列は省略)。
IDは (ID integer primary key, ...) で指定しています。

COUNTRYCOMPANYPRODUCT
U.S.GoogleChrome
U.S.GoogleGmail
U.S.GoogleAndroid
U.S.MicrosoftWindows
U.S.MicrosoftAdobe
U.S.AppleiPhone
U.S.AppleiPad
JPSonywalkman
JPSonyxperia
JPpanasonicLet's Note

テーブルの使い方としては、COUNTRY列やCOMPANY列を利用して、例えばU.S.のPRODUCTの値を集めてくるだとか、GoogleのPRODUCTの値を集めてくるといったような具合です。一番重要なのはPRODUCTであって、COUNTRYやCOMPANYはそれらをグループ分けするために利用します。具体的には、

select PRODUCT where COUNTRY = 'JP'; select PRODUCT where COUNTRY = 'U.S.' AND COMPANY = 'Google';

のようなクエリで検索をかけます。

これを高速化したいと思った場合、どのようにインデックスをつけるのが最も効果的なのでしょうか?
また、下のようにCOUNTRY列とCOMPANY列を統合した場合、なにかが変わるでしょうか?

COUNTORY_AND_COMPANYPRODUCT
U.S.#GoogleChrome
U.S.#GoogleGmail
U.S.#GoogleAndroid
U.S.#MicrosoftWindows
U.S.#MicrosoftAdobe
U.S.#AppleiPhone
U.S.#AppleiPad
JP#Sonywalkman
JP#Sonyxperia
JP#panasonicLet's Note

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2018/04/20 12:18

これだけでは判断できません。テーブルにどんなインデックスを付けるが適切かは、テーブルの「使い方」(どんなSELECTをかけるか)に依存します。
umyu

2018/04/20 12:24

質問文のテーブルの主キー(PRIMARY KEY制約)はどうなっていますかー?
Cheedaf

2018/04/20 12:57

情報不足ですみません。質問を修正したので、もしよろしければ回答よろしくお願いいたします。
guest

回答2

0

「どの列にインデックスをつけるのが最も効果的」への回答になるか?ですが
少しだけ、ヒントを。

  • このテーブルから自分が得たい情報列は? クエリー(、抽出)したい情報は?
  • そしてそのとき、条件句をどう書きます? 

(ほかの結合できるテーブル、マスターテーブル等は仮にあるとして、考えます。)

検索に使う列は? (一方で、結果が欲しい列は?)

投稿2018/04/20 12:20

kawakawa2018

総合スコア1195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cheedaf

2018/04/20 13:10

回答ありがとうございます。 >このテーブルから自分が得たい情報列は? 欲しいのはPRODUCTです。COUNTRYとCOMPANYはタグのようなもので、欲しいPRODUCTを絞るために利用します。 >そしてそのとき、条件句をどう書きます? たとえばこんな感じです。 select PRODUCT where COUNTRY = 'JP'; select PRODUCT where COUNTRY = 'U.S.' AND COMPANY = 'Google';
kawakawa2018

2018/04/20 13:39

まず初めに・・・  書いておきます。 索引(INDEX)はとても奥が深いSQLの技術です。 次に参考になる とてもとてもよく出来た資料を1つ紹介します。 Oracleの資料 http://www.oracle.com/technetwork/jp/database/articles/tsushima/tsm06-1598252-ja.html SQL Serverの資料 「SQL Server インデックス デザイン ガイド」 https://msdn.microsoft.com/ja-jp/library/jj835095(v=sql.120).aspx 2つともDBAでは知っている有名サイトのいくつかのうちから引用しました。 これを読んでいただくと、分かると思います。 難しいです、とっかかりは。 ですがそれぞれ、1つの記事で索引の技術、網羅しています、お勧め記事です。 (何度も読み返すことお勧めします、そして実際に設定し統計情報を見てみると理解できてきます) そして話を戻すと 先にあえてぼかして書いたのですが 「条件句をどう書きます?」で、すでに索引設計の作業を、 Ceedafさんはなさっています。 「SQL Server インデックス デザイン ガイド」の「インデックスのデザインの全般的なガイドラインークエリに関する注意点」  そして 「■2.どのように作成するのか」の「(3)選択率の低い列を先頭に」 のことを行ったことになります。 こんな感じで、1つのテーブルをあげて、それだけで索引の設計は無理です。 想定して、こういうデータ型、ユニークキーの列であるか、などテーブル自体の情報がないと回答はできません(笑)。ですが、回答しないのもどうかと思い、「回答になるか?」という感じのコメントになりました。 ・あと実稼動時になって、索引の効果や 使われ方もわかってきます。その後にDBチューニングが発生します。 他の方の回答も見てみてください。
guest

0

ベストアンサー

ひとまず、COUNTORYとCOMPANYのそれぞれにインデックスをつければ良いですよ。
COUNTORY_AND_COMPANYのように統合はしない方が良いです。提示のSQLからすると統合の意味がないので。

索引は性能に関わるので真面目に話せば難しくなりますが、
基本的には「人間としても値をグループ化した方が見つけやすいと思う」フィールドが索引対象です。
テーブルの全レコードを総当たりで探すと時間がかかるので、グループ化して番号付ける等して探しやすくしているだけです。

索引を付けるのは、
・参照するテーブルのレコード数がそれなりに大量で
・設計時点でデータのグループ化が分かっている

・実際の処理時間が問題と思える程度に遅い
という時に考えれば良いです。
最初からわかる「最適な索引」というのは実はありません。データが変動するので最適も変わるのです。
また、「最初から付けた索引」が性能を悪くすることもあります。(総当たりの方が結局早い場合とか)
索引の作りすぎは、ディスク使用量増大を招きます。物理ファイルが巨大になると性能も当然落ちます。

androidでSQLiteなら、まずは索引を付けずにTry&Errorが良いと思います。
SQLite自体が軽量・高速ですし、ユーザ数1に対して必要・発生するデータ量は大きくないと思うので。
ちなみにPRODUCT列には索引いりません。結果として得られる値には索引を付けても無駄です。効きません。

蛇足ですが、
性能において大事なのは「最速・最高の効率」ではなく「目的や目標を達成できるか」です。
今回作成されるプログラムにとって問題がない性能が得られたかを計測し、把握できると良いですね。
その情報が、必要となる索引が何かを示してくれる唯一・確かな情報です。

Microsoft Excelのオートフィルタをご存知でしょうか。
ご存知ならば、例に示していただいたテーブルの内容がシートにあるとして、
「U.S.のGoogle」の行だけになるようにフィルタをかけてみてください。
ご自身が操作されたその操作が索引が行っていることです。
索引の付け方を理解する助けになるのではないかと思います。

投稿2018/04/24 18:48

編集2018/04/24 18:52
Hiroshi-Aoki

総合スコア804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問