Portál AbcLinuxu, 9. května 2025 18:28
ORDER BY RAND() LIMIT 1jak je na tom takový dotaz s výkonností? Tuším správně, že je to pro výkonnost špatné?
EXPLAIN SELECT * FROM test ORDER BY RANDOM() LIMIT 1; QUERY PLAN ------------------------------------------------------------------------------------- Limit (cost=19755.35..19755.36 rows=1 width=1162) -> Sort (cost=19755.35..20165.12 rows=163906 width=1162) Sort Key: (random()) -> Seq Scan on test (cost=0.00..18935.83 rows=163906 width=1162) (4 rows)
EXPLAIN SELECT * FROM test LIMIT 1 OFFSET RANDOM()*(SELECT COUNT(*) FROM test); QUERY PLAN ------------------------------------------------------------------------------------ Limit (cost=20788.49..20788.60 rows=1 width=1162) InitPlan 1 (returns $0) -> Aggregate (cost=18935.83..18935.84 rows=1 width=0) -> Seq Scan on test (cost=0.00..18526.06 rows=163906 width=0) -> Seq Scan on test (cost=0.00..18526.06 rows=163906 width=1162) (5 rows)Cost prvej možnosti je nižší než druhej.
'COUNT(*)'
a nad jak velkými daty se to dělá.COUNT(*)
.InnoDB: 0.21sec (získání COUNT(*) z toho 0.16 sec) vs. 0.29sec MyISAM: 0.08sec (získání COUNT(*) z toho 0.05 sec) vs. 0.18sec
SELECT MAX(id) FROM Tabulka INTO max
WHILE true:
SELECT * FROM TABULKA WHERE id >= RANDOM() * max INTO rec
SELECT COALESCE(MAX(id),0) FROM TABULKA WHERE id < rec.id INTO prev_id
if RANDOM()<1.0/(rec.id - prev_id):
return rec
Myšlenka je doufám jasná: využiju ID, random udělam na díru, a díry ošětřím tak, že záznam "za dírou"
vrátím jen v patřičném podílu případů, v opačném selektuju znovu.
Nevýhoda je nedeterministický čas.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.