как увеличить производительность лимита?, 1, когда?это огромное количество - PullRequest
3 голосов
/ 30 марта 2011

У меня есть ситуация, когда мне нужно использовать огромное количество для лимита. Например,

"select * from a table limit 15824293949,1";

это .... действительно очень медленно. Иногда мой домашний сервер mysql просто умирает.

можно ли сделать это быстрее?

извините, номер был 15824293949 , а не 38975901200

Добавлено:

**Table 'photos' (Sample)**

Photos
img_id img_filename
1       a.jpg
2       b.jpg   
3       c.jpg
4       d.jpg 
5       e.jpg
and so on
select cp1.img_id,cp2.img_id from photos as cp1 cross join photos as cp2 limit ?,1

Как мне получить 15824293949?

У меня 177901 рядов в моей таблице фотографий. Я могу получить общее количество возможных комбинаций, используя

(общее количество строк * общее количество строк) - общее количество строк) / 2

Ответы [ 3 ]

5 голосов
/ 30 марта 2011

MySQL имеет проблемы с огромными смещениями пределов в движке MyISAM, в основном там, где InnoDB оптимизирует это.Существуют различные методы, чтобы заставить MyISAM работать быстрее, но добавьте EXPLAIN перед оператором select, чтобы увидеть, что происходит на самом деле.3 миллиарда строк, сгенерированных из перекрестного соединения, указывают, что проблема заключается в самом соединении, а не в предложении LIMIT.Если вас интересует, как заставить LIMIT работать быстрее, эта ссылка должна предоставить вам достаточно информации.

2 голосов
/ 30 марта 2011

Попробуйте ограничить запрос предложением WHERE для столбца с индексом. E.g.:

SELECT * FROM table WHERE id >= 38975901200 LIMIT 1

Обновление: Я думаю, возможно, вам даже не нужна база данных? Вы можете найти n-ую комбинацию двух изображений, вычислив что-то вроде 15824293949 / 177901 и 15824293949 % 177901. Я полагаю, вы могли бы написать запрос:

SELECT (15824293949 / 177901) AS img_id1, (15824293949 MOD 177901) AS img_id2

Если вы пытаетесь получить их из естественного порядка, в котором они находятся в базе данных (а это не их img_id), то у вас могут возникнуть некоторые проблемы. Это имеет значение? Непонятно, что вы пытаетесь сделать здесь.

1 голос
/ 30 марта 2011

Предположительно, у вас это есть в каком-то сценарии, где причина, по которой вы смотрите на этот конкретный момент, заключается в том, что именно там вы остановились в последний раз.

В идеале, если у вас также есть поле первичного ключа auto_increment (идентификатор), вы можете сохранить это число. Затем просто выберите * из таблицы, где id> last_seen_id limit 1 (возможно, сделайте больше, чем 1 за раз: P)

Вообще говоря, то, что вы просите сделать , должно быть медленным. Дайте что-нибудь для поиска, а не все с ограничением

...