MySql Big Data With Multiple Select [дублировать]

Вместо того, чтобы бросать код на вас, есть два понятия, которые являются ключом к пониманию того, как JS обрабатывает обратные вызовы и асинхронность. (это даже слово?)

Модель цикла события и параллелизма

Есть три вещи, о которых вам нужно знать; Очередь; цикл события и стек

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

while (queue.waitForMessage()) {
   queue.processNextMessage();
}

Как только он получает сообщение для запуска чего-то, он добавляет его в очередь. Очередь - это список вещей, которые ждут выполнения (например, ваш запрос AJAX). Представьте себе это так:

 1. call foo.com/api/bar using foobarFunc
 2. Go perform an infinite loop
 ... and so on

Когда одно из этих сообщений будет исполнено, оно выталкивает сообщение из очереди и создает стек, стек - это все, что нужно выполнить JS для выполнения инструкции в сообщение. Таким образом, в нашем примере ему говорят позвонить foobarFunc

function foobarFunc (var) {
  console.log(anotherFunction(var));
}

. Так что все, что foobarFunc должно выполнить (в нашем случае anotherFunction), будет вставлено в стек. исполняемый, а затем забытый - цикл события затем переместится на следующую вещь в очереди (или прослушивает сообщения)

. Главное здесь - порядок выполнения. Это

КОГДА что-то будет запущено

Когда вы совершаете вызов с использованием AJAX для внешней стороны или выполняете любой асинхронный код (например, setTimeout), Javascript зависит от ответ, прежде чем он сможет продолжить.

Большой вопрос, когда он получит ответ? Ответ в том, что мы не знаем, поэтому цикл событий ждет, когда это сообщение скажет: «Эй, забери меня». Если JS просто ждал этого сообщения синхронно, ваше приложение замерзнет, ​​и оно сосать. Таким образом, JS продолжает выполнение следующего элемента в очереди, ожидая, пока сообщение не будет добавлено обратно в очередь.

Вот почему с асинхронной функциональностью мы используем вещи, называемые обратными вызовами. Это похоже на обещание буквально. Как и в I , обещание что-то вернуть в какой-то момент jQuery использует специальные обратные вызовы, называемые deffered.done deffered.fail и deffered.always (среди других). Вы можете увидеть их все здесь

Итак, вам нужно передать функцию, которая в какой-то момент будет выполнена с переданными ей данными.

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

function foo(bla) {
  console.log(bla)
}

, поэтому большую часть времени (но не всегда) вы пройдете foo не foo()

. Надеюсь, это будет иметь смысл. Когда вы сталкиваетесь с такими вещами, которые кажутся запутанными, я настоятельно рекомендую полностью прочитать документацию, чтобы хотя бы понять ее. Это сделает вас намного лучшим разработчиком.

144
задан Pang 16 March 2015 в 04:43
поделиться

7 ответов

Из документации MySQL :

Предложение LIMIT может использоваться для ограничения количества строк, возвращаемых оператором SELECT. LIMIT принимает один или два числовых аргумента, которые должны быть неотрицательными целочисленными константами (кроме случаев, когда используются подготовленные операторы).

С двумя аргументами первый аргумент указывает смещение первой строки для возврата, а второй указывает максимальное количество возвращаемых строк. Смещение начальной строки равно 0 (не 1):

SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15

Чтобы извлечь все строки из определенного смещения до конца результирующего набора, вы можете использовать некоторое большое количество для второго параметра , Этот оператор извлекает все строки из 96-й строки до последней:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

С помощью одного аргумента значение указывает количество строк, возвращаемых с начала набора результатов:

SELECT * FROM tbl LIMIT 5;     # Retrieve first 5 rows

Другими словами, LIMIT row_count эквивалентен LIMIT 0, row_count.

227
ответ дан thomasrutter 27 August 2018 в 00:00
поделиться

В этом уроке показан отличный способ сделать разбиение на страницы. Эффективное разбиение на страницы с использованием MySQL

Короче говоря, избегайте использования OFFSET или большого LIMIT

11
ответ дан Bao Le 27 August 2018 в 00:00
поделиться

Определите OFFSET для запроса. Например,

стр. 1 - (записи 01-10): offset = 0, limit = 10;

стр. 2 - (записи 11-20) offset = 10, limit = 10 ;

и используйте следующий запрос:

SELECT column FROM table LIMIT {someLimit} OFFSET {someOffset};

пример для страницы 2:

SELECT column FROM table
LIMIT 10 OFFSET 10;
9
ответ дан Danton Heuer 27 August 2018 в 00:00
поделиться

Запрос 1: SELECT * FROM yourtable WHERE id > 0 ORDER BY id LIMIT 500

Запрос 2: SELECT * FROM tbl LIMIT 0,500;

Запрос 1 работает быстрее с малыми или средними записями, если количество записей равно 5000 или выше, результат

Результат для 500 записей:

Query1 принимает 9.9999904632568 миллисекунд

Query2 принимает 19.999980926514 миллисекунд

Результат для 8000 записей:

Query1 принимает 129.99987602234 миллисекунды

Query2 принимает 160.00008583069 миллисекунд

2
ответ дан Huy 27 August 2018 в 00:00
поделиться

Есть литература об этом:

Основная проблема возникает при использовании больших OFFSET s. Они избегают использования OFFSET с различными технологиями, начиная от id диапазона выбора в предложении WHERE, до каких-либо страниц кэширования или предварительного вычисления.

Предлагаются решения при использовании ИНДЕКС, ЛЮК:

15
ответ дан Luchostein 27 August 2018 в 00:00
поделиться

Для эффективности 500 записей, вероятно, не проблема, но если у вас есть миллионы записей, может быть выгодно использовать предложение WHERE для выбора следующей страницы:

SELECT *
FROM yourtable
WHERE id > 234374
ORDER BY id
LIMIT 20

«234374» Вот идентификатор последней записи из предыдущей страницы, которую вы просмотрели.

Это позволит использовать индекс для идентификатора для поиска первой записи. Если вы используете LIMIT offset, 20, вы можете обнаружить, что он становится все медленнее и медленнее, когда вы переходите к концу. Как я уже сказал, это, вероятно, не имеет значения, если у вас всего 200 записей, но это может повлиять на большие результирующие наборы.

Еще одно преимущество этого подхода состоит в том, что если данные изменяются между вызовами, вы не пропустят записи или не получат повторную запись. Это связано с тем, что добавление или удаление строки означает, что смещение всех строк после ее изменения. В вашем случае это, вероятно, не важно - я думаю, ваш пул объявлений не меняется слишком часто, и в любом случае никто не заметит, если они получат одно и то же объявление дважды подряд, но если вы ищете «лучший способ», то это еще одна вещь, которую следует иметь в виду при выборе того, какой подход использовать.

Если вы хотите использовать LIMIT со смещением (и это необходимо, если пользователь переходит непосредственно на страницу 10000 вместо пейджинга через страницы один за другим), то вы можете прочитать эту статью о методах поиска в конце строки , чтобы повысить производительность LIMIT с большим смещением.

85
ответ дан Mark Byers 27 August 2018 в 00:00
поделиться

вы также можете сделать

SELECT SQL_CALC_FOUND_ROWS * FROM tbl limit 0, 20

Счетчик строк оператора select (без ограничения) записывается в одном и том же предложении выбора, так что вам больше не нужно запрашивать размер таблицы , Вы получаете количество строк, используя SELECT FOUND_ROWS ();

4
ответ дан surajz 27 August 2018 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: