У меня есть простое программное обеспечение для промышленного оборудования, которое использует MySQL в качестве хранилища данных. В данный момент в базе данных только одно соединение и один пользователь.
Моя таблица проста:
id data fetched
int varchar boolean
1 KDINNALSKDGJ 0
2 F34LNALNLIJA 0
et c. Идентификатор всегда последовательный и имеет индекс.
Что мне нужно, так это чтобы всегда получать первые «данные» (с наименьшим идентификатором), где выборка равна 0. Затем обновите «выборка», чтобы она стала «1», потому что Я получил данные.
Я использую что-то вроде
SELECT id, data FROM mytable WHERE fetched=0 LIMIT 0,1
Это работает, но становится последовательно медленнее для каждого вызова. Это моя настоящая проблема. Я могу жить с приблизительными 0,005 секундами для первых 100 или около того, но при 50,000+ я против 0,3 секунд.
Я предполагаю, что это потому, что база данных ищет сверху, каждый раз обнаруживая, что совпадения.
Ограничение индекса по номеру намного быстрее:
SELECT id, data FROM mytable WHERE id> :myLastID and fetched=0 LIMIT 0,1
.. но это также замедляется после 40.000 или около того, при 80.000 я около 20 мсек c (первый около 6 мсек c)
Моя окончательная база данных может быть в миллионах, но обычно может быть около 2-500.000
Есть ли способ сделать MySQL возврат " следующая запись "быстрее? Используя КУРСОР из MySQL?
Я буду использовать Delphi для взаимодействия с MySQL. Я попробовал и хранимую процедуру и используя 2 запроса для выбора / обновления. Почти такой же результат.