Als het je gaat om k rijen en je hebt n rijen die je wilt negeren, dan selecteer je er toch gewoon (k+n) die je vervolgens filtert? Geen extra tabel nodig (nuja, eentje in het geheugen)
dat geeft iets als
SQL:
1
2
3
4
| SELECT * FROM
(SELECT * FROM tabel LIMIT 2) AS t
WHERE t.ID != 1292
LIMIT 1 |
even toegepast op de
page table van enwiki (14842179 rows) geeft dat bijvoorbeeld:
SQL:
1
| select * from (select * from page limit 2) as t where t.page_id!=5 limit 1; |
ook retesnel
en het toont maar weer aan dat je doodstaren op een index niet zinvol is. houd er wel rekening mee dat het niet random is, maar random en databases zijn sowieso slecht verenigbaar
edit: of toch wel een index:
SQL:
1
| select * from (select * from page limit 2) as t where t.page_id!=10 limit 1; |
levert op de pagina AlgeriA, met page_id 5, maar
SQL:
1
| select * from (select page_id, page_namespace, page_title from page limit 2) as t where t.page_id!=10 limit 1; |
levert op pagina !, met page_id 5878274... daar wordt namelijk opeens wél een index gebruikt!
edit2: wacht even hoor, maar
mysql> select * from page where page_id != 1 limit 1;
(...)
1 row in set (0.00 sec)
mysql> explain select * from page where page_id != 1 limit 1;
+----+-------------+-------+-------+---------------+---------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+------+---------+-------------+
| 1 | SIMPLE | page | range | PRIMARY | PRIMARY | 4 | NULL | 3297241 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+------+---------+-------------+
1 row in set (0.00 sec)
is mijn sql-server belachelijk snel of is hier iets anders aan de hand?
[
Voor 66% gewijzigd door
ValHallASW op 22-12-2007 22:09
. Reden: +stukje over enwiki met index, + != is wél snel? ]