2012-03-27 15 views
0

とランダム行を選択するには、基本的に私は客観C - SQLiteは別の値

このデータベースは、行ID(主キー)、テーブルの列として単語と単語の長さが含まれている、単語のデータベースを持っています。

長さ= xのランダムな行を選択して、その行の単語を取得したいとします。

これはiPhoneゲームプロジェクトのためのもので、できるだけ早くクエリを実行することが最優先です(検索はゲームで行われます)。例えば

SELECT * FROM WordsDB WHERE >= (abs(random()) %% (SELECT max(rowid) FROM WordsDB)) LIMIT 1; 

このクエリは、私がクエリに単語の長さを追加した場合しかし、私は問題を取得し、RANDOM()LIMIT 1 BYはるかに高速ORDERよりランダムな行を選択するには本当に速いです:ランダムな行は常に9

の長さを持っていないので、おそらく私はこれを行うの最速/最も効率的な方法だろうと思いまし

SELECT * FROM WordsDB WHERE length = 9 AND rowid >= (abs(random()) %% (SELECT max(rowid) FROM WordsDB)) LIMIT 1 

。お時間を

おかげ

注:それはObjective Cの中で、クエリ文字列として設定されているため、2%記号です。

+0

問題点は何ですか? – hamstergene

答えて

1

ずっと速い:

select * from WordsDB 
where length = 9 
limit (abs(random()) % (select count(rowid) from WordsDB 
         where length = 9)), 1; 

ノートlength = 9をそのwhereの両方の句に表示されます。

遅いと思われる場合はlengthにインデックスを追加してください。

1

このフィールドで選択をしなければならないWordsDB.length

create index if not exists WordsDBLengthIndex on WordsDB (length); 

にインデックスを追加します。この1つは私のために[OK]を動作するようです