Как можно ускорить выборку полей из базы данных, оптимизацией запроса?
70 сообщений
#3 года назад
Здравствуйте. Вопрос к специалистам по mysql.
Подскажите как можно ускорить выборку полей из базы данных, оптимизацией запроса.
Есть таблица на 25 тыс записей весом 180 Мб. С ростом таблицы увеличилось время ответа сервера, страницы стали загружаться дольше.
Запрос выглядит так:
$queryResult = $dbRes->query("SELECT response_y, requested_time_y FROM ya_cache WHERE path_y = '$path_y'");
При обращении к таблице производится выборка только одной строки.
Может быть можно запрос как-то оптимизировать?
11416 сообщений
#3 года назад
Какого типа поле path_y и что в значении $path_y?
70 сообщений
#3 года назад
Hungry_Hunter, Сделал скрины для наглядности.
На path_y у меня стоит индекс и первичный ключ, по нему, как я понимаю производится поиск в таблице.
А переменная $path_y передаёт часть адреса канала API, по которому производится выгрузка данных в базу.
Структура таблицы ссылка
Список записей ссылка
Содержание одной строки ссылка
11416 сообщений
#3 года назад
Мне кажется тут уже особо ничего не придумаешь, кроме как сокращать длину поля path_y. Вроде все правильно сделано. Когда у меня была подобная проблема я перешел на InnoDB вместо MyISAM. Скорость заметно возрасла.
Также можно рассмотреть вариант деления одной таблицы на несколько (например по месяцам, годам или какому-то другому признаку).
Таким образом таблицы будут меньше и поиск будет идти быстрее.
Еще можно попробовать покопаться в настройках сервера, что-то покрутить, протестировать.
Но тут уже все тонко и надо шарить или хорошенько гуглить.
70 сообщений
#3 года назад
Hungry_Hunter, По поводу InnoDB вместо MyISAM тоже долго думал, много читал. Тестировал, особого прироста не заметил) Уверены что рост скорости связан с переходом на InnoDB? На ней размер таблицы больше процентов на 30, пишут что MyISAM быстрее...
8 сообщений
#3 года назад
1. Как часто выполняются операции удаления из таблицы? Если довольно часто, то помять могла замусориться, нужно делать shrink. 2. Как вариант можно поэкспериментировать с изменинем типа поля CHAR -> NCHAR или NVARCHAR. Char довольно устаревшая конструкция хранения данных в БД.
3. Ещё вариант перестроить индекс, возмно текущая версия посыпалась. Такое бывает.
70 сообщений
#3 года назад
jaaj_club, 1. Раз в 5 дней через API выгружаются новые данные, старые удаляются. "shrink" в смысле оптимизацию ссылка? Оптимизация таблиц раз в неделю, по крону. Кстати не знаете, можно ли делать оптимизацию таблицам InnoDB? Где-то читал что для InnoDB оптимизация не работает.2. Можно попробовать поэкспериментировать, спасибо
3. Возможно, нужно пробовать
11416 сообщений
#3 года назад
yurec2073, надо все пробовать тестировать, замерять скорости. Теории тут явно недостаточно будет. Ну и да, попробуйте оптимизировать таблицу, перестроить индекс. Но мне кажется это вряд ли поможет.
Поиск по тексту всегда долгая операция.
Вот если бы вы добавили поле с md5 хешем, и делали поиск по нему, а не по полному URL, мне кажется это прибавило бы скорости, т.к. длина поля стала бы 32 вместо 250.
Цитата (yurec2073):
Кстати не знаете, можно ли делать оптимизацию таблицам InnoDB? Где-то читал что для InnoDB оптимизация не работает.Она там не требуется, все само хорошо работает.
70 сообщений
#3 года назад
Цитата (Hungry_Hunter):Вот если бы вы добавили поле с md5 хешем, и делали поиск по нему, а не по полному URL, мне кажется это прибавило бы скорости, т.к. длина поля стала бы 32 вместо 250Может быть, спасибо за идею
8 сообщений
#3 года назад
yurec2073, Цитата (yurec2073):jaaj_club, 1. Раз в 5 дней через API выгружаются новые данные, старые удаляются. "shrink" в смысле оптимизацию ссылка? Оптимизация таблиц раз в неделю, по крону. Кстати не знаете, можно ли делать оптимизацию таблицам InnoDB? Где-то читал что для InnoDB оптимизация не работает.1. Тогда эту часть можно не трогать
2. Можно попробовать поэкспериментировать, спасибо
3. Возможно, нужно пробовать
2. Разницы между CHAR и NCHAR особой нет, в плане хранении. Попробуйте создать новую колонку с типом NVARCHAR и туда конвертнуть данные. NVARCHAR использует другой тип памяти. Можно погуглить при желании. Создать индекс по новову полю и попробовать прогнать тесты.
3. Я бы начал с перестройки индекса. Возможно всё можно решить меньшей кровью.
Удачи!