4

我有一个包含 16K 条目的表
我想提取随机的 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

您可以创建一个 tall 表来存储它们,而不是将使用的用户 ID 值放在逗号分隔的字符串中的一列中。这应该会产生更好的性能

于 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 回答