Използвайки MYSQL, искам да избера
1) 5 случайни реда сред първите 20 реда след поръчка по колона "цена"
2) 15 случайни реда сред 30-те следващи резултата (редове 21-50) след поръчка по колона "цена"
Какъв е най-добрият начин за постигане на тази производителност по отношение на SQL? Моля, обърнете внимание, че таблицата съдържа около 1 000 000 реда.
Крайната цел е да актуализирате колона (SET status = 1) за тези произволно избрани редове.
Отговори:
1 за отговор № 1Използвайте вложени селекции - трябва да бъде доста бързо в тази ситуация
select * from
(
select .... from table
order by price
limit X, Y
)
order by random
Заменете X и Y с подходящите стойности
Имайте предвид, че в зависимост от конкретната RDBMS клаузите "поръчка по случайност" и "лимит" могат да се различават! това е начинът на MySQL.
Най-важното нещо е сървърътнаправете вътрешния избор първо, който ще върне само 20-30 реда (в зависимост от ограничителната клауза) и можете да го подредите в случаен ред във външния избор. Ако индекса на цената е индексиран, това ще бъде достатъчно бързо
1 за отговор № 2
( SELECT dt.*
FROM
( SELECT t.* -- columns you need from the table
FROM tableX AS t -- your table name in place of "tableX"
ORDER BY price DESC
LIMIT 20
OFFSET 0
) AS dt
ORDER BY RAND()
LIMIT 5
)
UNION ALL
(
SELECT dt.*
FROM
( SELECT t.*
FROM tableX AS t
ORDER BY price DESC
LIMIT 30
OFFSET 20
) AS dt
ORDER BY RAND()
LIMIT 15
) ;