4

16,000 エントリのテーブルがあります。
ランダムな 44 エントリを抽出
したいのですが、同じエントリを (これまでに) 何度も繰り返したくない
ので、既に使用されている「ID」をコンマとして保持するユーザーごとのリストがあります。で区切られたテーブル内の文字列。
そのリストを使用して SELECT ... NOT IN (used_IDs)

問題は、このリストが大きくなりすぎて、サイズが原因で SQL 呼び出しが失敗することです。

それをより便利に行う方法について何か考えはありますか?

Questions table:
+------+-------+-------+
| id   | Qtext | Tags  |
+------+-------+-------+

Test table:
+------+-------+
| id   | QIDs  |
+------+-------+

Results table:
+------+-------+-------+
| id   | tID   | uID   |
+------+-------+-------+

結果テーブルに基づいて質問テーブルから一意のランダム値を選択する必要があります。(テスト ID を質問 ID に関連付けます)

現在使用しようとしています:

SELECT DISTINCT `questions`.`ID`
FROM `questions`, `tests`, `results`
WHERE 
`questions`.`ID` NOT IN (`tests`.`qIDs`)
AND `results`.`uID` = 1 AND `tests`.`ID` = `results`.`tID`
AND 4 IN ( `questions`.`tags`) 
AND "http://www.usmlestep2qna.com" = `provider`
ORDER BY RAND() LIMIT 27;

何か案は?

4

2 に答える 2

1

使用されているユーザー ID 値をカンマ区切りの文字列で 1 つの列に配置する代わりに、tall テーブルを作成して格納することができます。これにより、パフォーマンスが向上するはずです

于 2012-09-15T04:57:58.680 に答える
1

(潜在的に巨大な) CSV で単一の行を使用するのではなく、適切にインデックス付けされたテーブルと外部結合を使用して、一致しないレコードを選択してみませんか。私のテストデータベースの例があります:

mysql> select * from first;
+------+-------+
| id   | title |
+------+-------+
|    1 | aaaa  |
|    2 | bbbb  |
|    3 | cccc  |
|    4 | NULL  |
|    6 | gggg  |
+------+-------+
5 rows in set (0.00 sec)

mysql> select * from second;
+------+----------+------+------+-------+------+
| id   | first_id | one  | two  | three | four |
+------+----------+------+------+-------+------+
|    1 |        1 |    3 |    0 |     4 |    6 |
|    1 |        2 |    4 |    4 |     1 |    2 |
|    3 |        3 |    1 | NULL |     3 |    4 |
+------+----------+------+------+-------+------+
3 rows in set (0.00 sec)

mysql> select a.id from first a join second b on a.id=b.first_id;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

mysql> select a.id from first a 
left outer join second b on a.id=b.first_id where b.first_id is null;
+------+
| id   |
+------+
|    4 |
|    6 |
+------+
2 rows in set (0.00 sec)

これにより、パフォーマンスがかなり向上するはずです。

于 2012-09-15T05:00:24.607 に答える