Покинул форум
Сообщений всего: 176
Дата рег-ции: Апр. 2011
Помог: 1 раз(а)
Всем привет, есть таблица textbooks размером 1.1 гигабайт
К ней обращаются по такому запросу
select id, title from texbooks where book_id = 112233 and status = 1 order by id desc
индекс стоит на поле book_id.
В последнее время бд начала нехило тормозить, ищу проблему, а этот запрос начал тормозить 1-2 секунды выполнения, вот и решил его исследовать.
должен ли такой запрос выполнятся долго? можно ли как то улучшить запрос?
я думаю, что этот запрос не должен выполнятся долго. вроде, бд должна сначала должна вытащить записи по запросу where book_id = 112233 т.к. на нем индекс, то есть быстро, и по полученным записям сделать вторую выборку status = 1 и их отсортировать order by.
или status = 1 заставит БД пройтись по всей таблице??
БД mysql
Мелкий
Отправлено: 18 Октября, 2016 - 18:52:25
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
explain?
Сколько в таблице записей с таким book_id? Сколько из них с status = 1?
----- PostgreSQL DBA
Еугений
Отправлено: 18 Октября, 2016 - 18:59:57
Частый гость
Покинул форум
Сообщений всего: 176
Дата рег-ции: Апр. 2011
Помог: 1 раз(а)
Мелкий пишет:
explain?Сколько в таблице записей с таким book_id?
По разному. в textbooks хранятся главы книг с текстом, у книги может быть одна глава, а то и 50. Ну в среднем 15 записей по определенному book_id/
Мелкий пишет:
Сколько из них с status = 1?
Я перепутал, status = 0. Это означает глава не удалена, удаленных глав почти нет, но изредка главы удаляются, поэтому и запрос такой. Так что, очень мало. в 99% случаев status = 0, 1% status = 0. (Добавление)
может быть проблема в том, что я неправильно организовал все...
Таблица textbooks содержит столбцы id, title (название главы), text_of_chapter (сам текст главы, иногда там хранится 1мб текста),status.
Запросом, который я привел выше, я просто вытаскиваю оглавление (нужны только title), но не текст. Наверно надо будет эту таблицу разбить на две таблицы: главы; текст главы. Прикреплено изображение (Нажмите для увеличения)
в phpmyadmin использовал Profiler
по id запрос выполняется быстро. sorting result 1.9 s
Вообщем, проверил 10 запросов, затраты на sorting result составляют почти все время (от 0.1 сек до 2 сек). Почему же так долго, может потому большой объем извлекается? некоторые главы в сумме составляют мегабайт текста.
наверно придется отказаться от order by, а сортировку делать средствами php.
есть ли способы это улучшить? Прикреплено изображение (Нажмите для увеличения)
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Это с text полем или без него? В теме уже фигурировали оба запроса, но между ними серьёзная разница.
Для text ещё объяснимо, сортировка датасета с text - это всегда дисковая сортировка. А без него - запрос должен нормально жить.
SELECT id FROM texbooks WHERE book_id = 112233 ANDSTATUS= 1 ORDERBY id DESC
) t STRAIGHT_JOIN texbooks USING(id)
----- PostgreSQL DBA
Еугений
Отправлено: 18 Октября, 2016 - 22:16:46
Частый гость
Покинул форум
Сообщений всего: 176
Дата рег-ции: Апр. 2011
Помог: 1 раз(а)
Мелкий пишет:
Это с text полем или без него? В теме уже фигурировали оба запроса, но между ними серьёзная разница.
Для text ещё объяснимо, сортировка датасета с text - это всегда дисковая сортировка. А без него - запрос должен нормально жить.
ох, точно, тестировал на select * from..., совсем забыл про поля. сам текст не нужен. Стало 0.2 - 0.4 сек - и это тоже на сортировку все время ушло.
Странно, утром и днем наблюдал, что почему то эти запросы были очень долгие 1-2 секунды, и пользователи в последнее время стали жаловаться, что сайт часто начал висеть. Буду искать далее слабые места, спасибо, что помогли, профайлер - вещь, не знал о нем
Мелкий
Отправлено: 18 Октября, 2016 - 22:28:33
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Можно воткнуть индекс book_id & status. С учётом неявной ссылка на PK в innodb получится отличный index scan, включая сортировку.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.