2

列が1つしかないmysqlテーブルがあり、列には3文字の単語と4文字の単語、および5文字と6文字の単語があります。

最初に3文字の単語すべてからランダムに選択し、それらがすべてなくなったら、4文字の単語に移動するというクエリが必要です。

これは私の質問です:

SELECT `word` FROM `words` ORDER BY LENGTH(`word`) ASC, RAND() LIMIT 1

これまでの数回は期待どおりに動作しますが、常にこのように動作することを確認したいと思います。

4

1 に答える 1

2

クエリは私には問題ないように見えますが、MySQLは毎回すべての行をスキャンし、filesortを使用してすべて単一の行を返すため、テーブルが小さいことを願っています。

関数がインデックスの使用を無効にするため、列を追加しwordlengthてインデックスを作成してもクエリは改善されません。ORDER BY RAND()

単語を長さに応じて別々のテーブルに分割することを検討してください。少なくとも、同じ長さの単語についてはすべての行をスキャンするだけです。最初にthree_letter_wordsテーブルから選択し、結果がない場合は、four_letter_wordsテーブルから選択します。

于 2012-05-02T00:19:25.640 に答える