более быстрый способ выполнения SELECT WHERE id IN в mysql

Я был в середине проекта uni, когда обнаружил огромную проблему с моей базой данных. Используя wamp и массивную (300 МБ) базу данных, но всего с несколькими таблицами, мои запросы очень медленные :( Все таблицы созданы с помощью движка MyISAM. Все настройки по умолчанию, у меня нет опыта в какой-либо оптимизации. Мне нужно подумать какой-то лучший способ сделать это, но на данный момент мой вопрос заключается в том, что является лучшей заменой для следующего запроса:

SELECT * FROM `payments` WHERE id IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

Я не могу использовать левое соединение или любое подобное решение, которое я нашел здесь, потому что эти идентификаторы (1,2,3,4,5,...) не поступают из базы данных. Пользователь выбирает платежи, которые он хочет удалить, и на следующем экране отображаются детали платежа.

К вашему сведению, в таблице платежей более миллиона записей :)


person Nick Handerson    schedule 15.12.2011    source источник
comment
У вас есть индекс в столбце id? Это, вероятно, помогло бы больше всего (для этого запроса)   -  person codeling    schedule 15.12.2011
comment
300мб это не много. Даже для приложения, работающего в MSWindows. Возможно, если бы вы показали структуру таблицы/индексов, настройки mysqld и предоставили план EXPLAIN, мы смогли бы посоветовать. И то, что данные поступают от пользователя, не означает, что они не могут попасть в базу данных.   -  person symcbean    schedule 15.12.2011


Ответы (1)


Для непрерывного диапазона:

SELECT * FROM payments WHERE id BETWEEN 1 AND 10

Если диапазон не пересекается: создайте индексированную таблицу memory со значениями в ней.

CREATE TABLE mem_table (
  pk unsigned integer primary key
) ENGINE = MEMORY;

INSERT INTO mem_table (pk) VALUES (1),(2),...,(10);

SELECT p.* FROM payments p
INNER JOIN mem_table m ON (m.pk = p.id);

См.: http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html

PS Убедитесь, что у вас есть индекс id (на самом деле это должен быть первичный ключ).

person Johan    schedule 15.12.2011
comment
О, боюсь, я ничего не знаю о таблицах памяти. Я поиграю с ним в ближайшие несколько дней и дам вам знать, если это сработает. Большое спасибо! - person Nick Handerson; 15.12.2011
comment
Ага, этого было достаточно. И теперь я узнал, для чего нужны таблицы памяти :) Большое спасибо. - person Nick Handerson; 17.12.2011