2

SQLクエリがあります

 SELECT level, data, string, soln, uid 
 FROM user_data 
 WHERE level = 10 AND (timetaken >= 151 AND timetaken <= 217) AND uid != 1
 LIMIT 8852, 1;

150 万のエントリを持つテーブルから取得します。

を使用してインデックスを作成しました

alter table user_data add index a_idx (level, timetaken, uid); 

したがって、私が直面している問題は、クエリに 30 秒以上かかる場合もあれば、0.01 秒未満の場合もあります。

ここでインデックス作成に問題はありますか。

編集:説明クエリの詳細を追加しました

+----+-------------+------------------+-------+---------------+------------+---------+------+-------+--------------------------+
| id | select_type | table            | type  | possible_keys | key        | key_len | ref  | rows  | Extra                    |
+----+-------------+------------------+-------+---------------+------------+---------+------+-------+--------------------------+
|  1 | SIMPLE      | user_data | range | a_idx    | a_idx | 30      | NULL | 24091 | Using where; Using index |
+----+-------------+------------------+-------+---------------+------------+---------+------+-------+--------------------------+

テーブルのデータ フィールドはテキスト フィールドです。ほとんどの場合、その長さは 255 文字を超えています。これにより問題が発生しますか?

4

2 に答える 2

0

まず、EXPLAINを使用してこのクエリの実行プランを取得してみてください。

 EXPLAIN SELECT level, data, string, soln, uid 
 FROM user_data 
 WHERE level = 10 AND (timetaken >= 151 AND timetaken <= 217) AND uid != 1
 LIMIT 8852, 1;

これは、このトピックをフォローするのに最適なスライドです:http: //www.slideshare.net/phpcodemonkey/mysql-explain-explained

別のインデックスを追加してみてください。

  • uidとレベルに1つ
  • 時間のかかる別のもの
于 2013-01-10T11:10:15.203 に答える
0

問題は高いオフセットにあります。8853 番目の結果を選択するために、MySQL はこの前にすべての 8852 行をスキャンする必要があります。

ところで、order by なしで limit を使用すると、予期しない結果が生じる可能性があります。

高オフセットのクエリを高速化するには、since..until ページネーション戦略に移行する必要があります。

于 2013-01-10T13:31:58.007 に答える