Доброго времени суток дамы и господа! Есть база на 500 000 строк. Сайт работал работал 1.5 года. Буквально несколько дней назад хостинг заблокировал базу. Обратившись в службу поддержки - обвинили в незнании MySQL и обосновали блокировку так. Цитирую: База создает огромные временные файлы, которые мешают работе сервера. Размер фала не меньше 2 гб . Запрос, скорее всего: PHP: SELECT * FROM `page` WHERE id = '61' GROUP BY `id_single` ORDER BY `id` DESC LIMIT 7 ВОПРОС: КАК РАБОТАЕТ MySQL ? MySQL Выбирает строки по критериям??? Или реально по каким то причинам может создавать огромные временные файлы, считывая все строки?
SELECT * FROM `page` WHERE id_cat = '61' GROUP BY `id_single` ORDER BY `id` DESC LIMIT 7 Вот такой запрос ...
Бесплатный шаред хостинг чтоли? Каков размер базы? Как проставлены индексы? Сколько полей в таблице, из которой идет выборка?
Хостинг VDS - Проплаченный по макс - Размер базы 402 мб; "Отдельная база с 1 таблицей" - Кол-во полей 25; "В полях только цифровые значения" Про индексы не понял. Но так скажу. Все записи в одной таблице. У каждой записи id - По категории, внутренней категории, стране, и т.д. т.е. выборка идет по id записи - 7 записей по запросу. И по id параметров создаются. доп запросы. Вопрос в другом. Тех. поддержка утверждает, что любые запросы в "MySQL" - Генерят сначала ВСЕ ЗАПИСИ, а потом из переменной вытаскивают нужные по параметрам - Это так ??? от куда может взяться 2 гб памяти на 1 запрос? Они балаболы ? Или такой запрос не нужен вообще ???
Боюсь, что да. Limit не означает "база, выбирай мне тут данные, а как 7 насчитаешь, стой". Иначе бы группировка и сортировка работали некорректно. Дело в том, что сначала ты выбираешь из этих 402 мегабайт все строки с указанным id, именно вот все, потом все их группируешь, потом все их сортируешь, и только потом просишь базу взять первые 7 результатов из того, что получилось, а остальное отбросить. --- Добавлено --- Зайди в PMA и посмотри explain, должна там быть для этой функции отдельная менюшка, кнопка, не помню что там. Там может быть написано, как решить твои проблемы. --- Добавлено --- А так, потенциальных решений много может быть. Чисто вот из интереса, сколько строк приходится на один id? Судя по размеру таблицы, у тебя там многие тысячи их. Может быть, стоит как-то оптимизировать структуру данных?
индексы нужны, и про нулл тоже почитать стоит до того, как других учить. У тебя запрос подразумевающий много всяких операций прежде, чем удастся сделать искомый ответ. Он потребляет много памяти. Вот тебя и ругают.
Предлагаю не делать межтопиковые беседы. Со стороны смотрится странно и непонятно может быть, кому адресовано. Нуллы пусть будут в топике с нуллами, уверен, автор и его просматривает.
Я самоучка. Этой мой первый форум, где я задал вопрос. Что значит индексы ? И тема с NULL тоже связана. Так как я использую NULL в базе. Вопрос другой. Зачем такой запрос вообще существует и на всех форумах и учебниках пишут именно так ... PHP: SELECT * FROM `page` WHERE id_cat = '61' GROUP BY `id_single` ORDER BY `id` DESC LIMIT 7 Может даже и не нужно выбирать все поля. а сделать выборку по id. Этот запрос везде советуют. Зачем ? Если он неправильный... Оптимизация базы - понятно. Получается, что MySQL не выбирает из конкретной ячейки. База собирается целиком при таком запросе. Получается, что русские программисты заранее направлены на ложный путь. Правильно, нет ?
Что значит неправильный? Он работает? Да. Проблема не в запросе. Проблема в некорректной организации БД. Не знаешь, что такое индексы? Ищи. даже на этом форуме полно инфы. Надо порыться, я где-то выкладывал прям подробные выкладки на эту тему, но, правда, на английском. Нет. Ты обратил внимание, что ты сначала делаешь вывод, а потом просишь подтвердить его верность и уже в последнюю очередь опровергнуть? --- Добавлено --- Во, лови https://php.ru/forum/threads/antipatterny-dlja-bd.59837/ там и на русском есть.
ну, это отдельное искусство оптимизации запросов. У всех задачи разные, и запросы оптимизируют, и даже структуру БД в зависимости от своих ситуаций каждый по-своему. А запрос универсальный. Он правильный. Запрос правильный, с ним всё в порядке. Просто возможно тебе нужно добавить индексы, потом подумать, можно ли как-то что-то ещё улучшить. Но перво-наперво стоит у себя на локалке поднять мускул и гонять запросы в него, и смотреть, что там он делает с ними. Если он делает фулскан, если он много делает временных таблиц, и жрёт кучу памяти - надо что-то крутить в структуре базы и в запросах. это как содержание в книге. позволяет формировать выборку не тормоша данные, а только используя индексы.
Что значит заблокирован? Это ссылка внутри форума. Или заблокированы ссылки что там в постах? Не должны. У меня все нормально работает. Там никаких запрещенных данных нет. Или ты не из России и у тебя другие блокировки? Ну так воспользуся анонимайзером каким-нибудь. Тысячи их. Фригейт поставь в браузер. --- Добавлено --- Спойлер Впредь - если есть какие-то проблемы касательно форума, то либо стучись в личку, либо оставляй жалобу на нужное сообщение. Даже если это сообщение модератора. Пилишь жалобу, описываешь в ней проблему, мол "ссылки не открываются". А там уже будем решать, что к чему. Жалобная кнопка - не инструмент наказания автора сообщения, это инструмент привлечения внимания модеров к сообщению с указанием причины привлечения внимания.
Провайдер блочит. Я посмотрел через анонимайзер. Да, я понял, что такое индексы. У меня так все и сделано. Ну, есть пару вещей которые нужно изменить. В любом случае спасибо. Я понял главное. Цитирую: http://ruhighload.com/post/Работа+с+индексами+в+MySQL Итак, есть две проблемы при чтении данных: Низкая скорость чтения файлов из-за расположения блоков в разных частях диска (фрагментация). Большое количество операций сравнения для поиска нужных данных. Для таких проектов нужен отдельный сервер. А не общий виртуальный. Спасибо. Очень выручили...
По два гига на запрос жрать никакой сервер не выдержит. А если из будет хотя бы пять в секунду? Нужно что-то менять.
Сервис 1.5 года работал. Никаких нагрузок не было. Какие 5 запросов в сек ??????? Здесь на сайте больше 400 роботов пауков лазиет ежедневно. Уже все понятно и так. Тема закрыта. Всем спасибо.
http://poleshuk.ru/indeksy-v-mysql/ ЦИТИРУЮ: Андрей: 05.03.2014 в 5:29 пп unique key- игнорирует значения равные NULL? Т.е. пустоту. А Primary Key не может быть пустотой и используется для уникальных значений допустим идентификаторов в таблицах это поле ID всегда уникально и всего чемуто равно В MySQL Уже есть все кнопочки для создания индекса. Четко подметил Fell-x27 --- Добавлено --- Сразу 2 вопроса решились. Для таких баз нужны и индексы и значения NULL - Все отлично получилось ...
Команда CREATE INDEX в версиях MySQL до 3.22 не выполняет никаких действий. В версии 3.22 и более поздних CREATE INDEX соответствует команде ALTER TABLE в части создания индексов. See section 6.5.4 Синтаксис оператора ALTER TABLE. Следует отметить, что при использовании любой другой опции для ALTER TABLE кроме RENAME, MySQL всегда будет создавать временную таблицу, даже если данные, строго говоря, и не нуждаются в копировании (например, при изменении имени столбца). Мы планируем исправить это в будущем, однако, поскольку ALTER TABLE выполняется не так часто, мы (разработчики MySQL) не считаем эту задачу первоочередной. Для таблиц MyISAM можно увеличить скорость воссоздания индексной части (что является наиболее медленной частью в процессе восстановления таблицы) путем установки переменной myisam_sort_buffer_size достаточно большого значения. ВЫВОД: Для таких проектов нужен свой сервер и своя настройка MySQL
и структура бд, возможно что-то придётся денормализовать. Хотя, если у тебя как ты говоришь нагрузка небольшая, то да, можно тупо памятью решить.