---
title: Случайная сортировка
date: 2007-04-21T10:00
tags: [backend, go, mysql, tech]
---

Mysql позволяет сортировать случайным образом

`SELECT * FROM my_table ORDER BY RAND()`

Проблема в том, что такая сортировка зачастую вовсе не нужна для всей выборки - хочется просто достать случайный элемент из определённого множества, к тому же ORDER BY RAND() достаточно медленный выход из ситуации.

Можно попробовать [делать выборку](http://jan.kneschke.de/projects/mysql/order-by-rand) основываясь на числе элементов в целом и функции RAND():

```sql
SELECT name FROM my_table JOIN (  
SELECT CEIL(RAND() * (  
SELECT MAX(id) FROM my_table  
)) AS randomID  
) AS random_table ON random_table.randomID=my_table.ID
```

На 50000 рядов такой запрос занимает 0.00086 сек.. Сравните с 1.56356 сек обычного варианта ORDER BY RAND().

Недавно [натолкнулся](http://programatica.ru/2008/04/getting-random-records-from-table/) на один интересный вариант:

`select G.*, rand() as RO from GOODS G order by RO`

Вероятно вас заинтересует [случайная сортировка в Postgre](https://kurapov.ee/article/random_order_postgre/), где рассматриваются и другие способы.

## Related

- [MySQL триггеры на страже скорости и целостности](/ru/blog/tech/backend/DB/mysql/mysql-triggery-na-strazhe-skorosti-i-tselostnosti/)
- [Sphinx](/ru/blog/tech/backend/DB/sphinx/)
- [Агрегирование выборки в MongoDB + PHP](/ru/blog/tech/backend/DB/agregirovanie-vyborki-v-mongodb-php/)
