MySQL, огромная таблица, ускорение выбрки

123 4
K
На сайте с 01.08.2009
Offline
88
2779

Есть таблица на 500Мб. В ней 2.500.000 записей. Выборка производится по ID (primary key). Движок MyISAM. Выбирается 50 строк запросом "SELECT id, url FROM tbl WHERE id in (4144, 5255, 6656, 9695, ...)".

Буфер для кешироваия ключей настроен (300Мб).

Запрос занимает более 1 секунды.

Выборка одиночной записи занимает в среднем 0.02

Подскажите, как можно ускорить выборку?

igor3310
На сайте с 27.02.2011
Offline
156
#1

На всякий случай проверить - поле ID создает индексы ( хотя ПК уже по умолчанию создает их0 , а так запрос правильный

П.С, а так попробуйте добавить еще 1 поле - типа category_id и по нему выборку делать - должно быстрее работать

Веб разработка WordPress, OpenCart, Modx Revo и прочее - https://searchengines.guru/ru/forum/1040224
K
На сайте с 01.08.2009
Offline
88
#2

primari key - это уже индекс, как я понимаю. Другой индекс по этому полю строить по идеи не нужно.

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

LEOnidUKG
На сайте с 25.11.2006
Offline
1771
#3

1. Попробуйте запустить оптимизацию таблицы

2. Попробуйте в InnoBD перевести таблицу, если пользователей много

3. Если RAM много и в таблицу не нужно ничего добавлять или удалять, а только выборку. То сделайте таблицу типа MEMORY и закиньте туда копию таблицы. Тогда выборка будет практически моментальной

4. Проверьте включен ли вообще кэш запросов

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
Оптимизайка
На сайте с 11.03.2012
Offline
396
#4

создаете таблицу selections (select_id, session_id, ...) с уникальным индексом по (select_id, session_id)

далее

INSERT INTO selections (select_id, session_id) values (4144, xxx), (5255, xxx), (6656, xxx), (9695, xxx);

SELECT tbl.id, url FROM tbl, selections WHERE tbl.id = selections.select_id and selections.session_id = xxx;

DELETE from selections where session_id = xxx;

выглядит глупо, но будет быстрее, особенно если много in (..., ..., ) :D

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
LEOnidUKG
На сайте с 25.11.2006
Offline
1771
#5
выглядит глупо,

Это бред :)

Тоже самое делает обычный кэш mysql. Зачем это воротить :)

kxk
На сайте с 30.01.2005
Offline
990
kxk
#6

kalim, Подключите к проекту SphinxSearch и забудьте о тормозах:)

Ваш DEVOPS
D
На сайте с 14.01.2007
Offline
153
#7
kxk:
SphinxSearch

для выборке по id?🙄

kalim, а что у вас за сервер?

kxk
На сайте с 30.01.2005
Offline
990
kxk
#8

Dinozavr, У меня AMD 2 x Opteron 4386 как минимум, меньшие процессоры не беру:)

Можно и по id Свинксу принципиальной разницы нет, у меня он трудиться в паре с Memcached :)

K
На сайте с 01.08.2009
Offline
88
#9

LEOnidUKG

1. Ok. попробую запустить и почитаю что это делает

2. Пользователь пока что один (запросы идет по одному). Но потом сделаю InnoDB

3. Не получится в MEMORY, есть поле BLOB с бинарными данными 90-150 байт. Но на RAM диске работало очень быстро (проект будет расти, в памяти держать не выйдет)

4. Кеш запросов не поможет. Каждый раз ID разные.

kxk

Про сфинкс почитаю. Хотя мне кажется это не мой случай. Тут не поиск, в просто выборка по ID.

D
На сайте с 14.01.2007
Offline
153
#10

kxk, сфинкс, солр и прочие эластики - это совсем другая опера. И кстати со сфинкса пора переезжать на ElasticSearch;)

123 4

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий