Юрий П.
70 сообщений
#2 года назад
Здравствуйте.
Вопрос к специалистам по mysql.
Подскажите как можно ускорить выборку полей из базы данных, оптимизацией запроса.
Есть таблица на 25 тыс записей весом 180 Мб. С ростом таблицы увеличилось время ответа сервера, страницы стали загружаться дольше.

Запрос выглядит так:
$queryResult = $dbRes->query("SELECT response_y, requested_time_y FROM ya_cache WHERE path_y = '$path_y'"); 

При обращении к таблице производится выборка только одной строки.
Может быть можно запрос как-то оптимизировать?
Артем Л.
11416 сообщений
#2 года назад
Какого типа поле path_y и что в значении $path_y?
Юрий П.
70 сообщений
#2 года назад
Hungry_Hunter,
Сделал скрины для наглядности.
На path_y у меня стоит индекс и первичный ключ, по нему, как я понимаю производится поиск в таблице.
А переменная $path_y передаёт часть адреса канала API, по которому производится выгрузка данных в базу.

Структура таблицы
Список записей
Содержание одной строки
Артем Л.
11416 сообщений
#2 года назад
Мне кажется тут уже особо ничего не придумаешь, кроме как сокращать длину поля path_y.
Вроде все правильно сделано. Когда у меня была подобная проблема я перешел на InnoDB вместо MyISAM. Скорость заметно возрасла.
Также можно рассмотреть вариант деления одной таблицы на несколько (например по месяцам, годам или какому-то другому признаку).
Таким образом таблицы будут меньше и поиск будет идти быстрее.
Еще можно попробовать покопаться в настройках сервера, что-то покрутить, протестировать.
Но тут уже все тонко и надо шарить или хорошенько гуглить.
Юрий П.
70 сообщений
#2 года назад
Hungry_Hunter, По поводу InnoDB вместо MyISAM тоже долго думал, много читал. Тестировал, особого прироста не заметил) Уверены что рост скорости связан с переходом на InnoDB? На ней размер таблицы больше процентов на 30, пишут что MyISAM быстрее...
Андрей Х.
8 сообщений
#2 года назад
1. Как часто выполняются операции удаления из таблицы? Если довольно часто, то помять могла замусориться, нужно делать shrink.
2. Как вариант можно поэкспериментировать с изменинем типа поля CHAR -> NCHAR или NVARCHAR. Char довольно устаревшая конструкция хранения данных в БД.
3. Ещё вариант перестроить индекс, возмно текущая версия посыпалась. Такое бывает.
Юрий П.
70 сообщений
#2 года назад
jaaj_club, 1. Раз в 5 дней через API выгружаются новые данные, старые удаляются. "shrink" в смысле оптимизацию ? Оптимизация таблиц раз в неделю, по крону. Кстати не знаете, можно ли делать оптимизацию таблицам InnoDB? Где-то читал что для InnoDB оптимизация не работает.
2. Можно попробовать поэкспериментировать, спасибо
3. Возможно, нужно пробовать
Артем Л.
11416 сообщений
#2 года назад
yurec2073, надо все пробовать тестировать, замерять скорости. Теории тут явно недостаточно будет.
Ну и да, попробуйте оптимизировать таблицу, перестроить индекс. Но мне кажется это вряд ли поможет.
Поиск по тексту всегда долгая операция.

Вот если бы вы добавили поле с md5 хешем, и делали поиск по нему, а не по полному URL, мне кажется это прибавило бы скорости, т.к. длина поля стала бы 32 вместо 250.

Цитата (yurec2073):
Кстати не знаете, можно ли делать оптимизацию таблицам InnoDB? Где-то читал что для InnoDB оптимизация не работает.
Она там не требуется, все само хорошо работает.
Юрий П.
70 сообщений
#2 года назад
Цитата (Hungry_Hunter):
Вот если бы вы добавили поле с md5 хешем, и делали поиск по нему, а не по полному URL, мне кажется это прибавило бы скорости, т.к. длина поля стала бы 32 вместо 250
Может быть, спасибо за идею
Андрей Х.
8 сообщений
#2 года назад
yurec2073, Цитата (yurec2073):
jaaj_club, 1. Раз в 5 дней через API выгружаются новые данные, старые удаляются. "shrink" в смысле оптимизацию ? Оптимизация таблиц раз в неделю, по крону. Кстати не знаете, можно ли делать оптимизацию таблицам InnoDB? Где-то читал что для InnoDB оптимизация не работает.
2. Можно попробовать поэкспериментировать, спасибо
3. Возможно, нужно пробовать
1. Тогда эту часть можно не трогать
2. Разницы между CHAR и NCHAR особой нет, в плане хранении. Попробуйте создать новую колонку с типом NVARCHAR и туда конвертнуть данные. NVARCHAR использует другой тип памяти. Можно погуглить при желании. Создать индекс по новову полю и попробовать прогнать тесты. 
3. Я бы начал с перестройки индекса. Возможно всё можно решить меньшей кровью.

Удачи!
Юрий П.
70 сообщений
#2 года назад
jaaj_club, Спасибо, попробую
Василий С.
123 сообщения
#2 года назад
Цитата (yurec2073):
При обращении к таблице производится выборка только одной строки.
Я бы  LIMIT 1 добавил