более быстрый способ выполнения SELECT ... где идентификатор в ... в MySQL - PullRequest
0 голосов
/ 15 декабря 2011

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

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

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

FYI, таблица платежей содержит более миллиона записей:)

1 Ответ

4 голосов
/ 15 декабря 2011

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

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 (это действительно должен быть первичный ключ).

...