我有一个16K条目的表
我想随机提取44个条目
但我不想重复相同的条目一次(永远)
因此,我有一个按用户列表,它将已经使用的"ID"作为逗号分隔的字符串保存在表中
我用这个列表来选择。。。NOT IN(used_ID)
问题是这个列表太大了,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;
有什么想法吗?
您可以创建一个高表来存储这些值,而不是将使用过的用户Id值放在一列中以逗号分隔的字符串中。这应该会产生更好的性能
与其使用具有(潜在巨大)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)
这会很好地提高你的表现。